From 47fb693992ffe452d87897e1c19e6d9a7ed00c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Fri, 19 Feb 2021 15:04:33 -0800 Subject: [PATCH 001/223] Add mod --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 4542133..8c7bbb9 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2946,7 +2946,7 @@ if (params.Analyze) { if (params.ncASV) { - + // mopd this process Report_ASV { label 'norm_cpus' From e9eb02c55af18668aa020cd97df340471d2e6136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 24 Feb 2021 09:48:46 -0800 Subject: [PATCH 002/223] Restructure processes. Use cache from DataCheck in Analyze mode --- vAMPirus.nf | 4478 ++++++++++++++++++++++++--------------------------- 1 file changed, 2130 insertions(+), 2348 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 8c7bbb9..a849587 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -471,7 +471,7 @@ if (params.readsTest) { .into{ reads_ch; reads_qc_ch } } -if (params.Analyze) { +if (params.DataCheck || params.Analyze) { println("\n\tRunning vAMPirus Analyze pipeline - This might take a while, check out Nextflow tower (tower.nf) to remotely monitor the run.\n") @@ -546,7 +546,7 @@ if (params.Analyze) { tuple sample_id, file(reads) from reads_qc_ch output: - tuple sample_id, file("*_fastqc.{zip,html}") into fastqc_results_OAS + tuple sample_id, file("*_fastqc.{zip,html}") into fastqc_results script: """ @@ -572,7 +572,7 @@ if (params.Analyze) { output: tuple sample_id, file("*.fastp.{json,html}") into fastp_results tuple sample_id, file("*.filter.fq") into reads_fastp_ch - file("*.csv") into fastp_csv + file("*.csv") into ( fastp_csv_in1, fastp_csv_in2 ) script: """ @@ -613,7 +613,7 @@ if (params.Analyze) { """ bbduk.sh in1=${reads[0]} out=${sample_id}_bb_R1.fastq.gz ftl=${params.defaultFwdTrim} t=${task.cpus} bbduk.sh in=${reads[1]} out=${sample_id}_bb_R2.fastq.gz ftl=${params.defaultRevTrim} t=${task.cpus} - repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz outs=sing.fq repair + repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz outs=sing.fq repair """ } else if ( params.GlobTrim && !params.GlobTrim == "" ) { """ @@ -621,7 +621,7 @@ if (params.Analyze) { RTRIM=\$( echo ${GlobTrim} | cut -f 2 -d "," ) bbduk.sh in=${reads[0]} out=${sample_id}_bb_R1.fastq.gz ftl=\${FTRIM} t=${task.cpus} bbduk.sh in=${reads[1]} out=${sample_id}_bb_R2.fastq.gz ftl=\${RTRIM} t=${task.cpus} - repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz outs=sing.fq repair + repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz outs=sing.fq repair """ } else if ( params.multi && params.primers ) { """ @@ -652,7 +652,7 @@ if (params.Analyze) { tuple sample_id, file(reads) from readsforqc2 output: - tuple sample_id, file("*_fastqc.{zip,html}") into fastqc2_results_OAS + tuple sample_id, file("*_fastqc.{zip,html}") into fastqc2_results script: """ @@ -726,6 +726,7 @@ if (params.Analyze) { } + /* BEfore examples process Length_Filtering { //changed label 'norm_cpus' @@ -752,6 +753,73 @@ if (params.Analyze) { bbduk.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fastq minlength=${params.maxLen} maxlength=${params.maxLen} t=${task.cpus} bbduk.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq bhist=${params.projtag}_all_merged_postFilt_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_postFilt_qualityScore_hist.txt gchist=${params.projtag}_all_merged_postFilt_gcContent_hist.txt aqhist=${params.projtag}_all_merged_postFilt_averageQuaulity_hist.txt lhist=${params.projtag}_all_merged_postFilt_length_hist.txt gcbins=auto """ + }*/ + + process Length_Filtering { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" + + input: + file(reads) from collect_samples_ch + + output: + file("*_merged_preFilt_clean.fastq") into ( mergeforprotcounts, mergeforpcASVaacounts ) + + file("*_merged_preFilt_clean.fasta") into ( nuclCounts_mergedreads_ch, pcASV_mergedreads_ch ) + file("*_merged_clean_Lengthfiltered.fastq") into reads_vsearch2_ch + + file("*preFilt_preClean_baseFrequency_hist.csv") into prefilt_basefreq + file("*preFilt_preClean_qualityScore_hist.csv") into prefilt_qualityscore + file("*preFilt_preClean_gcContent_hist.csv") into prefilt_gccontent + file("*preFilt_preClean_averageQuality_hist.csv") into prefilt_averagequality + file("*preFilt_preClean_length_hist.csv") into prefilt_length + + file("*postFilt_baseFrequency_hist.csv") into postFilt_basefreq + file("*postFilt_qualityScore_hist.csv") into postFilt_qualityscore + file("*postFilt_gcContent_hist.csv") into postFilt_gccontent + file("*postFilt_averageQuaulity_hist.csv") into postFilt_averagequality + file("*postFilt_length_hist.csv") into postFilt_length + + file("reads_per_sample_preFilt_preClean.csv") into reads_per_sample_preFilt + file("read_per_sample_postFilt_postClean.csv") into reads_per_sample_postFilt + + script: + """ + #bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt__preClean_length_hist.txt gcbins=auto + #fastp -i ${reads} -o ${params.projtag}_merged_preFilt_clean.fastq -b ${params.maxLen} -l ${params.minLen} --thread ${task.cpus} -n 1 + #reformat.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_preFilt_clean.fasta t=${task.cpus} + #bbduk.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fastq minlength=${params.maxLen} maxlength=${params.maxLen} t=${task.cpus} + #bbduk.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq bhist=${params.projtag}_all_merged_postFilt_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_postFilt_qualityScore_hist.txt gchist=${params.projtag}_all_merged_postFilt_gcContent_hist.txt aqhist=${params.projtag}_all_merged_postFilt_averageQuaulity_hist.txt lhist=${params.projtag}_all_merged_postFilt_length_hist.txt gcbins=auto + + # from DC + bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt_preClean_length_hist.txt gcbins=auto + for x in *preFilt*hist.txt;do + pre=\$(echo \$x | awk -F ".txt" '{print \$1}') + cat \$x | tr "\t" "," > \${pre}.csv + rm \$x + done + reformat.sh in=${reads} out=${params.projtag}_preFilt_preclean.fasta t=${task.cpus} + echo "sample,reads" >> reads_per_sample_preFilt_preClean.csv + grep ">" ${params.projtag}_preFilt_preclean.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> reads_per_sample_preFilt_preClean.csv + rm ${params.projtag}_preFilt_preclean.fasta + fastp -i ${reads} -o ${params.projtag}_merged_preFilt_clean.fastq -b ${params.maxLen} -l ${params.minLen} --thread ${task.cpus} -n 1 + reformat.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_preFilt_clean.fasta t=${task.cpus} + bbduk.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fastq minlength=${params.maxLen} maxlength=${params.maxLen} t=${task.cpus} + bbduk.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq bhist=${params.projtag}_all_merged_postFilt_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_postFilt_qualityScore_hist.txt gchist=${params.projtag}_all_merged_postFilt_gcContent_hist.txt aqhist=${params.projtag}_all_merged_postFilt_averageQuaulity_hist.txt lhist=${params.projtag}_all_merged_postFilt_length_hist.txt gcbins=auto + for x in *postFilt*hist.txt;do + pre=\$(echo \$x | awk -F ".txt" '{print \$1}') + cat \$x | tr "\t" "," > \${pre}.csv + rm \$x + done + reformat.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fasta t=${task.cpus} + echo "sample,reads" >> read_per_sample_postFilt_postClean.csv + grep ">" ${params.projtag}_merged_clean_Lengthfiltered.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> read_per_sample_postFilt_postClean.csv + """ } process Extract_Uniques { @@ -810,351 +878,330 @@ if (params.Analyze) { // UNTIL HERE DEFAULT - if (params.ncASV) { + if (params.DataCheck) { + + process NucleotideBased_ASV_clustering_DC { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Nucleotide", mode: "copy", overwrite: true, pattern: '*{.csv}' + + input: + file(fasta) from reads_vsearch5_ch + + output: + file("number_per_percentage_nucl.csv") into number_per_percent_nucl_plot + + script: + if (params.datacheckntIDlist) { + """ + for id in `echo ${params.datacheckntIDlist} | tr "," "\\n"`;do + vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel OTU --id \${id} + done + for x in *ncASV*.fasta;do + id=\$( echo \$x | awk -F "_ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + numb=\$( grep -c ">" \$x ) + echo "\${id},\${numb}" >> number_per_percentage_nucl.csv + done + yo=\$(grep -c ">" ${fasta}) + echo "1.0,\${yo}" >> number_per_percentage_nucl.csv + """ + } + } + + if (params.sing) { + + process Translating_For_ProteinClustering_DC { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true - process NucleotideBased_ASV_clustering { + input: + file(fasta) from nucl2aa + + output: + file("*ASVprotforclust.fasta") into clustering_aa + file("*_translation_report") into reportaa_VR + file("*_ASV_all.fasta") into asvfastaforaaclust + + script: + """ + conda init && source activate virtualribosome + + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report + cp ${fasta} ${params.projtag}_ASV_all.fasta + + """ + + } + + } else { + + process Translation_For_ProteinBased_Clustering_DC { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ncASV", mode: "copy", overwrite: true, pattern: '*ncASV*.fasta' + conda 'python=2.7' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true input: - file(fasta) from reads_vsearch5_ch + file(fasta) from nucl2aa output: - tuple file("*_ncASV*.fasta"), file("*ASV.fasta") into ( nuclFastas_forDiamond_ch, nuclFastas_forCounts_ch, nuclFastas_forMatrix_ch) - tuple file("*_ncASV*.fasta"), file("*ASV.fasta") into nuclFastas_forphylogeny + file("*ASVprotforclust.fasta") into clustering_aa + file("*_translation_report") into reportaa_VR + file("*_ASV_all.fasta") into asvfastaforaaclust script: - if (params.clusterNuclIDlist) { """ - cp ${fasta} ./${params.projtag}_ASV.fasta - for id in `echo ${params.clusterNuclIDlist} | tr "," "\\n"`;do - vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id \${id} - done - """ - } else if (params.clusterNuclID) { + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report + cp ${fasta} ${params.projtag}_ASV_all.fasta """ - cp ${fasta} ./${params.projtag}_ASV.fasta - id=${params.clusterNuclID} - vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id \${id} - """ - } - } - } else { - reads_vsearch5_ch - .into{ nuclFastas_forDiamond_ch; nuclFastas_forCounts_ch; nuclFastas_forphylogeny; nuclFastas_forMatrix_ch } - } - - if (!params.skipTaxonomy) { - - if (params.ncASV) { + } + } - process Nucleotide_Taxonomy_Inference { + process Protein_clustering_DC { - label 'high_cpus' + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy", mode: "copy", overwrite: true, pattern: '*ncASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*ncASV*dmd.out' + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid", mode: "copy", overwrite: true, pattern: '*{.csv}' input: - tuple file(notus), file(asvs) from nuclFastas_forDiamond_ch + file(fasta) from clustering_aa + file(asvs) from asvfastaforaaclust output: - file("*.fasta") into tax_labeled_fasta - tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond - file("*ncASV*summary_for_plot.csv") into taxplot1a - file("*_ASV*_summary_for_plot.csv") into taxplot1 + file("number_per_percentage_prot.csv") into number_per_percent_prot_plot script: + // add awk script to count seqs """ + set +e cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - for filename in ${notus};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - j=1 - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - echo "[ncASV#]" > otu.list - echo "[ncASV sequence length]" > length.list - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done + for id in `echo ${params.datacheckaaIDlist} | tr "," "\\n"`;do + if [ \${id} == ".55" ];then + word=3 + elif [ \${id} == ".65" ];then + word=4 + else + word=5 fi - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list + awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta + cd-hit -i ${params.projtag}_filtered_proteins.fasta -n \${word} -c \${id} -o ${params.projtag}_pcASV\${id}.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr + grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list + y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) + echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr + t=1 + b=1 + for x in \$(cat temporaryclusters.list);do + echo "Extracting \$x" + name="\$( echo \$x | awk -F ">" '{print \$2}')" + clust="pcASV"\${t}"" + echo "\${name}" + awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list + t=\$(( \${t}+1 )) + b=\$(( \${b}+1 )) done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " - done - for filename in ${asvs};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - j=1 - if [ `echo \${filename} | grep -c "ASV"` -eq 1 ];then - for s in \$(cat seqids.lst);do - echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" + ls *_tmp.list + u=1 + for x in *_tmp.list;do + name="\$(echo \$x | awk -F "_p" '{print \$1}')" + echo "\${name}" + cluster="\$(echo \$x | awk -F "_" '{print \$3}')" + echo "\${cluster}" + grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list + seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta + vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta + grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list + for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do + echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders + u=\$(( \${u}+1 )) done - fi - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list + u=1 + ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta + done + cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv + grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list + j=1 + for x in \$(cat lala.list);do + echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list + echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv + j=\$(( \${j}+1 )) + done + rm lala.list + awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list + for x in \$(cat tmporder.list);do + grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " + paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv + ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta + stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true + stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta + else + rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta + fi + rm *.list + rm Cluster* + rm *types* + rm *tmp* + rm ${params.projtag}_pcASV\${id}.fast* + done + for x in *aminoacid*noTaxonomy.fasta;do + id=\$( echo \$x | awk -F "_noTax" '{print \$1}' | awk -F "pcASV" '{print \$2}') + numb=\$( grep -c ">" \$x) + echo "\${id},\${numb}" >> number_per_percentage_protz.csv + done + yesirr=\$( wc -l number_per_percentage_protz.csv | awk '{print \$1}') + tail -\$(( \${yesirr}-1 )) number_per_percentage_protz.csv > number_per_percentage_prot.csv + head -1 number_per_percentage_protz.csv >> number_per_percentage_prot.csv + rm number_per_percentage_protz.csv + """ + } + + process combine_csv_DC { + + input: + file(csv) from fastp_csv_in1 + .collect() + + output: + file("final_reads_stats.csv") into fastp_csv_dc + + script: + """ + cat ${csv} >all_reads_stats.csv + head -n1 all_reads_stats.csv >tmp.names.csv + cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv + cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv + rm tmp.names.csv tmp.reads.stats.csv + """ + + } + + process Report_DataCheck { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Report", mode: "copy", overwrite: true, pattern: '*.{html}' + + input: + file(fastpcsv) from fastp_csv_dc + file(reads_per_sample_preFilt) from reads_per_sample_preFilt + file(read_per_sample_postFilt) from reads_per_sample_postFilt + file(preFilt_baseFrequency) from prefilt_basefreq + file(postFilt_baseFrequency) from postFilt_basefreq + file(preFilt_qualityScore) from prefilt_qualityscore + file(postFilt_qualityScore) from postFilt_qualityscore + file(preFilt_gcContent) from prefilt_gccontent + file(postFilt_gcContent) from postFilt_gccontent + file(preFilt_averageQuality) from prefilt_averagequality + file(postFilt_averageQuaulity) from postFilt_averagequality + file(preFilt_length) from prefilt_length + file(postFilt_length) from postFilt_length + file(number_per_percentage_nucl) from number_per_percent_nucl_plot + file(number_per_percentage_prot) from number_per_percent_prot_plot + + output: + file("*.html") into datacheckreport + + script: + """ + cp ${params.vampdir}/bin/vAMPirus_DC_Report.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_DC_Report.Rmd',output_file='${params.projtag}_DataCheck_Report.html')" ${params.projtag} \ + ${fastpcsv} \ + ${reads_per_sample_preFilt} \ + ${read_per_sample_postFilt} \ + ${preFilt_baseFrequency} \ + ${postFilt_baseFrequency} \ + ${preFilt_qualityScore} \ + ${postFilt_qualityScore} \ + ${preFilt_averageQuality} \ + ${postFilt_averageQuaulity} \ + ${preFilt_length} \ + ${postFilt_length} \ + ${number_per_percentage_nucl} \ + ${number_per_percentage_prot} + """ + } + + } else if (params.Analyze) { + + if (params.ncASV) { + + process NucleotideBased_ASV_clustering { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ncASV", mode: "copy", overwrite: true, pattern: '*ncASV*.fasta' + + input: + file(fasta) from reads_vsearch5_ch + + output: + tuple file("*_ncASV*.fasta"), file("*ASV.fasta") into ( nuclFastas_forDiamond_ch, nuclFastas_forCounts_ch, nuclFastas_forMatrix_ch) + tuple file("*_ncASV*.fasta"), file("*ASV.fasta") into nuclFastas_forphylogeny + + script: + if (params.clusterNuclIDlist) { + """ + cp ${fasta} ./${params.projtag}_ASV.fasta + for id in `echo ${params.clusterNuclIDlist} | tr "," "\\n"`;do + vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id \${id} done - rm headers.list + """ + } else if (params.clusterNuclID) { + """ + cp ${fasta} ./${params.projtag}_ASV.fasta + id=${params.clusterNuclID} + vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id \${id} """ } + } + } else { + reads_vsearch5_ch + .into{ nuclFastas_forDiamond_ch; nuclFastas_forCounts_ch; nuclFastas_forphylogeny; nuclFastas_forMatrix_ch } + } - } else { + if (!params.skipTaxonomy) { - process ASV_Taxonomy_Inference { + if (params.ncASV) { + + process Nucleotide_Taxonomy_Inference { label 'high_cpus' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy", mode: "copy", overwrite: true, pattern: '*ncASV*.{fasta,csv,tsv}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*ncASV*dmd.out' input: - file(reads) from nuclFastas_forDiamond_ch + tuple file(notus), file(asvs) from nuclFastas_forDiamond_ch output: file("*.fasta") into tax_labeled_fasta tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond + file("*ncASV*summary_for_plot.csv") into taxplot1a file("*_ASV*_summary_for_plot.csv") into taxplot1 + script: """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} grep ">" \${virdb} > headers.list headers="headers.list" - for filename in ${reads};do + for filename in ${notus};do name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" @@ -1169,8 +1216,8 @@ if (params.Analyze) { touch new_"\$name"_asvnames.txt j=1 if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list + echo "[ncASV#]" > otu.list + echo "[ncASV sequence length]" > length.list for s in \$(cat seqids.lst);do echo "Checking for \$s hit in diamond output" if [[ ${params.refseq} == "T" ]];then @@ -1191,7 +1238,7 @@ if (params.Analyze) { echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt j=\$((\$j+1)) echo "\$s done." else @@ -1207,7 +1254,7 @@ if (params.Analyze) { echo "NO_HIT" >> length.list virus="NO" gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt j=\$((\$j+1)) echo "\$s done." fi @@ -1229,7 +1276,7 @@ if (params.Analyze) { echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt j=\$((\$j+1)) echo "\$s done." else @@ -1245,25 +1292,68 @@ if (params.Analyze) { echo "NO_HIT" >> length.list virus="NO" gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt j=\$((\$j+1)) echo "\$s done." fi fi echo "Done with \$s" - done - else - for s in \$(cat seqids.lst);do - echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list + done + fi + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm *asvnames.txt + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: \${filename} " + done + for filename in ${asvs};do + name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') + diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + j=1 + if [ `echo \${filename} | grep -c "ASV"` -eq 1 ];then + for s in \$(cat seqids.lst);do + echo "[ASV#]" > otu.list + echo "[ASV sequence length]" > length.list + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list echo "\$acc" >> access.list line="\$(grep -w "\$s" "\$name"_dmd.out)" echo "\$line" | awk '{print \$10}' >> evalue.list @@ -1334,7 +1424,7 @@ if (params.Analyze) { echo "\$s done." fi fi - echo "Done with \$s" + echo "Done with \$s" done fi echo "Now editing "\$name" fasta headers" @@ -1367,811 +1457,1121 @@ if (params.Analyze) { done rm headers.list """ - } - } - } - - if (params.ncASV) { - - process Generate_Counts_Tables_Nucleotide { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*_ASV*.{biome,csv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Counts", mode: "copy", overwrite: true, pattern: '*ncASV*.{biome,csv}' - - input: - tuple file(notus), file(asvs) from nuclFastas_forCounts_ch - file(merged) from nuclCounts_mergedreads_ch - - output: - tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch - file("*ncASV*counts.csv") into notu_counts_plots - file("*_ASV*counts.csv") into asv_counts_plots + } - script: - """ - for filename in ${notus};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - fi - done - if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - fi - """ - } - } else { - process Generate_ASV_Counts_Tables { + } else { - label 'norm_cpus' + process ASV_Taxonomy_Inference { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*ASV*.{biome,csv}' + label 'high_cpus' - input: - file(asvs) from nuclFastas_forCounts_ch - file(merged) from nuclCounts_mergedreads_ch + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' - output: - tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch - file("*_ASV*counts.csv") into asv_counts_plots + input: + file(reads) from nuclFastas_forDiamond_ch - script: - """ - if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - fi - """ + output: + file("*.fasta") into tax_labeled_fasta + tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond + file("*_ASV*_summary_for_plot.csv") into taxplot1 + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + for filename in ${reads};do + name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') + diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + j=1 + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + echo "[ASV#]" > otu.list + echo "[ASV sequence length]" > length.list + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" + done + else + for s in \$(cat seqids.lst);do + echo "[ASV#]" > otu.list + echo "[ASV sequence length]" > length.list + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" + done + fi + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm *asvnames.txt + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: \${filename} " + done + rm headers.list + """ + } } } - if (params.ncASV) { + if (params.ncASV) { - process Generate_Nucleotide_Matrix { + process Generate_Counts_Tables_Nucleotide { - label 'low_cpus' + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*_ASV*PercentID.matrix' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Matrix", mode: "copy", overwrite: true, pattern: '*ncASV*PercentID.matrix' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*_ASV*.{biome,csv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Counts", mode: "copy", overwrite: true, pattern: '*ncASV*.{biome,csv}' - input: - tuple file(notus), file(asvs) from nuclFastas_forMatrix_ch + input: + tuple file(notus), file(asvs) from nuclFastas_forCounts_ch + file(merged) from nuclCounts_mergedreads_ch - output: - file("*.matrix") into clustmatrices - file("*ncASV*PercentID.matrix") into notu_heatmap - file("*_ASV*PercentID.matrix") into asv_heatmap + output: + tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch + file("*ncASV*counts.csv") into notu_counts_plots + file("*_ASV*counts.csv") into asv_counts_plots - script: - // remove if statement later (no fin) - """ - for filename in ${notus};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix + script: + """ + for filename in ${notus};do + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv + fi done - fi - done - if [ `echo ${asvs} | grep -c "_ASV"` -eq 1 ];then - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - clustalo -i ${asvs} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i ${asvs} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - fi - """ - } - } else { - - process Generate_ASV_Matrix { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*ASV*PercentID.matrix' - - input: - file(reads) from nuclFastas_forMatrix_ch - - output: - file("*.matrix") into clustmatrices - file("*_ASV*PercentID.matrix") into asv_heatmap - - script: - // remove if statement later (no fin) - """ - for filename in ${reads};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - else - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done + if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv fi - done - """ + """ } - } - - if (!params.skipPhylogeny) { // need to edit paths - - if (params.ncASV) { - - process Nucleotide_Phylogeny { + } else { + process Generate_ASV_Counts_Tables { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ncASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ncASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ncASV*iq*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*_ASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*_ASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*_ASV*iq*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*ASV*.{biome,csv}' input: - tuple file(notus), file(asvs) from nuclFastas_forphylogeny + file(asvs) from nuclFastas_forCounts_ch + file(merged) from nuclCounts_mergedreads_ch output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results - file("*iq.treefile") into nucl_phyl_plot + tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch + file("*_ASV*counts.csv") into asv_counts_plots script: """ - for filename in ${notus};do - pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - fi - done - for filename in ${asvs};do - pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - done + if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv + fi """ + } } - } else { - process ASV_Phylogeny { + if (params.ncASV) { - label 'norm_cpus' + process Generate_Nucleotide_Matrix { + + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*_ASV*PercentID.matrix' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Matrix", mode: "copy", overwrite: true, pattern: '*ncASV*PercentID.matrix' input: - file(asvs) from nuclFastas_forphylogeny + tuple file(notus), file(asvs) from nuclFastas_forMatrix_ch output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results - file("*iq.treefile") into nucl_phyl_plot + file("*.matrix") into clustmatrices + file("*ncASV*PercentID.matrix") into notu_heatmap + file("*_ASV*PercentID.matrix") into asv_heatmap script: + // remove if statement later (no fin) """ - for filename in ${asvs};do - pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + for filename in ${notus};do + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done fi done + if [ `echo ${asvs} | grep -c "_ASV"` -eq 1 ];then + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + clustalo -i ${asvs} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i ${asvs} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + fi """ - } - } - } + } + } else { - if (!params.skipAminoTyping) { + process Generate_ASV_Matrix { - if (params.sing) { + label 'low_cpus' - process Translating_For_Aminotypes { + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*ASV*PercentID.matrix' - label 'low_cpus' + input: + file(reads) from nuclFastas_forMatrix_ch - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true + output: + file("*.matrix") into clustmatrices + file("*_ASV*PercentID.matrix") into asv_heatmap - input: - file(fasta) from asvsforAminotyping + script: + // remove if statement later (no fin) + """ + for filename in ${reads};do + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + else + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + fi + done + """ + } + } - output: - file("${params.projtag}_all_translations.fasta") into amintypegen - file("${params.projtag}_translation_report") into proteinstage_vap_report + if (!params.skipPhylogeny) { // need to edit paths + + if (params.ncASV) { + + process Nucleotide_Phylogeny { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ncASV*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ncASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ncASV*iq*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*_ASV*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*_ASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*_ASV*iq*' + + input: + tuple file(notus), file(asvs) from nuclFastas_forphylogeny + + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results + file("*iq.treefile") into nucl_phyl_plot + + script: + """ + for filename in ${notus};do + pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + # Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + fi + done + for filename in ${asvs};do + pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + # Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + done + """ + } + } else { + + process ASV_Phylogeny { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ASV*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' + + input: + file(asvs) from nuclFastas_forphylogeny + + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results + file("*iq.treefile") into nucl_phyl_plot + + script: + """ + for filename in ${asvs};do + pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + # Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + done + """ + } + } + } - script: - """ - conda init && source activate virtualribosome + if (!params.skipAminoTyping) { - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report - """ + if (params.sing) { - } + process Translating_For_Aminotypes { - } else { + label 'low_cpus' - process Translate_For_AminoTyping { + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true - label 'low_cpus' + input: + file(fasta) from asvsforAminotyping - conda 'python=2.7' + output: + file("${params.projtag}_all_translations.fasta") into amintypegen + file("${params.projtag}_translation_report") into proteinstage_vap_report - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true + script: + """ + conda init && source activate virtualribosome - input: - file(fasta) from asvsforAminotyping + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report + """ - output: - file("${params.projtag}_all_translations.fasta") into amintypegen - file("${params.projtag}_translation_report") into proteinstage_vap_report + } - script: - """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report - """ - } + } else { - } + process Translate_For_AminoTyping { - process Generate_AminoTypes { + label 'low_cpus' - label 'norm_cpus' + conda 'python=2.7' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Problematic", mode: "copy", overwrite: true, pattern: '*problematic*.{fasta}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes", mode: "copy", overwrite: true, pattern: '*AminoTypes_noTaxonomy.{fasta}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true - input: - file(prot) from amintypegen - file(asvs) from asvaminocheck + input: + file(fasta) from asvsforAminotyping - output: - tuple file("*.fasta"), file("${params.projtag}_AminoTypes.clstr"), file("${params.projtag}_AminoType_summary_map.csv"), file("${params.projtag}_clustered.gc") into ( supplementalfiles ) - file("${params.projtag}_AminoTypes_noTaxonomy.fasta") into ( aminotypesCounts, aminotypesMafft, aminotypesClustal, aminotypesBlast, aminotypesEmboss ) + output: + file("${params.projtag}_all_translations.fasta") into amintypegen + file("${params.projtag}_translation_report") into proteinstage_vap_report - script: - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_filtered_translations.fasta - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_problematic_nucleotides.fasta - else - rm ${params.projtag}_problematic_translations.fasta - fi - cd-hit -i ${params.projtag}_filtered_translations.fasta -c 1.0 -o ${params.projtag}_unlabeled_types.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_unlabeled_types.fasta.clstr >${params.projtag}_AminoTypes.clstr - grep ">Cluster_" ${params.projtag}_AminoTypes.clstr >tmpclusters.list - grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," tmpclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_unlabeled_types.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_AminoType\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_AminoType\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," tmpclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_AminoType_summary_map.csv - rm tmp* - ./rename_seq.py ${params.projtag}_unlabeled_types.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_AminoTypes_noTaxonomy.fasta - stats.sh in=${params.projtag}_AminoTypes_noTaxonomy.fasta gc=${params.projtag}_clustered.gc gcformat=4 - """ - } + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report + """ + } + } - process Generate_AminoType_Matrix { + process Generate_AminoTypes { - label 'low_cpus' + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Matrix", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Problematic", mode: "copy", overwrite: true, pattern: '*problematic*.{fasta}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes", mode: "copy", overwrite: true, pattern: '*AminoTypes_noTaxonomy.{fasta}' - input: - file(prot) from aminotypesClustal + input: + file(prot) from amintypegen + file(asvs) from asvaminocheck - output: - file("*.matrix") into proclustmatrices - file("*PercentID.matrix") into aminotype_heatmap + output: + tuple file("*.fasta"), file("${params.projtag}_AminoTypes.clstr"), file("${params.projtag}_AminoType_summary_map.csv"), file("${params.projtag}_clustered.gc") into ( supplementalfiles ) + file("${params.projtag}_AminoTypes_noTaxonomy.fasta") into ( aminotypesCounts, aminotypesMafft, aminotypesClustal, aminotypesBlast, aminotypesEmboss ) - script: - """ - name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') - clustalo -i ${prot} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} - clustalo -i ${prot} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$(( \$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - """ - } + script: + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_filtered_translations.fasta + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_problematic_nucleotides.fasta + else + rm ${params.projtag}_problematic_translations.fasta + fi + cd-hit -i ${params.projtag}_filtered_translations.fasta -c 1.0 -o ${params.projtag}_unlabeled_types.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_unlabeled_types.fasta.clstr >${params.projtag}_AminoTypes.clstr + grep ">Cluster_" ${params.projtag}_AminoTypes.clstr >tmpclusters.list + grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + paste -d"," tmpclusters.list tmphead.list >tmp.info.csv + grep ">" ${params.projtag}_unlabeled_types.fasta >lala.list + j=1 + for x in \$(cat lala.list);do + echo ">${params.projtag}_AminoType\${j}" >>${params.projtag}_aminoheaders.list + echo "\${x},>${params.projtag}_AminoType\${j}" >>tmpaminotype.info.csv + j=\$(( \${j}+1 )) + done + rm lala.list + awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list + for x in \$(cat tmporder.list);do + grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list + done + paste -d "," tmpclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_AminoType_summary_map.csv + rm tmp* + ./rename_seq.py ${params.projtag}_unlabeled_types.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_AminoTypes_noTaxonomy.fasta + stats.sh in=${params.projtag}_AminoTypes_noTaxonomy.fasta gc=${params.projtag}_clustered.gc gcformat=4 + """ + } - if (!params.skipEMBOSS) { + process Generate_AminoType_Matrix { - process AminoType_EMBOSS_Analyses { + label 'low_cpus' - label 'low_cpus' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Matrix", mode: "copy", overwrite: true - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' + input: + file(prot) from aminotypesClustal - input: - file(prot) from aminotypesEmboss + output: + file("*.matrix") into proclustmatrices + file("*PercentID.matrix") into aminotype_heatmap - output: - tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into amino_emboss + script: + """ + name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') + clustalo -i ${prot} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} + clustalo -i ${prot} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$(( \$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + """ + } - script: - """ - name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') - garnier -sequence ${prot} -outfile \${name}_2dStructures.garnier - hmoment -seqall ${prot} -graph svg -plot - mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg - iep -sequence ${prot} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep - mv iep.svg ./"\${name}"_IsoelectricPoint.svg - pepstats -sequence ${prot} -outfile \${name}_ProteinProperties.pepstats - grep ">" ${prot} | awk -F ">" '{print \$2}' > tmpsequence.list - for x in \$(cat tmpsequence.list);do - echo \$x > tmp1.list - seqtk subseq ${prot} tmp1.list > tmp2.fasta - len=\$(tail -1 tmp2.fasta | awk '{print length}') - pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo - mv pepinfo.svg ./"\$x"_PropertiesPlot.svg - cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo - rm "\$x"_PropertiesPlot.pepinfo - pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepnet.svg ./"\$x"_HelicalNet.svg - pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepwheel.svg ./"\$x"_HelicalWheel.svg - rm tmp1.list tmp2.fasta - done - rm tmpsequence.list - """ + if (!params.skipEMBOSS) { + + process AminoType_EMBOSS_Analyses { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' + + input: + file(prot) from aminotypesEmboss + + output: + tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into amino_emboss + + script: + """ + name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') + garnier -sequence ${prot} -outfile \${name}_2dStructures.garnier + hmoment -seqall ${prot} -graph svg -plot + mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg + iep -sequence ${prot} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep + mv iep.svg ./"\${name}"_IsoelectricPoint.svg + pepstats -sequence ${prot} -outfile \${name}_ProteinProperties.pepstats + grep ">" ${prot} | awk -F ">" '{print \$2}' > tmpsequence.list + for x in \$(cat tmpsequence.list);do + echo \$x > tmp1.list + seqtk subseq ${prot} tmp1.list > tmp2.fasta + len=\$(tail -1 tmp2.fasta | awk '{print length}') + pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo + mv pepinfo.svg ./"\$x"_PropertiesPlot.svg + cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo + rm "\$x"_PropertiesPlot.pepinfo + pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepnet.svg ./"\$x"_HelicalNet.svg + pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepwheel.svg ./"\$x"_HelicalWheel.svg + rm tmp1.list tmp2.fasta + done + rm tmpsequence.list + """ + } } - } - if (!params.skipTaxonomy) { + if (!params.skipTaxonomy) { - process AminoType_Taxonomy_Inference { + process AminoType_Taxonomy_Inference { - label 'high_cpus' + label 'high_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*TaxonomyLabels.fasta' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*TaxonomyLabels.fasta' - input: - file(reads) from aminotypesBlast + input: + file(reads) from aminotypesBlast - output: - tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond - file("*_summary_for_plot.csv") into taxplot2 - file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 + output: + tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond + file("*_summary_for_plot.csv") into taxplot2 + file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 - script: - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} >> headers.list - headers="headers.list" - name=\$(ls ${reads} | awk -F "_noTaxonomy" '{print \$1}') - diamond blastp -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" >access.list - echo "[pcASV sequence length]" >length.list - echo "[e-value]" >evalue.list - echo "[Bitscore]" >bit.list - echo "[Percent ID (aa)]" >pid.list - echo "[AminoType#]" >otu.list - echo "[Virus ID]" >"\$name"_virus.list - echo "[Gene]" >"\$name"_genes.list - grep ">" ${reads} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - j=1 - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">AminoType\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">AminoType\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >>otu.list - echo "\$acc" >>access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') - echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list - echo ">AminoType\${j}_"\$virus"_"\$gene"" >>new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >>otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">AminoType\${j}_"\$virus"_"\$gene"" >>new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${reads} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst headers.list otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: ${reads} " - """ - } - } + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} >> headers.list + headers="headers.list" + name=\$(ls ${reads} | awk -F "_noTaxonomy" '{print \$1}') + diamond blastp -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" >access.list + echo "[pcASV sequence length]" >length.list + echo "[e-value]" >evalue.list + echo "[Bitscore]" >bit.list + echo "[Percent ID (aa)]" >pid.list + echo "[AminoType#]" >otu.list + echo "[Virus ID]" >"\$name"_virus.list + echo "[Gene]" >"\$name"_genes.list + grep ">" ${reads} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + j=1 + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">AminoType\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">AminoType\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >>otu.list + echo "\$acc" >>access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') + echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list + echo ">AminoType\${j}_"\$virus"_"\$gene"" >>new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >>otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">AminoType\${j}_"\$virus"_"\$gene"" >>new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${reads} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst headers.list otu.list ; + rm *asvnames.txt + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: ${reads} " + """ + } + } - if (!params.skipPhylogeny) { + if (!params.skipPhylogeny) { - process AminoType_Phylogeny { + process AminoType_Phylogeny { - label 'norm_cpus' + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - input: - file(prot) from aminotypesMafft + input: + file(prot) from aminotypesMafft - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.log"), file("*iq*"), file("*mt*") into alignprot_results - file("*iq.treefile") into amino_rax_plot + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.log"), file("*iq*"), file("*mt*") into alignprot_results + file("*iq.treefile") into amino_rax_plot - script: - """ - # Protein_Alignment - pre=\$(echo ${prot} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${prot} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + script: + """ + # Protein_Alignment + pre=\$(echo ${prot} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${prot} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # Protein_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint + # Protein_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint - # Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} + # Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ - } - } + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } + } - process Generate_AminoTypes_Counts_Table { + process Generate_AminoTypes_Counts_Table { - label 'high_cpus' + label 'high_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Counts", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Counts", mode: "copy", overwrite: true - input: - file(fasta) from aminotypesCounts - file(merged) from mergeforprotcounts - file(samplist) from samplelist + input: + file(fasta) from aminotypesCounts + file(merged) from mergeforprotcounts + file(samplist) from samplelist - output: - tuple file("*_protcounts.csv"), file("*dmd.out") into counts_summary - file("*_protcounts.csv") into aminocounts_plot + output: + tuple file("*_protcounts.csv"), file("*dmd.out") into counts_summary + file("*_protcounts.csv") into aminocounts_plot - script: - """ - set +e - diamond makedb --in ${fasta} --db ${fasta} - diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_protCounts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 - echo "OTU_ID" >tmp.col1.txt - echo "Generating sample id list" - grep ">" ${fasta} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list - cat otuid.list >> tmp.col1.txt - echo "Beginning them counts tho my g" - for y in \$( cat ${samplist} );do - echo "Starting with \$y now ..." - grep "\$y" ${params.projtag}_protCounts_dmd.out > tmp."\$y".out - echo "Isolated hits" - echo "Created uniq subject id list" - echo "\$y" > "\$y"_col.txt - echo "Starting my counts" - for z in \$(cat otuid.list);do - echo "Counting \$z hits" - echo "grep -wc "\$z" >> "\$y"_col.txt" - grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt - echo "\$z counted" - done - done - paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_protcounts.csv - rm tmp* - rm *col.txt - """ - } - } + script: + """ + set +e + diamond makedb --in ${fasta} --db ${fasta} + diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_protCounts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 + echo "OTU_ID" >tmp.col1.txt + echo "Generating sample id list" + grep ">" ${fasta} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list + cat otuid.list >> tmp.col1.txt + echo "Beginning them counts tho my g" + for y in \$( cat ${samplist} );do + echo "Starting with \$y now ..." + grep "\$y" ${params.projtag}_protCounts_dmd.out > tmp."\$y".out + echo "Isolated hits" + echo "Created uniq subject id list" + echo "\$y" > "\$y"_col.txt + echo "Starting my counts" + for z in \$(cat otuid.list);do + echo "Counting \$z hits" + echo "grep -wc "\$z" >> "\$y"_col.txt" + grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt + echo "\$z counted" + done + done + paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_protcounts.csv + rm tmp* + rm *col.txt + """ + } + } - if (params.pcASV) { // ASV_nucl -> ASV_aa -> clusteraa by %id with ch-hit -> extract representative nucl sequences to generate new OTU file + if (params.pcASV) { // ASV_nucl -> ASV_aa -> clusteraa by %id with ch-hit -> extract representative nucl sequences to generate new OTU file - if (params.sing) { + if (params.sing) { - process Translating_For_pcASV_Generation { + process Translating_For_pcASV_Generation { - label 'low_cpus' + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' - input: - file(fasta) from nucl2aa + input: + file(fasta) from nucl2aa - output: - file("*ASV*translations.fasta") into clustering_aa - file("*_ASV_translations_report") into reportaa_VR - file("*_ASV_nucleotide.fasta") into asvfastaforaaclust + output: + file("*ASV*translations.fasta") into clustering_aa + file("*_ASV_translations_report") into reportaa_VR + file("*_ASV_nucleotide.fasta") into asvfastaforaaclust - script: - """ - conda init && source activate virtualribosome + script: + """ + conda init && source activate virtualribosome - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report - cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta - """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report + cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta + """ - } + } - } else { + } else { - process Translation_For_pcASV_Generation { + process Translation_For_pcASV_Generation { - label 'low_cpus' + label 'low_cpus' - conda 'python=2.7' + conda 'python=2.7' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' - input: - file(fasta) from nucl2aa + input: + file(fasta) from nucl2aa - output: - file("*ASV*translations.fasta") into clustering_aa - file("*_ASV_translations_report") into reportaa_VR - file("*_ASV_nucleotide.fasta") into asvfastaforaaclust + output: + file("*ASV*translations.fasta") into clustering_aa + file("*_ASV_translations_report") into reportaa_VR + file("*_ASV_nucleotide.fasta") into asvfastaforaaclust - script: - """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report - cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta - """ - } - } + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report + cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta + """ + } + } - process Generate_pcASVs { + process Generate_pcASVs { - label 'norm_cpus' + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV", mode: "copy", overwrite: true, pattern: '*pcASV*.{fasta}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Problematic", mode: "copy", overwrite: true, pattern: '*problem*.{fasta}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV", mode: "copy", overwrite: true, pattern: '*pcASV*.{fasta}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Problematic", mode: "copy", overwrite: true, pattern: '*problem*.{fasta}' - input: - file(fasta) from clustering_aa - file(asvs) from asvfastaforaaclust + input: + file(fasta) from clustering_aa + file(asvs) from asvfastaforaaclust - output: - file("${params.projtag}_nucleotide_pcASV*.fasta") into ( pcASV_ntDiamond_ch, pcASV_nt_counts_ch, pcASV_ntmatrix_ch, pcASV_ntmafft_ch ) - file("*_aminoacid_pcASV*_noTaxonomy.fasta") into ( pcASV_aaMatrix_ch, pcASV_aaDiamond_ch, pcASV_aaMafft_ch, pcASV_aaCounts_ch, pcASVEMBOSS ) - tuple file("*.fasta"), file("*.clstr"), file("*.csv"), file("*.gc") into ( pcASVsupplementalfiles ) + output: + file("${params.projtag}_nucleotide_pcASV*.fasta") into ( pcASV_ntDiamond_ch, pcASV_nt_counts_ch, pcASV_ntmatrix_ch, pcASV_ntmafft_ch ) + file("*_aminoacid_pcASV*_noTaxonomy.fasta") into ( pcASV_aaMatrix_ch, pcASV_aaDiamond_ch, pcASV_aaMafft_ch, pcASV_aaCounts_ch, pcASVEMBOSS ) + tuple file("*.fasta"), file("*.clstr"), file("*.csv"), file("*.gc") into ( pcASVsupplementalfiles ) - script: - // add awk script to count seqs - if (params.clusterAAIDlist) { - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - for id in `echo ${params.clusterAAIDlist} | tr "," "\\n"`;do + script: + // add awk script to count seqs + if (params.clusterAAIDlist) { + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + for id in `echo ${params.clusterAAIDlist} | tr "," "\\n"`;do + awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta + cd-hit -i ${params.projtag}_filtered_proteins.fasta -c \${id} -o ${params.projtag}_pcASV\${id}.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr + grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list + y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) + echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr + t=1 + b=1 + for x in \$(cat temporaryclusters.list);do + echo "Extracting \$x" + name="\$( echo \$x | awk -F ">" '{print \$2}')" + clust="pcASV"\${t}"" + echo "\${name}" + awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list + t=\$(( \${t}+1 )) + b=\$(( \${b}+1 )) + done + ls *_tmp.list + u=1 + for x in *_tmp.list;do + name="\$(echo \$x | awk -F "_p" '{print \$1}')" + echo "\${name}" + cluster="\$(echo \$x | awk -F "_" '{print \$3}')" + echo "\${cluster}" + grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list + seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta + vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta + grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list + for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do + echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders + u=\$(( \${u}+1 )) + done + u=1 + ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta + done + cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv + grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list + j=1 + for x in \$(cat lala.list);do + echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list + echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv + j=\$(( \${j}+1 )) + done + rm lala.list + awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list + for x in \$(cat tmporder.list);do + grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list + done + paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv + ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta + stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true + stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta + else + rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta + fi + rm *.list + rm Cluster* + rm *types* + rm *tmp* + rm ${params.projtag}_pcASV\${id}.fast* + done + """ + } else if (params.clusterAAID) { + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + id=${params.clusterAAID} awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -c \${id} -o ${params.projtag}_pcASV\${id}.fasta + cd-hit -i ${params.projtag}_filtered_proteins.fasta -c ${params.clusterAAID} -o ${params.projtag}_pcASV\${id}.fasta sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) @@ -2187,7 +2587,8 @@ if (params.Analyze) { t=\$(( \${t}+1 )) b=\$(( \${b}+1 )) done - ls *_tmp.list + + ls *_tmp.list u=1 for x in *_tmp.list;do name="\$(echo \$x | awk -F "_p" '{print \$1}')" @@ -2223,12 +2624,12 @@ if (params.Analyze) { done paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta - stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true - stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true + stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 + stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta + seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta else rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta fi @@ -2237,833 +2638,651 @@ if (params.Analyze) { rm *types* rm *tmp* rm ${params.projtag}_pcASV\${id}.fast* - done - """ - } else if (params.clusterAAID) { - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - id=${params.clusterAAID} - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -c ${params.clusterAAID} -o ${params.projtag}_pcASV\${id}.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr - grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list - y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) - echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr - t=1 - b=1 - for x in \$(cat temporaryclusters.list);do - echo "Extracting \$x" - name="\$( echo \$x | awk -F ">" '{print \$2}')" - clust="pcASV"\${t}"" - echo "\${name}" - awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list - t=\$(( \${t}+1 )) - b=\$(( \${b}+1 )) - done - - ls *_tmp.list - u=1 - for x in *_tmp.list;do - name="\$(echo \$x | awk -F "_p" '{print \$1}')" - echo "\${name}" - cluster="\$(echo \$x | awk -F "_" '{print \$3}')" - echo "\${cluster}" - grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list - seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta - vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta - grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list - for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do - echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders - u=\$(( \${u}+1 )) - done - u=1 - ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta - done - cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv - ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta - stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 - stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta - else - rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta - fi - rm *.list - rm Cluster* - rm *types* - rm *tmp* - rm ${params.projtag}_pcASV\${id}.fast* - """ - } - } + """ + } + } - if (!params.skipTaxonomy) { + if (!params.skipTaxonomy) { - process pcASV_Nucleotide_Taxonomy_Inference { + process pcASV_Nucleotide_Taxonomy_Inference { - label 'high_cpus' + label 'high_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' - input: - file(reads) from pcASV_ntDiamond_ch + input: + file(reads) from pcASV_ntDiamond_ch - output: - file("*.fasta") into ( pcASV_labeled ) - tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond - file("*_summary_for_plot.csv") into taxplot3 + output: + file("*.fasta") into ( pcASV_labeled ) + tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond + file("*_summary_for_plot.csv") into taxplot3 - script: - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} >> headers.list - headers="headers.list" - for filename in ${reads};do - name=\$(ls \${filename} | awk -F "_noTax" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" >access.list - echo "[pcASV sequence length]" >length.list - echo "[e-value]" >evalue.list - echo "[Bitscore]" >bit.list - echo "[Percent ID (aa)]" >pid.list - echo "[pcASV#]" >otu.list - echo "[Virus ID]" >"\$name"_virus.list - echo "[Gene]" >"\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_headers.txt - j=1 - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >>otu.list - echo "\$acc" >>access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list - echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >>otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_headers.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_headers.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " - done - rm *headers.list - """ - } - } + script: + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} >> headers.list + headers="headers.list" + for filename in ${reads};do + name=\$(ls \${filename} | awk -F "_noTax" '{print \$1}') + diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" >access.list + echo "[pcASV sequence length]" >length.list + echo "[e-value]" >evalue.list + echo "[Bitscore]" >bit.list + echo "[Percent ID (aa)]" >pid.list + echo "[pcASV#]" >otu.list + echo "[Virus ID]" >"\$name"_virus.list + echo "[Gene]" >"\$name"_genes.list + grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_headers.txt + j=1 + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >>otu.list + echo "\$acc" >>access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list + echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >>otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py \${filename} new_"\$name"_headers.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_headers.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: \${filename} " + done + rm *headers.list + """ + } + } - process Generate_Nucleotide_pcASV_Counts { + process Generate_Nucleotide_pcASV_Counts { - label 'norm_cpus' + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Counts", mode: "copy", overwrite: true, pattern: '*.{biome,csv,txt}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Counts", mode: "copy", overwrite: true, pattern: '*.{biome,csv,txt}' - input: - file(potus) from pcASV_nt_counts_ch - file(merged) from pcASV_mergedreads_ch + input: + file(potus) from pcASV_nt_counts_ch + file(merged) from pcASV_mergedreads_ch - output: - tuple file("*_counts.txt"), file("*_counts.biome") into pcASVcounts_vsearch - file("*.csv") into potu_Ncounts_for_report + output: + tuple file("*_counts.txt"), file("*_counts.biome") into pcASVcounts_vsearch + file("*.csv") into potu_Ncounts_for_report - script: - """ - for filename in ${potus};do - ident=\$( echo \${filename} | awk -F "pcASV" '{print \$2}' | awk -F "_noTaxonomy.fasta" '{print \$1}') - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - done - """ - } + script: + """ + for filename in ${potus};do + ident=\$( echo \${filename} | awk -F "pcASV" '{print \$2}' | awk -F "_noTaxonomy.fasta" '{print \$1}') + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv + done + """ + } - process Generate_pcASV_Nucleotide_Matrix { + process Generate_pcASV_Nucleotide_Matrix { - label 'low_cpus' + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Matrix", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Matrix", mode: "copy", overwrite: true - input: - file(potus) from pcASV_ntmatrix_ch + input: + file(potus) from pcASV_ntmatrix_ch - output: - file("*.matrix") into pcASVclustmatrices - file("*PercentID.matrix") into potu_nucl_heatmap + output: + file("*.matrix") into pcASVclustmatrices + file("*PercentID.matrix") into potu_nucl_heatmap - script: - """ - for filename in ${potus};do - ident=\$( echo \${filename} | awk -F "pcASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - done - """ - } + script: + """ + for filename in ${potus};do + ident=\$( echo \${filename} | awk -F "pcASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + done + """ + } - if (!params.skipPhylogeny) { + if (!params.skipPhylogeny) { - process pcASV_Nucleotide_Phylogeny { + process pcASV_Nucleotide_Phylogeny { - label 'norm_cpus' + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - input: - file(reads) from pcASV_ntmafft_ch + input: + file(reads) from pcASV_ntmafft_ch - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_nucleotide_phylogeny_results - file("*iq.treefile") into potu_Ntree_plot + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_nucleotide_phylogeny_results + file("*iq.treefile") into potu_Ntree_plot - script: - """ - for filename in ${reads};do - pre=\$( echo \${filename} | awk -F "_noTax" '{print \$1}' ) - mafft --maxiterate 5000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + script: + """ + for filename in ${reads};do + pre=\$( echo \${filename} | awk -F "_noTax" '{print \$1}' ) + mafft --maxiterate 5000 --auto \${filename} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # pcASV_Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # pcASV_Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # pcASV_Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} + # pcASV_Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - fi - done - """ - } - } + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + fi + done + """ + } + } - process pcASV_AminoAcid_Matrix { + process pcASV_AminoAcid_Matrix { - label 'low_cpus' + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Matrix", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Matrix", mode: "copy", overwrite: true - input: - file(prot) from pcASV_aaMatrix_ch + input: + file(prot) from pcASV_aaMatrix_ch - output: - file("*.matrix") into pcASVaaMatrix - file("*PercentID.matrix") into potu_aa_heatmap + output: + file("*.matrix") into pcASVaaMatrix + file("*PercentID.matrix") into potu_aa_heatmap - script: - """ - for filename in ${prot};do - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - done - """ - } + script: + """ + for filename in ${prot};do + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + done + """ + } - if (!params.skipEMBOSS) { + if (!params.skipEMBOSS) { - process pcASV_EMBOSS_Analyses { + process pcASV_EMBOSS_Analyses { - label 'low_cpus' + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' - input: - file(prot) from pcASVEMBOSS + input: + file(prot) from pcASVEMBOSS - output: - tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into pcASV_emboss + output: + tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into pcASV_emboss - script: - """ - for filename in ${prot};do - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - garnier -sequence \${filename} -outfile \${name}_2dStructures.garnier - hmoment -seqall \${filename} -graph svg -plot - mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg - iep -sequence \${filename} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep - mv iep.svg ./"\${name}"_IsoelectricPoint.svg - pepstats -sequence \${filename} -outfile \${name}_ProteinProperties.pepstats - grep ">" \${filename} | awk -F ">" '{print \$2}' > tmpsequence.list - for x in \$(cat tmpsequence.list);do - echo \$x > tmp1.list - seqtk subseq \${filename} tmp1.list > tmp2.fasta - len=\$(tail -1 tmp2.fasta | awk '{print length}') - pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo - mv pepinfo.svg ./"\$x"_PropertiesPlot.svg - cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo - rm "\$x"_PropertiesPlot.pepinfo - pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepnet.svg ./"\$x"_HelicalNet.svg - pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepwheel.svg ./"\$x"_HelicalWheel.svg - rm tmp1.list tmp2.fasta - done - rm tmpsequence.list - done - """ + script: + """ + for filename in ${prot};do + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + garnier -sequence \${filename} -outfile \${name}_2dStructures.garnier + hmoment -seqall \${filename} -graph svg -plot + mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg + iep -sequence \${filename} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep + mv iep.svg ./"\${name}"_IsoelectricPoint.svg + pepstats -sequence \${filename} -outfile \${name}_ProteinProperties.pepstats + grep ">" \${filename} | awk -F ">" '{print \$2}' > tmpsequence.list + for x in \$(cat tmpsequence.list);do + echo \$x > tmp1.list + seqtk subseq \${filename} tmp1.list > tmp2.fasta + len=\$(tail -1 tmp2.fasta | awk '{print length}') + pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo + mv pepinfo.svg ./"\$x"_PropertiesPlot.svg + cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo + rm "\$x"_PropertiesPlot.pepinfo + pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepnet.svg ./"\$x"_HelicalNet.svg + pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepwheel.svg ./"\$x"_HelicalWheel.svg + rm tmp1.list tmp2.fasta + done + rm tmpsequence.list + done + """ + } } - } - if (!params.skipTaxonomy) { - - process pcASV_AminoAcid_Taxonomy_Inference { + if (!params.skipTaxonomy) { - label 'high_cpus' + process pcASV_AminoAcid_Taxonomy_Inference { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' + label 'high_cpus' - input: - file(reads) from pcASV_aaDiamond_ch + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' - output: - file("*.fasta") into ( pcASV_labeledAA ) - tuple file("*phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond - file("*_summary_for_plot.csv") into taxplot4 + input: + file(reads) from pcASV_aaDiamond_ch - script: - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} >> headers.list - headers="headers.list" - for filename in ${reads};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastp -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" >access.list - echo "[pcASV sequence length]" >length.list - echo "[e-value]" >evalue.list - echo "[Bitscore]" >bit.list - echo "[Percent ID (aa)]" >pid.list - echo "[pcASVaa#]" >otu.list - echo "[Virus ID]" >"\$name"_virus.list - echo "[Gene]" >"\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_headers.txt - j=1 - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >>otu.list - echo "\$acc" >>access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >>otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASVaa\${j}_\${virus}_\${gene}" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_headers.txt "\$name"_wTax.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_wTax.fasta > "\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_headers.txt >> newnames.list - touch sequence.list - awk 'BEGIN{RS=">";ORS=""}{print \$2"\\n"}' \${name}_tmpssasv.fasta >>sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_summary_phyloseqObject.csv - paste -d"\\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " - done - rm *headers.list - """ - } - } + output: + file("*.fasta") into ( pcASV_labeledAA ) + tuple file("*phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond + file("*_summary_for_plot.csv") into taxplot4 - if (!params.skipPhylogeny) { + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} >> headers.list + headers="headers.list" + for filename in ${reads};do + name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') + diamond blastp -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" >access.list + echo "[pcASV sequence length]" >length.list + echo "[e-value]" >evalue.list + echo "[Bitscore]" >bit.list + echo "[Percent ID (aa)]" >pid.list + echo "[pcASVaa#]" >otu.list + echo "[Virus ID]" >"\$name"_virus.list + echo "[Gene]" >"\$name"_genes.list + grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_headers.txt + j=1 + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >>otu.list + echo "\$acc" >>access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list + echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >>otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">pcASVaa\${j}_\${virus}_\${gene}" >>new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py \${filename} new_"\$name"_headers.txt "\$name"_wTax.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_wTax.fasta > "\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_headers.txt >> newnames.list + touch sequence.list + awk 'BEGIN{RS=">";ORS=""}{print \$2"\\n"}' \${name}_tmpssasv.fasta >>sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_summary_phyloseqObject.csv + paste -d"\\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: \${filename} " + done + rm *headers.list + """ + } + } - process pcASV_Protein_Phylogeny { + if (!params.skipPhylogeny) { - label 'norm_cpus' + process pcASV_Protein_Phylogeny { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' + label 'norm_cpus' - input: - file(prot) from pcASV_aaMafft_ch + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_protein_phylogeny_results - file("*iq.treefile") into potu_Atree_plot + input: + file(prot) from pcASV_aaMafft_ch - script: - """ - for filename in ${prot};do - pre=\$( echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --maxiterate 5000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_protein_phylogeny_results + file("*iq.treefile") into potu_Atree_plot - # pcASV_Protein_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint + script: + """ + for filename in ${prot};do + pre=\$( echo \${filename} | awk -F ".fasta" '{print \$1}' ) + mafft --maxiterate 5000 --auto \${filename} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # pcASV_Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} + # pcASV_Protein_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + # pcASV_Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - done - """ - } - } + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - process Generate_pcASV_Protein_Counts { + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + done + """ + } + } - label 'high_cpus' + process Generate_pcASV_Protein_Counts { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Counts", mode: "copy", overwrite: true + label 'high_cpus' - input: - file(fasta) from pcASV_aaCounts_ch - file(merged) from mergeforpcASVaacounts - file(samplist) from samplistpotu + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Counts", mode: "copy", overwrite: true - output: - tuple file("*_counts.csv"), file("*dmd.out") into potuaacounts_summary - file("*counts.csv") into potu_Acounts + input: + file(fasta) from pcASV_aaCounts_ch + file(merged) from mergeforpcASVaacounts + file(samplist) from samplistpotu - script: - """ - set +e - for filename in ${fasta};do - potu="\$( echo \${filename} | awk -F "_" '{print \$3}')" - diamond makedb --in \${filename} --db \${filename} - diamond blastx -q ${merged} -d \${filename} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_\${potu}_Counts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 - echo "OTU_ID" >tmp.col1.txt - echo "Generating sample id list" - grep ">" \${filename} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list - cat otuid.list >> tmp.col1.txt - echo "Beginning them counts tho my g" - for y in \$( cat ${samplist} );do - echo "Starting with \$y now ..." - grep "\$y" ${params.projtag}_\${potu}_Counts_dmd.out > tmp."\$y".out - echo "Isolated hits" - echo "Created uniq subject id list" - echo "\$y" > "\$y"_col.txt - echo "Starting my counts" - for z in \$(cat otuid.list);do - echo "Counting \$z hits" - echo "grep -wc "\$z" >> "\$y"_col.txt" - grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt - echo "\$z counted" - done - done - paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_\${potu}_counts.csv - rm tmp* - rm *col.txt - done - """ - } - } + output: + tuple file("*_counts.csv"), file("*dmd.out") into potuaacounts_summary + file("*counts.csv") into potu_Acounts - if (!params.skipReport) { + script: + """ + set +e + for filename in ${fasta};do + potu="\$( echo \${filename} | awk -F "_" '{print \$3}')" + diamond makedb --in \${filename} --db \${filename} + diamond blastx -q ${merged} -d \${filename} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_\${potu}_Counts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 + echo "OTU_ID" >tmp.col1.txt + echo "Generating sample id list" + grep ">" \${filename} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list + cat otuid.list >> tmp.col1.txt + echo "Beginning them counts tho my g" + for y in \$( cat ${samplist} );do + echo "Starting with \$y now ..." + grep "\$y" ${params.projtag}_\${potu}_Counts_dmd.out > tmp."\$y".out + echo "Isolated hits" + echo "Created uniq subject id list" + echo "\$y" > "\$y"_col.txt + echo "Starting my counts" + for z in \$(cat otuid.list);do + echo "Counting \$z hits" + echo "grep -wc "\$z" >> "\$y"_col.txt" + grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt + echo "\$z counted" + done + done + paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_\${potu}_counts.csv + rm tmp* + rm *col.txt + done + """ + } + } - if (!params.skipAdapterRemoval) { + if (!params.skipReport) { - process combine_csv { + if (!params.skipAdapterRemoval) { - input: - file(csv) from fastp_csv - .collect() + process combine_csv { - output: - file("final_reads_stats.csv") into ( fastp_csv1, fastp_csv2, fastp_csv3, fastp_csv4, fastp_csv5 ) + input: + file(csv) from fastp_csv_in2 + .collect() - script: - """ - cat ${csv} >all_reads_stats.csv - head -n1 all_reads_stats.csv >tmp.names.csv - cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv - cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv - rm tmp.names.csv tmp.reads.stats.csv - """ + output: + file("final_reads_stats.csv") into ( fastp_csv1, fastp_csv2, fastp_csv3, fastp_csv4, fastp_csv5 ) - } - } + script: + """ + cat ${csv} >all_reads_stats.csv + head -n1 all_reads_stats.csv >tmp.names.csv + cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv + cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv + rm tmp.names.csv tmp.reads.stats.csv + """ - if (params.ncASV) { + } + } - // mopd this - process Report_ASV { + if (params.ncASV) { - label 'norm_cpus' + // mopd this + process Report_ASV { - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true + label 'norm_cpus' - input: - file(counts) from asv_counts_plots - file(taxonomy) from taxplot1 - file(matrix) from asv_heatmap - file(readsstats) from fastp_csv1 - - output: - file("*.html") into report_summaryA - - script: - """ - name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_ReportA.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportA.Rmd',output_file='\${name}_ASV_Report.html')" \${name} \ - ${readsstats} \ - ${counts} \ - ${params.metadata} \ - ${params.minimumCounts} \ - ${matrix} \ - ${taxonomy} \ - ${params.trymax} \ - ${params.stats} - """ - } - - process Report_ncASV { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/ncASV", mode: "copy", overwrite: true - - input: - file(counts) from notu_counts_plots - file(taxonomy) from taxplot1a - file(matrix) from notu_heatmap - file(phylogeny) from nucl_phyl_plot - file(readsstats) from fastp_csv2 - - output: - file("*.html") into report_summaryB - - script: - """ - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - for x in *_summary_for_plot.csv;do - name=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}') - id=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_ncASV\${id}_Report.html')" \${name} \ - ${readsstats} \ - \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ - ${params.metadata} \ - ${params.minimumCounts} \ - \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ - ${params.trymax} \ - ${params.stats} - done - """ - } - - if (!params.skipAminoTyping) { - - process Report_AminoTypes { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true - - input: - file(counts) from aminocounts_plot - file(taxonomy) from taxplot2 - file(matrix) from aminotype_heatmap - file(phylogeny) from amino_rax_plot - file(readsstats) from fastp_csv5 - - output: - file("*.html") into report_summaryE - - script: - """ - name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_AminoType_Report.html')" \${name} \ - ${readsstats} \ - ${counts} \ - ${params.metadata} \ - ${params.minimumCounts} ${matrix} \ - ${taxonomy} \ - ${phylogeny} \ - ${params.trymax} \ - ${params.stats} - """ - } - } - } else { - - process Report_ASVs { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true input: file(counts) from asv_counts_plots file(taxonomy) from taxplot1 file(matrix) from asv_heatmap - file(phylogeny) from nucl_phyl_plot file(readsstats) from fastp_csv1 output: @@ -3072,24 +3291,60 @@ if (params.Analyze) { script: """ name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/bin/vAMPirus_ReportA.Rmd . cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_ASV_Report.html')" \${name} \ + Rscript -e "rmarkdown::render('vAMPirus_ReportA.Rmd',output_file='\${name}_ASV_Report.html')" \${name} \ ${readsstats} \ ${counts} \ ${params.metadata} \ ${params.minimumCounts} \ - ${matrix} \ + ${matrix} \ ${taxonomy} \ - ${phylogeny} \ ${params.trymax} \ ${params.stats} """ - } + } + + process Report_ncASV { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/ncASV", mode: "copy", overwrite: true + + input: + file(counts) from notu_counts_plots + file(taxonomy) from taxplot1a + file(matrix) from notu_heatmap + file(phylogeny) from nucl_phyl_plot + file(readsstats) from fastp_csv2 + + output: + file("*.html") into report_summaryB + + script: + """ + cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + for x in *_summary_for_plot.csv;do + name=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}') + id=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) + Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_ncASV\${id}_Report.html')" \${name} \ + ${readsstats} \ + \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ + ${params.metadata} \ + ${params.minimumCounts} \ + \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ + ${params.trymax} \ + ${params.stats} + done + """ + } if (!params.skipAminoTyping) { - process Report_AminoType { + process Report_AminoTypes { label 'norm_cpus' @@ -3120,632 +3375,159 @@ if (params.Analyze) { ${params.trymax} \ ${params.stats} """ + } } - } - } - - if (params.pcASV) { - - process Report_pcASV_AminoAcid { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/pcASV/Aminoacid", mode: "copy", overwrite: true - - input: - file(counts) from potu_Acounts - file(taxonomy) from taxplot4 - file(matrix) from potu_aa_heatmap - file(phylogeny) from potu_Atree_plot - file(readsstats) from fastp_csv3 - - output: - file("*.html") into report_summaryC - - script: - """ - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - for x in *_summary_for_plot.csv;do - name=\$( echo \${x} | awk -F "_noTaxonomy_summary_for_plot.csv" '{print \$1}') - id=\$( echo \${x} | awk -F "_noTaxonomy_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_pcASVaa\${id}_Report.html')" \${name} \ - ${readsstats} \ - \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ - ${params.metadata} \ - ${params.minimumCounts} \ - \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ - ${params.trymax} \ - ${params.stats} - done - """ - } - - process Report_pcASV_Nucleotide { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/pcASV/Nucleotide", mode: "copy", overwrite: true - - input: - file(counts) from potu_Ncounts_for_report - file(taxonomy) from taxplot3 - file(matrix) from potu_nucl_heatmap - file(phylogeny) from potu_Ntree_plot - file(readsstats) from fastp_csv4 - - output: - file("*.html") into report_summaryD - - script: - """ - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - for x in *_summary_for_plot.csv;do - name=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}') - id=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_pcASVnt\${id}_Report.html')" \${name} \ - ${readsstats} \ - \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ - ${params.metadata} \ - ${params.minimumCounts} \ - \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ - ${params.trymax} \ - ${params.stats} - done - """ - } - } - } - -} else if (params.DataCheck) { - - println("\n\tRunning vAMPirus DataCheck \n") - - process QualityCheck_1DC { - - label 'low_cpus' - - tag "${sample_id}" - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/FastQC/PreClean", mode: "copy", overwrite: true - - input: - tuple sample_id, file(reads) from reads_qc_ch - - output: - tuple sample_id, file("*_fastqc.{zip,html}") into fastqc_results_OAS - - script: - """ - fastqc --quiet --threads ${task.cpus} ${reads} - """ - } + } else { - process Adapter_Removal_DC { + process Report_ASVs { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true + + input: + file(counts) from asv_counts_plots + file(taxonomy) from taxplot1 + file(matrix) from asv_heatmap + file(phylogeny) from nucl_phyl_plot + file(readsstats) from fastp_csv1 + + output: + file("*.html") into report_summaryA + + script: + """ + name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') + cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_ASV_Report.html')" \${name} \ + ${readsstats} \ + ${counts} \ + ${params.metadata} \ + ${params.minimumCounts} \ + ${matrix} \ + ${taxonomy} \ + ${phylogeny} \ + ${params.trymax} \ + ${params.stats} + """ + } + + if (!params.skipAminoTyping) { + + process Report_AminoType { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true + + input: + file(counts) from aminocounts_plot + file(taxonomy) from taxplot2 + file(matrix) from aminotype_heatmap + file(phylogeny) from amino_rax_plot + file(readsstats) from fastp_csv5 + + output: + file("*.html") into report_summaryE + + script: + """ + name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') + cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_AminoType_Report.html')" \${name} \ + ${readsstats} \ + ${counts} \ + ${params.metadata} \ + ${params.minimumCounts} ${matrix} \ + ${taxonomy} \ + ${phylogeny} \ + ${params.trymax} \ + ${params.stats} + """ + } + } + } - label 'norm_cpus' + if (params.pcASV) { - tag "${sample_id}" + process Report_pcASV_AminoAcid { - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/AdapterRemoval", mode: "copy", overwrite: true, pattern: "*.filter.fq" - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/AdapterRemoval/fastpOut", mode: "copy", overwrite: true, pattern: "*.fastp.{json,html}" - - input: - tuple sample_id, file(reads) from reads_ch + label 'norm_cpus' - output: - tuple sample_id, file("*.fastp.{json,html}") into fastp_results - tuple sample_id, file("*.filter.fq") into reads_fastp_ch - file("*.csv") into fastp_csv + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/pcASV/Aminoacid", mode: "copy", overwrite: true - script: - """ - echo ${sample_id} - - fastp -i ${reads[0]} -I ${reads[1]} -o left-${sample_id}.filter.fq -O right-${sample_id}.filter.fq --detect_adapter_for_pe \ - --average_qual 25 -c --overrepresentation_analysis --html ${sample_id}.fastp.html --json ${sample_id}.fastp.json --thread ${task.cpus} \ - --report_title ${sample_id} + input: + file(counts) from potu_Acounts + file(taxonomy) from taxplot4 + file(matrix) from potu_aa_heatmap + file(phylogeny) from potu_Atree_plot + file(readsstats) from fastp_csv3 - bash get_readstats.sh ${sample_id}.fastp.json - """ - } + output: + file("*.html") into report_summaryC - process Primer_Removal_DC { + script: + """ + cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + for x in *_summary_for_plot.csv;do + name=\$( echo \${x} | awk -F "_noTaxonomy_summary_for_plot.csv" '{print \$1}') + id=\$( echo \${x} | awk -F "_noTaxonomy_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) + Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_pcASVaa\${id}_Report.html')" \${name} \ + ${readsstats} \ + \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ + ${params.metadata} \ + ${params.minimumCounts} \ + \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ + ${params.trymax} \ + ${params.stats} + done + """ + } - label 'norm_cpus' + process Report_pcASV_Nucleotide { - tag "${sample_id}" + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/PrimerRemoval", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/pcASV/Nucleotide", mode: "copy", overwrite: true - input: - tuple sample_id, file(reads) from reads_fastp_ch + input: + file(counts) from potu_Ncounts_for_report + file(taxonomy) from taxplot3 + file(matrix) from potu_nucl_heatmap + file(phylogeny) from potu_Ntree_plot + file(readsstats) from fastp_csv4 - output: - tuple sample_id, file("*bbduk*.fastq.gz") into ( reads_bbduk_ch, readsforqc2 ) + output: + file("*.html") into report_summaryD - script: - // add cocktail primer removal, easy, set a list, line by line seperated by , in a for loop - if ( params.fwd == "" && params.rev == "" && !params.multi) { - """ - bbduk.sh in1=${reads[0]} out=${sample_id}_bb_R1.fastq.gz ftl=${params.defaultFwdTrim} t=${task.cpus} - bbduk.sh in=${reads[1]} out=${sample_id}_bb_R2.fastq.gz ftl=${params.defaultRevTrim} t=${task.cpus} - repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz minlength=${params.minilen} outs=sing.fq repair - """ - } else if ( params.GlobTrim && !params.GlobTrim == "" ) { - """ - FTRIM=\$( echo ${GlobTrim} | cut -f 1 -d "," ) - RTRIM=\$( echo ${GlobTrim} | cut -f 2 -d "," ) - bbduk.sh in=${reads[0]} out=${sample_id}_bb_R1.fastq.gz ftl=\${FTRIM} t=${task.cpus} - bbduk.sh in=${reads[1]} out=${sample_id}_bb_R2.fastq.gz ftl=\${RTRIM} t=${task.cpus} - repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz minlength=${params.minilen} outs=sing.fq repair - """ - } else if ( params.multi && params.primers ) { - """ - bbduk.sh in=${reads[0]} in2=${reads[1]} out=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz ref=${params.primers} copyundefined=t t=${task.cpus} restrictleft=${params.primerLength} k=${params.maxkmer} ordered=t mink=${params.minkmer} ktrim=l ecco=t rcomp=t minlength=${params.minilen} tbo tpe - """ - } else { - """ - bbduk.sh in=${reads[0]} in2=${reads[1]} out=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz literal=${params.fwd},${params.rev} copyundefined=t t=${task.cpus} restrictleft=${params.primerLength} k=${params.maxkmer} ordered=t mink=${params.minkmer} ktrim=l ecco=t rcomp=t minlength=${params.minilen} tbo tpe - """ + script: + """ + cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + for x in *_summary_for_plot.csv;do + name=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}') + id=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) + Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_pcASVnt\${id}_Report.html')" \${name} \ + ${readsstats} \ + \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ + ${params.metadata} \ + ${params.minimumCounts} \ + \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ + ${params.trymax} \ + ${params.stats} + done + """ + } + } } - } - - process QualityCheck_2_DC { - - label 'low_cpus' - - tag "${sample_id}" - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/FastQC/PostClean", mode: "copy", overwrite: true - - input: - tuple sample_id, file(reads) from readsforqc2 - - output: - tuple sample_id, file("*_fastqc.{zip,html}") into fastqc2_results_OAS - - script: - """ - fastqc --quiet --threads ${task.cpus} ${reads} - """ } - - process Read_Merging_DC { - - label 'norm_cpus' - - tag "${sample_id}" - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Individual", mode: "copy", overwrite: true, pattern: "*mergedclean.fastq" - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Individual/notmerged", mode: "copy", overwrite: true, pattern: "*notmerged*.fastq" - - input: - tuple sample_id, file(reads) from reads_bbduk_ch - - output: - file("*_mergedclean.fastq") into reads_vsearch1_ch - file("*.name") into names - file("*notmerged*.fastq") into notmerged - - script: - """ - vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxee ${params.maxEE} --relabel ${sample_id}. - echo ${sample_id} > ${sample_id}.name - """ - - } - - process Compile_Reads_DC { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true - - input: - file(reads) from reads_vsearch1_ch - .collect() - - output: - file("*_all_merged_preFilt_preClean.fastq") into collect_samples_ch - - script: - """ - cat ${reads} >>${params.projtag}_all_merged_preFilt_preClean.fastq - """ - } - - process Compile_Names_DC { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging", mode: "copy", overwrite: true - - input: - file(names) from names - .collect() - - output: - file("*sample_ids.list") into ( samplelist, samplistpotu ) - - script: - """ - cat ${names} >>${params.projtag}_sample_ids.list - """ - } - - process Length_Filtering_DC { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" - - input: - file(reads) from collect_samples_ch - - output: - file("*_merged_preFilt_clean.fasta") into ( nuclCounts_mergedreads_ch, pcASV_mergedreads_ch ) - file("*_merged_clean_Lengthfiltered.fastq") into reads_vsearch2_ch - - file("*preFilt_preClean_baseFrequency_hist.csv") into prefilt_basefreq - file("*preFilt_preClean_qualityScore_hist.csv") into prefilt_qualityscore - file("*preFilt_preClean_gcContent_hist.csv") into prefilt_gccontent - file("*preFilt_preClean_averageQuality_hist.csv") into prefilt_averagequality - file("*preFilt_preClean_length_hist.csv") into prefilt_length - - file("*postFilt_baseFrequency_hist.csv") into postFilt_basefreq - file("*postFilt_qualityScore_hist.csv") into postFilt_qualityscore - file("*postFilt_gcContent_hist.csv") into postFilt_gccontent - file("*postFilt_averageQuaulity_hist.csv") into postFilt_averagequality - file("*postFilt_length_hist.csv") into postFilt_length - - file("reads_per_sample_preFilt_preClean.csv") into reads_per_sample_preFilt - file("read_per_sample_postFilt_postClean.csv") into reads_per_sample_postFilt - script: - """ - bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt_preClean_length_hist.txt gcbins=auto - for x in *preFilt*hist.txt;do - pre=\$(echo \$x | awk -F ".txt" '{print \$1}') - cat \$x | tr "\t" "," > \${pre}.csv - rm \$x - done - reformat.sh in=${reads} out=${params.projtag}_preFilt_preclean.fasta t=${task.cpus} - echo "sample,reads" >> reads_per_sample_preFilt_preClean.csv - grep ">" ${params.projtag}_preFilt_preclean.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> reads_per_sample_preFilt_preClean.csv - rm ${params.projtag}_preFilt_preclean.fasta - fastp -i ${reads} -o ${params.projtag}_merged_preFilt_clean.fastq -b ${params.maxLen} -l ${params.minLen} --thread ${task.cpus} -n 1 - reformat.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_preFilt_clean.fasta t=${task.cpus} - bbduk.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fastq minlength=${params.maxLen} maxlength=${params.maxLen} t=${task.cpus} - bbduk.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq bhist=${params.projtag}_all_merged_postFilt_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_postFilt_qualityScore_hist.txt gchist=${params.projtag}_all_merged_postFilt_gcContent_hist.txt aqhist=${params.projtag}_all_merged_postFilt_averageQuaulity_hist.txt lhist=${params.projtag}_all_merged_postFilt_length_hist.txt gcbins=auto - for x in *postFilt*hist.txt;do - pre=\$(echo \$x | awk -F ".txt" '{print \$1}') - cat \$x | tr "\t" "," > \${pre}.csv - rm \$x - done - reformat.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fasta t=${task.cpus} - echo "sample,reads" >> read_per_sample_postFilt_postClean.csv - grep ">" ${params.projtag}_merged_clean_Lengthfiltered.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> read_per_sample_postFilt_postClean.csv - """ - } - - process Extract_Uniques_DC { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Uniques", mode: "copy", overwrite: true - - input: - file(reads) from reads_vsearch2_ch - - output: - file("*unique_sequences.fasta") into reads_vsearch3_ch - - script: - """ - vsearch --derep_fulllength ${reads} --sizeout --relabel_keep --output ${params.projtag}_unique_sequences.fasta - """ - } - - process Identify_ASVs_DC { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/ASVs/ChimeraCheck", mode: "copy", overwrite: true - - input: - file(reads) from reads_vsearch3_ch - - output: - file("*notChecked.fasta") into reads_vsearch4_ch - - script: - """ - vsearch --cluster_unoise ${reads} --unoise_alpha ${params.alpha} --relabel ASV --centroids ${params.projtag}_notChecked.fasta --minsize ${params.minSize} - """ - } - - process Chimera_Check_DC { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/ASVs", mode: "copy", overwrite: true - - input: - file(fasta) from reads_vsearch4_ch - - output: - file("*ASVs.fasta") into ( reads_vsearch5_ch, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) - - script: - """ - vsearch --uchime3_denovo ${fasta} --relabel ASV --nonchimeras ${params.projtag}_ASVs.fasta - """ - } - - process NucleotideBased_ASV_clustering_DC { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Nucleotide", mode: "copy", overwrite: true, pattern: '*{.csv}' - - input: - file(fasta) from reads_vsearch5_ch - - output: - file("number_per_percentage_nucl.csv") into number_per_percent_nucl_plot - - script: - if (params.datacheckntIDlist) { - """ - for id in `echo ${params.datacheckntIDlist} | tr "," "\\n"`;do - vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel OTU --id \${id} - done - for x in *ncASV*.fasta;do - id=\$( echo \$x | awk -F "_ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - numb=\$( grep -c ">" \$x ) - echo "\${id},\${numb}" >> number_per_percentage_nucl.csv - done - yo=\$(grep -c ">" ${fasta}) - echo "1.0,\${yo}" >> number_per_percentage_nucl.csv - """ - } - } - - - if (params.sing) { - - process Translating_For_ProteinClustering_DC { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true - - input: - file(fasta) from nucl2aa - - output: - file("*ASVprotforclust.fasta") into clustering_aa - file("*_translation_report") into reportaa_VR - file("*_ASV_all.fasta") into asvfastaforaaclust - - script: - """ - conda init && source activate virtualribosome - - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report - cp ${fasta} ${params.projtag}_ASV_all.fasta - - """ - - } - - } else { - - process Translation_For_ProteinBased_Clustering_DC { - - label 'norm_cpus' - - conda 'python=2.7' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true - - input: - file(fasta) from nucl2aa - - output: - file("*ASVprotforclust.fasta") into clustering_aa - file("*_translation_report") into reportaa_VR - file("*_ASV_all.fasta") into asvfastaforaaclust - - script: - """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report - cp ${fasta} ${params.projtag}_ASV_all.fasta - """ - } - } - - process Protein_clustering_DC { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid", mode: "copy", overwrite: true, pattern: '*{.csv}' - - input: - file(fasta) from clustering_aa - file(asvs) from asvfastaforaaclust - - output: - file("number_per_percentage_prot.csv") into number_per_percent_prot_plot - - script: - // add awk script to count seqs - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - for id in `echo ${params.datacheckaaIDlist} | tr "," "\\n"`;do - if [ \${id} == ".55" ];then - word=3 - elif [ \${id} == ".65" ];then - word=4 - else - word=5 - fi - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -n \${word} -c \${id} -o ${params.projtag}_pcASV\${id}.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr - grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list - y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) - echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr - t=1 - b=1 - for x in \$(cat temporaryclusters.list);do - echo "Extracting \$x" - name="\$( echo \$x | awk -F ">" '{print \$2}')" - clust="pcASV"\${t}"" - echo "\${name}" - awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list - t=\$(( \${t}+1 )) - b=\$(( \${b}+1 )) - done - ls *_tmp.list - u=1 - for x in *_tmp.list;do - name="\$(echo \$x | awk -F "_p" '{print \$1}')" - echo "\${name}" - cluster="\$(echo \$x | awk -F "_" '{print \$3}')" - echo "\${cluster}" - grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list - seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta - vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta - grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list - for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do - echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders - u=\$(( \${u}+1 )) - done - u=1 - ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta - done - cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv - ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta - stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true - stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta - else - rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta - fi - rm *.list - rm Cluster* - rm *types* - rm *tmp* - rm ${params.projtag}_pcASV\${id}.fast* - done - for x in *aminoacid*noTaxonomy.fasta;do - id=\$( echo \$x | awk -F "_noTax" '{print \$1}' | awk -F "pcASV" '{print \$2}') - numb=\$( grep -c ">" \$x) - echo "\${id},\${numb}" >> number_per_percentage_protz.csv - done - yesirr=\$( wc -l number_per_percentage_protz.csv | awk '{print \$1}') - tail -\$(( \${yesirr}-1 )) number_per_percentage_protz.csv > number_per_percentage_prot.csv - head -1 number_per_percentage_protz.csv >> number_per_percentage_prot.csv - rm number_per_percentage_protz.csv - """ - } - - process combine_csv_DC { - - input: - file(csv) from fastp_csv - .collect() - - output: - file("final_reads_stats.csv") into fastp_csv1 - - script: - """ - cat ${csv} >all_reads_stats.csv - head -n1 all_reads_stats.csv >tmp.names.csv - cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv - cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv - rm tmp.names.csv tmp.reads.stats.csv - """ - - } - - process Report_DataCheck { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Report", mode: "copy", overwrite: true, pattern: '*.{html}' - - input: - file(fastpcsv) from fastp_csv1 - file(reads_per_sample_preFilt) from reads_per_sample_preFilt - file(read_per_sample_postFilt) from reads_per_sample_postFilt - file(preFilt_baseFrequency) from prefilt_basefreq - file(postFilt_baseFrequency) from postFilt_basefreq - file(preFilt_qualityScore) from prefilt_qualityscore - file(postFilt_qualityScore) from postFilt_qualityscore - file(preFilt_gcContent) from prefilt_gccontent - file(postFilt_gcContent) from postFilt_gccontent - file(preFilt_averageQuality) from prefilt_averagequality - file(postFilt_averageQuaulity) from postFilt_averagequality - file(preFilt_length) from prefilt_length - file(postFilt_length) from postFilt_length - file(number_per_percentage_nucl) from number_per_percent_nucl_plot - file(number_per_percentage_prot) from number_per_percent_prot_plot - - output: - file("*.html") into datacheckreport - - script: - """ - cp ${params.vampdir}/bin/vAMPirus_DC_Report.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_DC_Report.Rmd',output_file='${params.projtag}_DataCheck_Report.html')" ${params.projtag} \ - ${fastpcsv} \ - ${reads_per_sample_preFilt} \ - ${read_per_sample_postFilt} \ - ${preFilt_baseFrequency} \ - ${postFilt_baseFrequency} \ - ${preFilt_qualityScore} \ - ${postFilt_qualityScore} \ - ${preFilt_averageQuality} \ - ${postFilt_averageQuaulity} \ - ${preFilt_length} \ - ${postFilt_length} \ - ${number_per_percentage_nucl} \ - ${number_per_percentage_prot} - """ - } - } else { println("\n\t\033[0;31mMandatory argument not specified. For more info use `nextflow run vAMPirus.nf --help`\n\033[0m") exit 0 From 3ceef117d2a8b78d78cdb618fbf10be32b36fae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Thu, 25 Feb 2021 09:53:54 -0800 Subject: [PATCH 003/223] Add conda parameter --- vampirus.config | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vampirus.config b/vampirus.config index dfa3e09..edbfee7 100644 --- a/vampirus.config +++ b/vampirus.config @@ -121,6 +121,8 @@ params { // Maximum number of iteration performed by metaMDS trymax="900" + // Conda env PATH (added automatically by startup script) + condaDir="CONDADIR" /* // ------------------------------------ STOP ------------------------------------ // @@ -253,7 +255,7 @@ profiles { params.condaActivate = true // cache for condaEnv created individually conda.cacheDir = "${params.localCacheDir}/condaEnv/" - process.conda = "CONDADIR" + process.conda = "${params.condaDir}" } docker { docker.enabled = true From 2b540897cf7b6d999740626d5247da689cf0b46c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Thu, 25 Feb 2021 09:54:56 -0800 Subject: [PATCH 004/223] Change publishDir name --- vAMPirus.nf | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index a849587..309cf96 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -540,7 +540,7 @@ if (params.DataCheck || params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/FastQC/PreClean", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/FastQC/PreClean", mode: "copy", overwrite: true input: tuple sample_id, file(reads) from reads_qc_ch @@ -563,8 +563,8 @@ if (params.DataCheck || params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/AdapterRemoval", mode: "copy", overwrite: true, pattern: "*.filter.fq" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/AdapterRemoval/fastpOut", mode: "copy", overwrite: true, pattern: "*.fastp.{json,html}" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/AdapterRemoval", mode: "copy", overwrite: true, pattern: "*.filter.fq" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/AdapterRemoval/fastpOut", mode: "copy", overwrite: true, pattern: "*.fastp.{json,html}" input: tuple sample_id, file(reads) from reads_ch @@ -599,7 +599,7 @@ if (params.DataCheck || params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/PrimerRemoval", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/PrimerRemoval", mode: "copy", overwrite: true input: tuple sample_id, file(reads) from reads_fastp_ch @@ -646,7 +646,7 @@ if (params.DataCheck || params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/FastQC/PostClean", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/FastQC/PostClean", mode: "copy", overwrite: true input: tuple sample_id, file(reads) from readsforqc2 @@ -668,8 +668,8 @@ if (params.DataCheck || params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Individual", mode: "copy", overwrite: true, pattern: "*mergedclean.fastq" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Individual/notmerged", mode: "copy", overwrite: true, pattern: "*notmerged*.fastq" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Individual", mode: "copy", overwrite: true, pattern: "*mergedclean.fastq" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Individual/notmerged", mode: "copy", overwrite: true, pattern: "*notmerged*.fastq" input: tuple sample_id, file(reads) from reads_bbduk_ch @@ -691,7 +691,7 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true input: file(reads) from reads_vsearch1_ch @@ -710,7 +710,7 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging", mode: "copy", overwrite: true input: file(names) from names @@ -731,10 +731,10 @@ if (params.DataCheck || params.Analyze) { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" input: file(reads) from collect_samples_ch @@ -759,10 +759,10 @@ if (params.DataCheck || params.Analyze) { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" input: file(reads) from collect_samples_ch @@ -826,7 +826,7 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Uniques", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Uniques", mode: "copy", overwrite: true input: file(reads) from reads_vsearch2_ch From 0c408231ee82fda8b2e82b1c0a2d76bcd72fbf6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Thu, 25 Feb 2021 12:18:02 -0800 Subject: [PATCH 005/223] Fix multiple env issue --- vampirus_startup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vampirus_startup.sh b/vampirus_startup.sh index 5d09829..5f5089a 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -170,7 +170,7 @@ else echo "Alright, lets check your system for Conda..." conda_c echo "Editing path to conda directory in vampirus.config" - environment="$(conda env list | sed 's/*//g' | grep "vAMPirus" | head -1 | awk '{print $2}')" + environment="$(conda info -e | awk '$1 == "vAMPirus" {print $2}')" sed "s|CONDADIR|${environment}|g" "$mypwd"/vampirus.config > tmp1.config cat tmp1.config > "$mypwd"/vampirus.config rm tmp1.config From 5635f39c16339f509da9e276e9e03163b3643a0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Sat, 27 Feb 2021 07:49:07 -0800 Subject: [PATCH 006/223] Add skip merging parameter --- vampirus.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vampirus.config b/vampirus.config index edbfee7..c778930 100644 --- a/vampirus.config +++ b/vampirus.config @@ -163,6 +163,8 @@ params { skipEMBOSS = false // Skip Reports skipReport = false + // Skip Merging steps -> will also skip all read Processing + skipMerging = false // Data check parameters datacheckntIDlist=".55,.65,.75,.80,.81,.82,.83,.84,.85,.86,.87,.88,.89,.90,.91,.92,.93,.94,.95,.96,.97,.98,.99" datacheckaaIDlist=".55,.65,.75,.80,.81,.82,.83,.84,.85,.86,.87,.88,.89,.90,.91,.92,.93,.94,.95,.96,.97,.98,.99,1.0" From 22ed88298f50c2538e917e6576a2017955b442d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Sat, 27 Feb 2021 07:54:25 -0800 Subject: [PATCH 007/223] Add skipMerging. Change DataChek report --- vAMPirus.nf | 172 +++++++++++++++++++++++++++------------------------- 1 file changed, 90 insertions(+), 82 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 309cf96..b6096c6 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -463,12 +463,12 @@ if (params.readsTest) { Channel .fromFilePairs(params.readsTest) .ifEmpty{ exit 1, "params.readTest was empty - no input files supplied" } - .into{ reads_ch; reads_qc_ch } + .into{ reads_ch; reads_qc_ch; reads_processing } } else { println("\n\tEverything ready for launch.\n") Channel .fromFilePairs("${params.reads}", checkIfExists: true) - .into{ reads_ch; reads_qc_ch } + .into{ reads_ch; reads_qc_ch; reads_processing } } if (params.DataCheck || params.Analyze) { @@ -530,7 +530,7 @@ if (params.DataCheck || params.Analyze) { } } - if (!params.skipReadProcessing) { + if (!params.skipReadProcessing || !params.skipMerging ) { if (!params.skipFastQC) { @@ -589,6 +589,7 @@ if (params.DataCheck || params.Analyze) { reads_ch .set{ reads_fastp_ch } fastp_results = Channel.empty() + } if (!params.skipPrimerRemoval) { @@ -613,7 +614,7 @@ if (params.DataCheck || params.Analyze) { """ bbduk.sh in1=${reads[0]} out=${sample_id}_bb_R1.fastq.gz ftl=${params.defaultFwdTrim} t=${task.cpus} bbduk.sh in=${reads[1]} out=${sample_id}_bb_R2.fastq.gz ftl=${params.defaultRevTrim} t=${task.cpus} - repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz outs=sing.fq repair + repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz outs=sing.fq repair """ } else if ( params.GlobTrim && !params.GlobTrim == "" ) { """ @@ -621,7 +622,7 @@ if (params.DataCheck || params.Analyze) { RTRIM=\$( echo ${GlobTrim} | cut -f 2 -d "," ) bbduk.sh in=${reads[0]} out=${sample_id}_bb_R1.fastq.gz ftl=\${FTRIM} t=${task.cpus} bbduk.sh in=${reads[1]} out=${sample_id}_bb_R2.fastq.gz ftl=\${RTRIM} t=${task.cpus} - repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz outs=sing.fq repair + repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz outs=sing.fq repair """ } else if ( params.multi && params.primers ) { """ @@ -636,9 +637,10 @@ if (params.DataCheck || params.Analyze) { } else { reads_fastp_ch .set{ reads_bbduk_ch } + } - if (!params.skipFastQC) { + if (!params.skipFastQC && !params.skipPrimerRemoval) { process QualityCheck_2 { @@ -660,33 +662,45 @@ if (params.DataCheck || params.Analyze) { """ } } + } else { + reads_ch + .set{ reads_bbduk_ch } + } - process Read_Merging { + if (!params.skipMerging) { - label 'norm_cpus' + process Read_Merging { - tag "${sample_id}" + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Individual", mode: "copy", overwrite: true, pattern: "*mergedclean.fastq" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Individual/notmerged", mode: "copy", overwrite: true, pattern: "*notmerged*.fastq" + tag "${sample_id}" - input: - tuple sample_id, file(reads) from reads_bbduk_ch + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Individual", mode: "copy", overwrite: true, pattern: "*mergedclean.fastq" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Individual/notmerged", mode: "copy", overwrite: true, pattern: "*notmerged*.fastq" - output: - file("*_mergedclean.fastq") into reads_vsearch1_ch - file("*.name") into names - file("*notmerged*.fastq") into notmerged + input: + tuple sample_id, file(reads) from reads_bbduk_ch - script: - """ - vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxee ${params.maxEE} --relabel ${sample_id}. - echo ${sample_id} > ${sample_id}.name - """ + output: + file("*_mergedclean.fastq") into reads_vsearch1_ch + file("*.name") into names + file("*notmerged*.fastq") into notmerged + + script: + """ + vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxee ${params.maxEE} --relabel ${sample_id}. + echo ${sample_id} > ${sample_id}.name + """ + } + + } else { + reads_bbduk_ch + .set{ reads_vsearch1_ch } } + process Compile_Reads { label 'low_cpus' @@ -904,14 +918,14 @@ if (params.DataCheck || params.Analyze) { echo "\${id},\${numb}" >> number_per_percentage_nucl.csv done yo=\$(grep -c ">" ${fasta}) - echo "1.0,\${yo}" >> number_per_percentage_nucl.csv + echo "1.0,\${yo}" >> number_per_percentage_nucl.csv """ } } if (params.sing) { - process Translating_For_ProteinClustering_DC { + process Translating_For_ProteinClustering_DC { label 'low_cpus' @@ -931,34 +945,33 @@ if (params.DataCheck || params.Analyze) { ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report cp ${fasta} ${params.projtag}_ASV_all.fasta - """ - } + } } else { process Translation_For_ProteinBased_Clustering_DC { - label 'norm_cpus' + label 'norm_cpus' - conda 'python=2.7' + conda 'python=2.7' - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true - input: - file(fasta) from nucl2aa + input: + file(fasta) from nucl2aa - output: - file("*ASVprotforclust.fasta") into clustering_aa - file("*_translation_report") into reportaa_VR - file("*_ASV_all.fasta") into asvfastaforaaclust + output: + file("*ASVprotforclust.fasta") into clustering_aa + file("*_translation_report") into reportaa_VR + file("*_ASV_all.fasta") into asvfastaforaaclust - script: - """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report - cp ${fasta} ${params.projtag}_ASV_all.fasta - """ + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report + cp ${fasta} ${params.projtag}_ASV_all.fasta + """ } } @@ -1068,26 +1081,44 @@ if (params.DataCheck || params.Analyze) { """ } - process combine_csv_DC { + if (!params.skipReadProcessing || !params.skipMerging ) { - input: - file(csv) from fastp_csv_in1 - .collect() + process combine_csv_DC { - output: - file("final_reads_stats.csv") into fastp_csv_dc + input: + file(csv) from fastp_csv_in1 + .collect() - script: - """ - cat ${csv} >all_reads_stats.csv - head -n1 all_reads_stats.csv >tmp.names.csv - cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv - cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv - rm tmp.names.csv tmp.reads.stats.csv - """ + output: + file("final_reads_stats.csv") into fastp_csv_dc + script: + """ + cat ${csv} >all_reads_stats.csv + head -n1 all_reads_stats.csv >tmp.names.csv + cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv + cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv + rm tmp.names.csv tmp.reads.stats.csv + """ + + } + } else { + + process skip_combine_csv_DC { + output: + file("filter_reads.txt") into fastp_csv_dc + + script: + """ + echo "Read processing steps skipped." >filter_reads.txt + """ + } } + report_dc_in = Channel.create() + fastp_csv_dc.mix( reads_per_sample_preFilt, reads_per_sample_postFilt, prefilt_basefreq, postFilt_basefreq, prefilt_qualityscore, postFilt_qualityscore, prefilt_gccontent, postFilt_gccontent, prefilt_averagequality, postFilt_averagequality, prefilt_length, postFilt_length, number_per_percent_nucl_plot, number_per_percent_prot_plot + ).into(report_dc_in) + process Report_DataCheck { label 'norm_cpus' @@ -1095,21 +1126,8 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/DataCheck/Report", mode: "copy", overwrite: true, pattern: '*.{html}' input: - file(fastpcsv) from fastp_csv_dc - file(reads_per_sample_preFilt) from reads_per_sample_preFilt - file(read_per_sample_postFilt) from reads_per_sample_postFilt - file(preFilt_baseFrequency) from prefilt_basefreq - file(postFilt_baseFrequency) from postFilt_basefreq - file(preFilt_qualityScore) from prefilt_qualityscore - file(postFilt_qualityScore) from postFilt_qualityscore - file(preFilt_gcContent) from prefilt_gccontent - file(postFilt_gcContent) from postFilt_gccontent - file(preFilt_averageQuality) from prefilt_averagequality - file(postFilt_averageQuaulity) from postFilt_averagequality - file(preFilt_length) from prefilt_length - file(postFilt_length) from postFilt_length - file(number_per_percentage_nucl) from number_per_percent_nucl_plot - file(number_per_percentage_prot) from number_per_percent_prot_plot + file(files) from report_dc_in + .collect() output: file("*.html") into datacheckreport @@ -1119,19 +1137,9 @@ if (params.DataCheck || params.Analyze) { cp ${params.vampdir}/bin/vAMPirus_DC_Report.Rmd . cp ${params.vampdir}/example_data/conf/vamplogo.png . Rscript -e "rmarkdown::render('vAMPirus_DC_Report.Rmd',output_file='${params.projtag}_DataCheck_Report.html')" ${params.projtag} \ - ${fastpcsv} \ - ${reads_per_sample_preFilt} \ - ${read_per_sample_postFilt} \ - ${preFilt_baseFrequency} \ - ${postFilt_baseFrequency} \ - ${preFilt_qualityScore} \ - ${postFilt_qualityScore} \ - ${preFilt_averageQuality} \ - ${postFilt_averageQuaulity} \ - ${preFilt_length} \ - ${postFilt_length} \ - ${number_per_percentage_nucl} \ - ${number_per_percentage_prot} + ${params.skipReadProcessing} \ + ${params.skipMerging} \ + ${params.skipAdapterRemoval} """ } From 58109ad21bf2380d0774a63c9384a03f6ae57122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Sat, 27 Feb 2021 07:58:39 -0800 Subject: [PATCH 008/223] Add parameters check. --- bin/vAMPirus_DC_Report.Rmd | 134 ++++++++++++++++++++++--------------- 1 file changed, 81 insertions(+), 53 deletions(-) diff --git a/bin/vAMPirus_DC_Report.Rmd b/bin/vAMPirus_DC_Report.Rmd index 3320070..a0b4a1a 100644 --- a/bin/vAMPirus_DC_Report.Rmd +++ b/bin/vAMPirus_DC_Report.Rmd @@ -4,19 +4,10 @@ date: "Generated on: `r Sys.time()`" output: html_document params: interactive: TRUE - fastpcsv: !r commandArgs(trailingOnly=T)[2] - reads_per_sample_preFilt: !r commandArgs(trailingOnly=T)[3] - read_per_sample_postFilt: !r commandArgs(trailingOnly=T)[4] - preFilt_baseFrequency: !r commandArgs(trailingOnly=T)[5] - postFilt_baseFrequency: !r commandArgs(trailingOnly=T)[6] - preFilt_qualityScore: !r commandArgs(trailingOnly=T)[7] - postFilt_qualityScore: !r commandArgs(trailingOnly=T)[8] - preFilt_averageQuality: !r commandArgs(trailingOnly=T)[9] - postFilt_averageQuaulity: !r commandArgs(trailingOnly=T)[10] - preFilt_length: !r commandArgs(trailingOnly=T)[11] - postFilt_length: !r commandArgs(trailingOnly=T)[12] - number_per_percentage_nucl: !r commandArgs(trailingOnly=T)[13] - number_per_percentage_prot: !r commandArgs(trailingOnly=T)[14] + projtag: !r commandArgs(trailingOnly=T)[1] + skipReadProcessing: !r commandArgs(trailingOnly=T)[2] + skipMerging: !r commandArgs(trailingOnly=T)[3] + skipAdapterRemoval: !r commandArgs(trailingOnly=T)[4] --- + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = TRUE, + message = FALSE, + warning = FALSE, + out.width="100%") +``` + +```{r pathways, echo=FALSE} +knitr::include_graphics("vamplogo.png") +``` + +```{r load_libraries, include=FALSE} +library(vegan) +library(tidyverse) +library(scales) +library(cowplot) +library(dplyr) +library(ggtree) +library(plotly) +library(knitr) +library(kableExtra) +library(rmarkdown) +library(processx) +``` + +```{r colors, include=FALSE} +mycol=c('#088da5','#73cdc8','#ff6f61','#7cb8df','#88b04b','#00a199','#6B5B95','#92A8D1','#b0e0e6','#ff7f50','#088d9b','#E15D44','#e19336') +``` +
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +NOTE: Most plots are interactive and you can use the legend to specify samples/treatment of interest. You can also download an .svg version of each figure within this report. +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +
+

  Pre- and Post-Adapter Removal Read Stats

+
+```{r readstats, echo=FALSE} +if (params$skipReadProcessing == "true" || params$skipMerging == "true" ) { + writeLines("\n--------------------------------------------------------------\n") + cat(readLines(list.files(pattern="filter_reads.txt")) , sep = '\n') + writeLines("\n--------------------------------------------------------------\n") +} else { + if (params$skipAdapterRemoval == "false") { + reads_stats=read.csv("final_reads_stats.csv") + paged_table(reads_stats,options = list(rows.print = 20)) + } else { + writeLines("\n--------------------------------------------------------------\n") + cat(readLines(list.files(pattern="filter_reads.txt")) , sep = '\n') + writeLines("\n--------------------------------------------------------------\n") + } +} +``` +
+
+ + +### Total number of reads before and after adapter removal + +```{r readstats_plot, echo=FALSE} +# Plot of reads before and after +if (params$skipReadProcessing == "true" || params$skipMerging == "true" ) { + writeLines("\n--------------------------------------------------------------\n") + cat(readLines(list.files(pattern="filter_reads.txt")) , sep = '\n') + writeLines("\n--------------------------------------------------------------\n") +} else { + if (params$skipAdapterRemoval == "false") { + ptotal <- plot_ly(type="box",marker=list(colors=mycol)) + ptotal <- ptotal %>% add_boxplot(y=reads_stats$Total_before, name="Reads before filtering") + ptotal <- ptotal %>% add_boxplot(y=reads_stats$Total_after, name="Reads after filtering") + #ptotal <- ptotal %>% layout(title=list(text="Number of reads before and after filtering")) + ptotal <- ptotal %>% layout(legend = list(x=10,y=.5)) + ptotal <- ptotal %>% config(toImageButtonOptions=list(format='svg',filename='TotReads_b4_af_adaptrem', height= 500, width= 800, scale= 1)) + ptotal + } else { + # file fore here + writeLines("\n--------------------------------------------------------------\n") + cat(readLines(list.files(pattern="filter_reads.txt")) , sep = '\n') + writeLines("\n--------------------------------------------------------------\n") + } +} +``` +
+ +### Forward (R1) and reverse (R2) read length before and after adapter removal + +```{r readstats_plot2, echo=FALSE} +# Plot of R1 and R2 before and after +if (params$skipReadProcessing == "true" || params$skipMerging == "true" ) { + writeLines("\n--------------------------------------------------------------\n") + cat(readLines(list.files(pattern="filter_reads.txt")) , sep = '\n') + writeLines("\n--------------------------------------------------------------\n") +} else { + if (params$skipAdapterRemoval == "false") { + pr <- plot_ly(y=reads_stats$R1_before_length, type="box", name="R1 length before") + pr <- pr %>% add_boxplot(y=reads_stats$R1_after_length, name="R1 length after") + pr <- pr %>% add_boxplot(y=reads_stats$R2_before_length, name="R2 length before") + pr <- pr %>% add_boxplot(y=reads_stats$R2_after_length, name="R2 length after") + #pr <- pr %>% layout(title = "R1 and R2 Length") + pr <- pr %>% layout(legend = list(x=10,y=.5)) + pr <- pr %>% config(toImageButtonOptions=list(format='svg',filename='readlen_b4_af_adaptrem', height= 500, width= 800, scale= 1)) + pr + } else { + # file fore here + writeLines("\n--------------------------------------------------------------\n") + cat(readLines(list.files(pattern="filter_reads.txt")) , sep = '\n') + writeLines("\n--------------------------------------------------------------\n") + } +} +``` +
+
+
+```{r load_datasets_bash, include=FALSE} +cat *_counts.csv >counts.csv +cat *_summary_for_plot.csv >sum.csv +cat *_PercentID.matrix >matrix.txt +cat *.treefile >tree.txt +``` +```{r load_datasets, include=FALSE} +sample_name=read.csv("counts.csv") +sample_metadata=params$metadata +data<- read.csv(sample_name, check.names=FALSE) +data2 <-as.data.frame(t(data)) +data2$sample <- row.names(data2) +colnames(data2)<- as.matrix(data2[1,]) +as.data.frame(data2) +data2 <- data2[-1,] + +#X.OTU.ID for X.Sequence. +data2 <- data2 %>% + rename(sample=OTU_ID) +data2dim <- dim(data2) + +##Loading metadata +samples <- read.csv(sample_metadata) + +##Combining data and metadata +data3 <- merge(data2, samples, by="sample") + +dim_data3 <- dim(data3) +dim_samples <- dim(samples) +cols <- dim_data3[2]-dim_samples[2]+1 +first <-colnames(data3)[2] +last <- colnames(data3)[cols] +data3[,2:cols] <- lapply(data3[,2:cols], as.character) +data3[,2:cols] <- lapply(data3[,2:cols], as.numeric) + +#Calculate total reads per sample +data4 <- data3%>% + mutate(sum=select(.,2:cols)%>% + apply(1, sum, na.rm=TRUE)) + +``` + + +

  Number of Reads Per Sample

+ +```{r plot, echo=FALSE} +# sample and count +con <- plot_ly(data4, x = ~sum, y = ~sample, name = "Sample", type = 'scatter', + mode = "markers", marker = list(color = "#088da5"), hovertemplate = paste('Sample: %{y}','
Total reads: %{x}','')) +con <- con %>% layout(xaxis = list(title = "Total reads"),yaxis = list(title = "Sample")) +con <- con %>% config(toImageButtonOptions=list(format='svg',filename='Counts_per_sample', height= 500, width= 800, scale= 1)) +con +``` +
+
+
+```{r filter_data, include=FALSE} +##Filter samples with low reads +nfil=params$minimumCounts +data5 <- data4 %>% + filter(sum>nfil) + #can cause errors +data5dim <-dim(data5) +minreads<-min(data5$sum) +``` +
+
+
+
+
+ +

  Rarefaction

+```{r rarefaction, echo=FALSE, cache=FALSE} +##Rarefaction curves +rarefaction <- rarecurve(data5[,2:cols]) + +##rarefied dataset +raredata <- as.data.frame(rrarefy(data5[,2:cols], sample=minreads)) +``` +
+
+
+
+
+ + +

  Diversity Analyses Plots

+ +
+
+ +### Shannon diversty + +
+```{r diversity_analysis, echo=FALSE} +metadata <- data5[,(cols+1):data5dim[2]] +metadata$sample <- data5$sample +index <-diversity(raredata, index= "shannon") +shannondata5 <- as.data.frame(index) +shannondata5$sample<- data5$sample +shannondata5_2 <- merge(shannondata5, metadata, by="sample") + +#shannonplot <- ggplot(shannondata5_2, aes(x=treatment,color=treatment,y=index))+ +# geom_boxplot()+ +# geom_point()+ +# theme_classic()+ +# labs(y="Index",x="Treatment")+ +# theme(axis.text=element_text(size=12))+ +# theme(legend.position = "none") + +#sh<-ggplotly(shannonplot) +#sh <- sh %>% layout(title = list(text="Shannon diversty",y=.99)) +#sh + +sh <- plot_ly(shannondata5_2, x=~treatment, y=~index, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) +#sh <- sh %>% layout(title = list(text="Shannon diversty",y=.99)) +sh <- sh %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Index"), xaxis=list(title = "Treatment")) +sh <- sh %>% config(toImageButtonOptions=list(format='svg',filename='ShannonDiv', height= 500, width= 800, scale= 1)) +sh + +if (params$stats == "true" ) { + shannonaov <- aov(index ~ treatment, data= shannondata5_2) + st <- shapiro.test(resid(shannonaov)) + bt <- bartlett.test(index ~ treatment, data= shannondata5_2) + + if (st$p.value > .05 && bt$p.value > .05) { + print("Shapiro Test of normality - data is normal p-value > 0.05") + print(shapiro.test(resid(shannonaov))) + writeLines("\n--------------------------------------------------------------\n") + print("Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05") + print(bartlett.test(index ~ treatment, data= shannondata5_2)) + writeLines("\n--------------------------------------------------------------\n") + print("ANOVA Results") + print(summary(shannonaov)) + writeLines("\n--------------------------------------------------------------\n") + #Tukey Honest Significant Differences (pairwise comparison) - significant p <.05 + print("Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05") + print(TukeyHSD(shannonaov)) + writeLines("\n--------------------------------------------------------------\n") + } else { + print("Shapiro Test of normality - data is normal if p-value > 0.05") + print(shapiro.test(resid(shannonaov))) + writeLines("\n--------------------------------------------------------------\n") + print("Bartlett Test variance homogeneity - variance is homogeneous if p-value > 0.05") + print(bartlett.test(index ~ treatment, data= shannondata5_2)) + writeLines("\n--------------------------------------------------------------\n") + print("Data either not normal or variance not homogenous") + print("Kruskal-Wallis Test - test significant if p <.05") + #Kruskal-Wallis test - significant p <.05 + mykt <- kruskal.test(index ~ treatment, data= shannondata5_2) + print(mykt) + writeLines("\n--------------------------------------------------------------\n") + if (mykt$p.value < .05) { + #Pairwise comparison + print("Wilcox.test - pairwise comparison") + print(pairwise.wilcox.test(shannondata5_2$index, shannondata5_2$treatment, p.adjust.method = "BH")) + } else { + print("Data not significant. Skipping pairwise comparison") + } + writeLines("\n--------------------------------------------------------------\n") + print("ANOVA - one or more of the assumptions not met, take with a grain of salt.") + print(summary(shannonaov)) + writeLines("\n--------------------------------------------------------------\n") + } +} else { + print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") +} +``` +
+
+
+
+ +### Simpson diversty + +
+```{r diversity_analysis2, echo=FALSE} +index <- diversity(raredata, index= "simpson") +simpsondata5 <- as.data.frame(index) +simpsondata5$sample<- data5$sample +simpsondata5_2 <- merge(simpsondata5, metadata, by="sample") + +#simpsonplot <- ggplot(simpsondata5_2, aes(x=treatment,color=treatment,y=index))+ +# geom_boxplot()+ +# geom_point()+ +# theme_classic()+ +# labs(y="Index",x="Treatment")+ +# theme(axis.text=element_text(size=12))+ +# theme(legend.position = "none") + +#s<-ggplotly(simpsonplot) +#s <- s %>% layout(title = list(text="Simpson diversty",y=.99)) +#s + +s <- plot_ly(simpsondata5_2, x=~treatment, y=~index, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) +#s <- s %>% layout(title = list(text="Simpson diversty",y=.99)) +s <- s %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Index"), xaxis=list(title = "Treatment")) +s <- s %>% config(toImageButtonOptions=list(format='svg',filename='SimpsonDiv', height= 500, width= 800, scale= 1)) +s + +if (params$stats == "true" ) { + simpsonaov <- aov(index ~ treatment, data= simpsondata5_2) + st <- shapiro.test(resid(simpsonaov)) + bt <- bartlett.test(index ~ treatment, data= simpsondata5_2) + + if (st$p.value > .05 && bt$p.value > .05) { + print("Shapiro Test of normality - data is normal p-value > 0.05") + print(shapiro.test(resid(simpsonaov))) + writeLines("\n--------------------------------------------------------------\n") + print("Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05") + print(bartlett.test(index ~ treatment, data= simpsondata5_2)) + writeLines("\n--------------------------------------------------------------\n") + print("ANOVA Results") + print(summary(simpsonaov)) + writeLines("\n--------------------------------------------------------------\n") + #Tukey Honest Significant Differences (pairwise comparison) - significant p <.05 + print("Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05") + print(TukeyHSD(simpsonaov)) + writeLines("\n--------------------------------------------------------------\n") + } else { + print("Shapiro Test of normality - data is normal if p-value > 0.05") + print(shapiro.test(resid(simpsonaov))) + writeLines("\n--------------------------------------------------------------\n") + print("Bartlett Test variance homogeneity - variance is homogeneous if p-value > 0.05") + print(bartlett.test(index ~ treatment, data= simpsondata5_2)) + writeLines("\n--------------------------------------------------------------\n") + print("Data either not normal or variance not homogenous") + print("Kruskal-Wallis Test - test significant if p <.05") + #Kruskal-Wallis test - significant p <.05 + mykt <- kruskal.test(index ~ treatment, data= simpsondata5_2) + print(mykt) + writeLines("\n--------------------------------------------------------------\n") + if (mykt$p.value < .05) { + #Pairwise comparison + print("Wilcox.test - pairwise comparison") + print(pairwise.wilcox.test(simpsondata5_2$index, simpsondata5_2$treatment, p.adjust.method = "BH")) + } else { + print("Data not significant. Skipping pairwise comparison") + } + writeLines("\n--------------------------------------------------------------\n") + print("ANOVA - one or more of the assumptions not met, take with a grain of salt.") + print(summary(simpsonaov)) + writeLines("\n--------------------------------------------------------------\n") + } +} else { + print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") +} +``` +
+
+
+
+ +### Species Richness + +
+```{r diversity_analysis3, echo=FALSE} +mind5<-min(data5$sum) +index <- rarefy(data5[,2:cols], sample=mind5) +rarerichnessdata5 <- as.data.frame(index) +rarerichnessdata5$sample <-data5$sample +richdata5_2 <- merge(rarerichnessdata5, metadata, by="sample") + +#richnessplot <- ggplot(richdata5_2, aes(x=treatment,color=treatment,y=index))+ +# geom_boxplot()+ +# geom_point()+ +# theme_classic()+ +# labs(y="Richness",x="Treatment")+ +# theme(axis.text=element_text(size=12))+ +# theme(legend.position = "none") + +ri <- plot_ly(richdata5_2, x=~treatment, y=~index, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) +#ri <- ri %>% layout(title = list(text="ASV Richness",y=.99)) +ri <- ri %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Index"), xaxis=list(title = "Treatment")) +ri <- ri %>% config(toImageButtonOptions=list(format='svg',filename='SpeciesRich', height= 500, width= 800, scale= 1)) +ri + +if (params$stats == "true" ) { + richaov <- aov(index ~ treatment, data= richdata5_2) + st <- shapiro.test(resid(richaov)) + bt <- bartlett.test(index ~ treatment, data= richdata5_2) + + if (st$p.value > .05 && bt$p.value > .05) { + print("Shapiro Test of normality - data is normal p-value > 0.05") + print(shapiro.test(resid(richaov))) + writeLines("\n--------------------------------------------------------------\n") + print("Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05") + print(bartlett.test(index ~ treatment, data= richdata5_2)) + writeLines("\n--------------------------------------------------------------\n") + print("ANOVA Results") + print(summary(richaov)) + #Tukey Honest Significant Differences (pairwise comparison) - significant p <.05 + writeLines("\n--------------------------------------------------------------\n") + print("Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05") + print(TukeyHSD(richaov)) + writeLines("\n--------------------------------------------------------------\n") + } else { + print("Shapiro Test of normality - data is normal if p-value > 0.05") + print(shapiro.test(resid(richaov))) + writeLines("\n--------------------------------------------------------------\n") + print("Bartlett Test variance homogeneity - variance is homogeneous if p-value > 0.05") + print(bartlett.test(index ~ treatment, data= richdata5_2)) + writeLines("\n--------------------------------------------------------------\n") + print("Data either not normal or variance not homogenous") + print("Kruskal-Wallis Test - test significant if p <.05") + #Kruskal-Wallis test - significant p <.05 + mykt <- kruskal.test(index ~ treatment, data= richdata5_2) + print(mykt) + writeLines("\n--------------------------------------------------------------\n") + if (mykt$p.value < .05) { + #Pairwise comparison + print("Wilcox.test - pairwise comparison") + print(pairwise.wilcox.test(richdata5_2$index, richdata5_2$treatment, p.adjust.method = "BH")) + } else { + print("Data not significant. Skipping pairwise comparison") + } + writeLines("\n--------------------------------------------------------------\n") + print("ANOVA - one or more of the assumptions not met, take with a grain of salt.") + print(summary(richaov)) + writeLines("\n--------------------------------------------------------------\n") + } +} else { + print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") +} +``` +
+
+
+
+
+ +

  Distance To Centroid

+
+```{r distance, echo=FALSE} +##Distance +intermediate <- raredata +bray.distance <- vegdist(sqrt(intermediate), method="bray") + +##Dispersion +disper <- betadisper(bray.distance, group = metadata$treatment, type="centroid") +df <- data.frame(Distance_to_centroid=disper$distances,Group=disper$group) +df$sample <- data5$sample +df2 <- merge(df, metadata, by="sample") + +#p<- ggplot(data=df2,aes(x=treatment,y=Distance_to_centroid,colour=treatment))+ +# geom_boxplot(outlier.alpha = 0)+ +# theme_classic()+ +# geom_point(position=position_dodge(width=0.75))+ +# labs(y="Distance",x="Treatment")+ +# theme(axis.text=element_text(size=12))+ +# theme(legend.position = "none") + +#cen <- ggplotly(p) +#cen <- cen %>% layout(title = list(text="Distance to centroid",y=.99)) +#cen + +cen <- plot_ly(df2, x=~treatment, y=~Distance_to_centroid, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) +#cen <- cen %>% layout(title = list(text="Distance to centroid",y=.99)) +cen <- cen %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Distance"), xaxis=list(title = "Treatment")) +cen <- cen %>% config(toImageButtonOptions=list(format='svg',filename='Dispersion', height= 500, width= 800, scale= 1)) +cen + +if (params$stats == "true" ) { + adn <- adonis(bray.distance~data5$treatment) + adn +} else { + print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") +} +``` +
+
+
+
+
+ +

  NMDS Plots

+ +
+ +### 2D NMDS + +
+```{r nmds2d, echo=FALSE} +##NMDS +datax <- decostand(raredata,method="total") #method 'total' normalizes data to sum up to 1 --data5[,2:cols] + +MDS <- metaMDS(sqrt(datax), + distance = "bray",autotransform = FALSE, + k = 2, + maxit = 999, + trymax = params$try, + wascores = TRUE) + +if (MDS$converged == "TRUE") { + +data.scores <- as.data.frame(scores(MDS)) +data.scores$sample <- data5$sample +data.scores.2 <- merge(data.scores, metadata, by="sample") + +p <- ggplot(data.scores.2, aes(x=NMDS1, y=NMDS2,color=treatment))+ + geom_point(size=2)+ + theme_classic()+ + theme(legend.title = element_blank()) + +#fff <- ggplotly(p) +#fff <- fff %>% layout(legend=list(y=.5)) +#fff + +fff <-plot_ly(data.scores.2, x=~NMDS1, y=~NMDS2, color=~treatment, colors=mycol, text = ~paste("Sample: ", sample)) +fff <- fff %>% layout(legend=list(y=.5)) +fff <- fff %>% config(toImageButtonOptions=list(format='svg',filename='2Dnmds', height= 500, width= 800, scale= 1)) +fff + +} else { + print("No Convergence") +} +``` + +
+
+
+
+ +### 3D NMDS + +
+ +```{r nmds3d, echo=FALSE} +MDS3 <- metaMDS(sqrt(datax), + distance = "bray",autotransform = FALSE, + k = 3, + maxit = 999, + trymax = params$try, + wascores = TRUE) + +if (MDS3$converged == "TRUE") { + +data.scores3 <- as.data.frame(scores(MDS3)) +data.scores3$sample <- data5$sample +data.scores.3 <- merge(data.scores3, metadata, by="sample") +p3d <- plot_ly(data.scores.3, x=~NMDS1, y=~NMDS2, z=~NMDS3, text=~paste("Sample: ", sample), + color=~treatment, colors=mycol, + mode = 'markers', symbol = ~treatment, symbols = c('square','circle'), + marker = list(opacity = .8,line=list(color = 'darkblue',width = 1)) + ) +p3d <- p3d %>% layout(legend=list(y=.5)) +p3d <- p3d %>% config(toImageButtonOptions=list(format='svg',filename='3Dnmds', height= 500, width= 800, scale= 1)) +p3d + +} else { + print("No Convergence") +} +``` +
+
+
+
+
+ +

  OTU Abundance Per Sample

+ +```{r long, echo=FALSE} +dataz <- decostand(data5[,2:cols],method="total") #method 'total' normalizes data to sum up to 1 +dataz$sample <- data5$sample +datay <- merge(dataz, metadata, by="sample") +datalong <- datay %>% + tidyr::gather(first:last, key=hit, value=reads) + +##Barplot +## add better colors +#spec_bar <- ggplot(datalong, aes(x=forcats::fct_reorder(timepoint, as.numeric(as.character(timepoint))), +# y=reads, fill=hit))+ #Consider sqrt-transforming data +# geom_bar(aes(), stat="identity", position="fill")+ +# #coord_polar("y", start=0)+ +# theme_classic()+ +# facet_wrap(colony~treatment, nrow=2)+ +# #coord_flip()+ +# labs(x="Timepoint") #+ theme(legend.position = "none") +#spec_bar <- ggplot(datalong, aes(x=sample,y=reads,fill=hit))+geom_bar(aes(), stat="identity", position="fill")+ +# theme(axis.text.x=element_text(angle=90)) +#ggplotly(spec_bar) +#,'#00b300','#00b3b3','#0059b3','#6600ff','#b800e6','#ff3333','#ff8000','#ffff00','#bf8040','#42bcf5','#b428f5','#2e8d7e','#664e7e','#a4c700','#1aa3ff' + +ddd <- plot_ly(datalong, x=~sample, y=~reads, color=~hit, colors=mycol) +ddd <- ddd %>% layout(type='bar',barmode = 'stack') +ddd <- ddd %>% layout(legend = list(x=10,y=.5), xaxis=list(title = "Sample"), yaxis=list(title = "Relative abundance")) +ddd <- ddd %>% config(toImageButtonOptions=list(format='svg',filename='Relative_abundance', height= 500, width= 800, scale= 1)) +ddd +``` +
+
+
+
+
+ +

  OTU Abundance Per Treatment

+ +```{r asv_barplot, echo=FALSE} +datalong <- datalong %>% + filter(reads>0) + +#asv_bar <- ggplot(datalong, aes(x=reorder(hit,reads), y=reads, fill=treatment))+ +# geom_bar(stat="identity")+ +# scale_fill_manual(values=c('#088da5','#e19336'))+ #colors not working +# coord_flip()+ +# theme_classic()+ +# theme(axis.title.y = element_blank())+ +# theme(legend.title = element_blank()) + +asp2 <- plot_ly(datalong, y=~hit, x=~reads, color=~treatment, colors=mycol,text = ~paste("Sample: ", sample), opacity=.9) +asp2 <- asp2 %>% layout(type='bar', barmode = 'group') +asp2 <- asp2 %>% layout(yaxis = list(title = '', categoryorder = "total ascending"), legend = list(x=10,y=.5)) +asp2 <- asp2 %>% config(toImageButtonOptions=list(format='svg',filename='Most_abundant_hits_per_sample', height= 500, width= 800, scale= 1)) +asp2 +``` +
+
+
+
+
+ +

  Pairwise Percent-ID Heatmap

+ +
+
+```{r heatmap, echo=FALSE} +simmatrix<- read.csv("matrix.txt", header=FALSE) +rownames(simmatrix) <- simmatrix[,1] +simmatrix <- simmatrix[,-1] +colnames(simmatrix) <-rownames(simmatrix) +cols <- dim(simmatrix)[2] +simmatrix$AA <- rownames(simmatrix) +rval=nrow(simmatrix) +simmatrix2 <- simmatrix %>% + gather(1:rval, key=sequence, value=similarity) +x=reorder(simmatrix2$AA,simmatrix2$similarity) +y=reorder(simmatrix2$sequence,simmatrix2$similarity) +similaritymatrix <- ggplot(simmatrix2, aes(x=x, y=y,fill=similarity))+ + geom_raster()+ + scale_fill_distiller(palette="Spectral")+ + theme(axis.text.x = element_text(angle = 90))+ + theme(axis.title.x=element_blank())+ + theme(axis.title.y=element_blank()) + +heat <- ggplotly(similaritymatrix) +heat <- heat %>% config(toImageButtonOptions=list(format='svg',filename='heatmap', height= 500, width= 800, scale= 1)) +heat +``` +
+
+
+
+
+ + +

  Taxonomy Result Visualization

+ +
+
+ +```{r taxonomy, echo=FALSE} +if (params$skipTaxonomy == "true") + # file fore here + writeLines("\n--------------------------------------------------------------\n") + cat(readLines(list.files(pattern="filter_reads.txt")) , sep = '\n') + writeLines("\n--------------------------------------------------------------\n") +} else { + tax=read.csv("sum.csv",header=F) + tp <- plot_ly(tax, labels = ~V1, values = ~V2) + tp <- tp %>% add_pie(marker=list(colors=mycol, line=list(color='#000000', width=.5)), hole = 0.6) + tp <- tp %>% layout(title = "Taxonomy distribution", showlegend = F, + xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), + yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE) + ) + tp <- tp %>% config(toImageButtonOptions=list(format='svg',filename='TaxDonut', height= 500, width= 800, scale= 1)) + tp +} + +``` + +
+
+
+
+
+ +

  Phylogenetic Tree

+ +
+
+ +```{r tree, echo=FALSE} +if (params$skipPhylogeny == "true") + # file fore here + writeLines("\n--------------------------------------------------------------\n") + cat(readLines(list.files(pattern="filter_reads.txt")) , sep = '\n') + writeLines("\n--------------------------------------------------------------\n") +} else { + #tree=read.newick("vAMPrun_otu.55.raxml.support") + tree=read.tree("tree.txt") + p1 <- ggtree(tree) + id <- tree$tip.label + dat <- tibble::tibble(id = id) + metat <- p1$data %>% dplyr::inner_join(dat, c('label' = 'id')) + p2 <- p1 + geom_point(data = metat, aes(x = x, y = y, label = id)) + ggplotly(p2, tooltip = "label") +} +``` +This tree is a maximum likelihood tree made with IQTREE2 and the parameters you specified in the vampirus.config file. Also, this is an interactive tree, you can zoom in and hover on nodes to know the sequence ID. For a better visualization of this tree, you can find the *.treefile with bootstrap support values within the results directory and visualize using programs like FigTree or ITOL. +
+
+
+
+
+
+
+
+
From 518e21f0fa9d05a79ca17a3ac7168d4abe4dba1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 2 Mar 2021 13:26:40 -0800 Subject: [PATCH 015/223] Change filenames. Create single report to handle all data. --- vAMPirus.nf | 396 ++++++++++------------------------------------------ 1 file changed, 76 insertions(+), 320 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 4d140a3..100f78a 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2115,7 +2115,7 @@ if (params.DataCheck || params.Analyze) { script: """ - name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') + name=\$( echo ${prot} | awk -F "_noTax" '{print \$1}') clustalo -i ${prot} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} clustalo -i ${prot} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} for x in *q.matrix;do @@ -2348,7 +2348,7 @@ if (params.DataCheck || params.Analyze) { script: """ # Protein_Alignment - pre=\$(echo ${prot} | awk -F ".fasta" '{print \$1}' ) + pre=\$(echo ${prot} | awk -F "_noTax" '{print \$1}' ) mafft --thread ${task.cpus} --maxiterate 15000 --auto ${prot} >\${pre}_ALN.fasta trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html @@ -2782,14 +2782,14 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqLikeObject.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv for x in *phyloseqObject.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_noTaxonomy_summary_for_plot.csv; rm tmpcol.list tmp2col.list done rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; @@ -2889,28 +2889,28 @@ if (params.DataCheck || params.Analyze) { trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html # pcASV_Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_noTaxonomy_mt -d nt -s 203 --disable-checkpoint # pcASV_Nucleotide_Phylogeny if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq --redo -T auto ${params.iqCustomnt} elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo-nt auto -b ${params.boots} elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -b ${params.boots} elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni fi done """ @@ -3245,7 +3245,7 @@ if (params.DataCheck || params.Analyze) { echo "\$z counted" done done - paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_\${potu}_counts.csv + paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_aminoacid_\${potu}_noTaxonomy_counts.csv rm tmp* rm *col.txt done @@ -3264,7 +3264,7 @@ if (params.DataCheck || params.Analyze) { .collect() output: - file("final_reads_stats.csv") into ( fastp_csv1, fastp_csv2, fastp_csv3, fastp_csv4, fastp_csv5 ) + file("final_reads_stats.csv") into fastp_csv_in script: """ @@ -3276,364 +3276,120 @@ if (params.DataCheck || params.Analyze) { """ } + } else { + + process skip_combine_csv { + + output: + file("filter_reads.txt") into fastp_csv_in + + script: + """ + echo "Read processing steps skipped." >filter_reads.txt + """ + + } + } //NEW REPORT !!!!!!!!!!!!!!!!! + /*Report_ASV + asv_counts_plots -> ${params.projtag}_ASV_counts.csv + taxplot1 -> ${params.projtag}_ASV_summary_for_plot.csv + asv_heatmap -> ${params.projtag}_ASV_PercentID.matrix + nucl_phyl_plot -> ${params.projtag}_ASV_iq.treefile + */ + report_asv = Channel.create() + asv_counts_plots.mix(taxplot1, asv_heatmap, nucl_phyl_plot).flatten().buffer(size:4).toList().into(report_asv) if (params.ncASV) { - - notu_counts_plots.mix(taxplot1a,notu_heatmap,nucl_phyl_plot,fastp_csv2) - + report_ncasv = Channel.empty() + notu_counts_plots.mix(taxplot1a, notu_heatmap, nucl_phyl_plot).flatten().toSortedList().flatten().buffer(size:4).toList().into(report_ncasv) /* notu_counts_plots -> ${params.projtag}_ncASV${id}_counts.csv taxplot1a -> ${params.projtag}_ncASV${id}_summary_for_plot.csv notu_heatmap -> ${params.projtag}_ncASV${id}_PercentID.matrix nucl_phyl_plot -> ${params.projtag}_ncASV${id}_iq.treefile - fastp_csv2 -> final_reads_stats.csv */ - + } else { + report_ncasv = Channel.empty() } if (params.pcASV) { - - potu_Acounts.mix(taxplot4,potu_aa_heatmap,potu_Atree_plot,fastp_csv3) - + report_pcasv_aa = Channel.create() + potu_Acounts.mix(taxplot4, potu_aa_heatmap, potu_Atree_plot).flatten().toSortedList().flatten().buffer(size:4).toList().into(report_pcasv_aa) /*Report_pcASV_AminoAcid - potu_Acounts -> ${params.projtag}_pcASV${id}_counts.csv + potu_Acounts -> ${params.projtag}_pcASV${id}_noTaxonomy_counts.csv taxplot4 -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_summary_for_plot.csv potu_aa_heatmap -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_PercentID.matrix potu_Atree_plot -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_iq.treefile - fastp_csv3 -> final_reads_stats.csv */ - - potu_Ncounts_for_report.mix(taxplot3,potu_nucl_heatmap,potu_Ntree_plot,fastp_csv4) - + report_pcasv_nucl = Channel.create() + potu_Ncounts_for_report.mix(taxplot3, potu_nucl_heatmap, potu_Ntree_plot).flatten().toSortedList().flatten().buffer(size:4).toList().into(report_pcasv_nucl) /*Report_pcASV_Nucleotide potu_Ncounts_for_report -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_counts.csv - taxplot3 -> ${params.projtag}_nucleotide_pcASV${id}_summary_for_plot.csv + taxplot3 -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_summary_for_plot.csv potu_nucl_heatmap -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_PercentID.matrix - potu_Ntree_plot -> ${params.projtag}_nucleotide_pcASV${id}_iq.treefile - fastp_csv4 -> final_reads_stats.csv + potu_Ntree_plot -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_iq.treefile */ - + } else { + report_pcasv_aa = Channel.empty() + report_pcasv_nucl = Channel.empty() } if (!params.skipAminoTyping) { - - aminocounts_plot.mix(taxplot2,aminotype_heatmap,amino_rax_plot,fastp_csv5) - + report_aminotypes = Channel.create() + aminocounts_plot.mix(taxplot2, aminotype_heatmap, amino_rax_plot).flatten().buffer(size:4).toList().into(report_aminotypes) /* Report_AminoTypes aminocounts_plot -> ${params.projtag}_AminoType_counts.csv taxplot2 -> ${params.projtag}_AminoTypes_summary_for_plot.csv - aminotype_heatmap -> ${params.projtag}_AminoTypes_noTaxonomy_PercentID.matrix - amino_rax_plot -> ${params.projtag}_AminoTypes_noTaxonomy_iq.treefile - fastp_csv5 -> final_reads_stats.csv + aminotype_heatmap -> ${params.projtag}_AminoTypes_PercentID.matrix + amino_rax_plot -> ${params.projtag}_AminoTypes_iq.treefile */ + } else { + report_aminotypes = Channel.empty() } - /*Report_ASV - asv_counts_plots -> ${params.projtag}_ASV_counts.csv - taxplot1 -> ${params.projtag}_ASV_summary_for_plot.csv - asv_heatmap -> ${params.projtag}_ASV_PercentID.matrix - nucl_phyl_plot -> ${params.projtag}_ASV_iq.treefile - fastp_csv1 -> final_reads_stats.csv - */ - asv_counts_plots.mix(taxplot1,asv_heatmap,nucl_phyl_plot,fastp_csv1) - - // what? - //process_combine_csv - //fastp_csv_in2 -> ${sample_id}_reads_stats.csv + report_asv.mix(report_ncasv, report_pcasv_aa, report_pcasv_nucl,report_aminotypes).buffer(size:1).into(report_all_ch) process Report { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReports", mode: "copy", overwrite: true input: + file(csv) from fastp_csv_in file(files) from report_all_ch .collect() output: file("*.html") into report_all_out - """ - name=\$( ls -1 | grep -w "_summary_for_plot.csv" | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_Report.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportA.Rmd',output_file='\${name}_Report.html')" \${name} \ - ${params.skipReadProcessing} \ - ${params.skipMerging} \ - ${params.skipAdapterRemoval} \ - ${params.skipTaxonomy} \ - ${params.skipPhylogeny} \ - ${params.trymax} \ - ${params.stats} \ - ${params.metadata} \ - ${params.minimumCounts} - """ + script: + """ + name=\$( ls -1 | grep -w "_summary_for_plot.csv" | awk -F "_summary_for_plot.csv" '{print \$1}') + cp ${params.vampdir}/bin/vAMPirus_Report.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_Report.Rmd',output_file='\${name}_Report.html')" \${name} \ + ${params.skipReadProcessing} \ + ${params.skipMerging} \ + ${params.skipAdapterRemoval} \ + ${params.skipTaxonomy} \ + ${params.skipPhylogeny} \ + ${params.trymax} \ + ${params.stats} \ + ${params.metadata} \ + ${params.minimumCounts} + """ } - if (params.ncASV) { - - process Report_ASV { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true - - input: - file(counts) from asv_counts_plots - file(taxonomy) from taxplot1 - file(matrix) from asv_heatmap - file(readsstats) from fastp_csv1 - - output: - file("*.html") into report_summaryA - - script: - """ - name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_ReportA.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportA.Rmd',output_file='\${name}_Report.html')" \${name} \ - ${readsstats} \ - ${counts} \ - ${params.metadata} \ - ${params.minimumCounts} \ - ${matrix} \ - ${taxonomy} \ - ${params.trymax} \ - ${params.stats} - - """ - } - - process Report_ncASV { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/ncASV", mode: "copy", overwrite: true - - input: - file(counts) from notu_counts_plots - file(taxonomy) from taxplot1a - file(matrix) from notu_heatmap - file(phylogeny) from nucl_phyl_plot - file(readsstats) from fastp_csv2 - - output: - file("*.html") into report_summaryB - - script: - """ - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - for x in *_summary_for_plot.csv;do - name=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}') - id=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_Report.html')" \${name} \ - ${readsstats} \ - \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ - ${params.metadata} \ - ${params.minimumCounts} \ - \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ - ${params.trymax} \ - ${params.stats} - done - """ - } - - if (!params.skipAminoTyping) { - - process Report_AminoTypes { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true - - input: - file(counts) from aminocounts_plot - file(taxonomy) from taxplot2 - file(matrix) from aminotype_heatmap - file(phylogeny) from amino_rax_plot - file(readsstats) from fastp_csv5 - - output: - file("*.html") into report_summaryE - - script: - """ - name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_AminoType_Report.html')" \${name} \ - ${readsstats} \ - ${counts} \ - ${params.metadata} \ - ${params.minimumCounts} ${matrix} \ - ${taxonomy} \ - ${phylogeny} \ - ${params.trymax} \ - ${params.stats} - """ - } - } - } else { - - process Report_ASVs { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true - - input: - file(counts) from asv_counts_plots - file(taxonomy) from taxplot1 - file(matrix) from asv_heatmap - file(phylogeny) from nucl_phyl_plot - file(readsstats) from fastp_csv1 - - output: - file("*.html") into report_summaryA - - script: - """ - name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_ASV_Report.html')" \${name} \ - ${readsstats} \ - ${counts} \ - ${params.metadata} \ - ${params.minimumCounts} \ - ${matrix} \ - ${taxonomy} \ - ${phylogeny} \ - ${params.trymax} \ - ${params.stats} - """ - } - - if (!params.skipAminoTyping) { - - process Report_AminoType { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true - - input: - file(counts) from aminocounts_plot - file(taxonomy) from taxplot2 - file(matrix) from aminotype_heatmap - file(phylogeny) from amino_rax_plot - file(readsstats) from fastp_csv5 - - output: - file("*.html") into report_summaryE - - script: - """ - name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_AminoType_Report.html')" \${name} \ - ${readsstats} \ - ${counts} \ - ${params.metadata} \ - ${params.minimumCounts} ${matrix} \ - ${taxonomy} \ - ${phylogeny} \ - ${params.trymax} \ - ${params.stats} - """ - } - } - } - - if (params.pcASV) { - - process Report_pcASV_AminoAcid { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/pcASV/Aminoacid", mode: "copy", overwrite: true - - input: - file(counts) from potu_Acounts - file(taxonomy) from taxplot4 - file(matrix) from potu_aa_heatmap - file(phylogeny) from potu_Atree_plot - file(readsstats) from fastp_csv3 - - output: - file("*.html") into report_summaryC - - script: - """ - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - for x in *_summary_for_plot.csv;do - name=\$( echo \${x} | awk -F "_noTaxonomy_summary_for_plot.csv" '{print \$1}') - id=\$( echo \${x} | awk -F "_noTaxonomy_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_pcASVaa\${id}_Report.html')" \${name} \ - ${readsstats} \ - \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ - ${params.metadata} \ - ${params.minimumCounts} \ - \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ - ${params.trymax} \ - ${params.stats} - done - """ - } - - process Report_pcASV_Nucleotide { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/pcASV/Nucleotide", mode: "copy", overwrite: true - - input: - file(counts) from potu_Ncounts_for_report - file(taxonomy) from taxplot3 - file(matrix) from potu_nucl_heatmap - file(phylogeny) from potu_Ntree_plot - file(readsstats) from fastp_csv4 + } - output: - file("*.html") into report_summaryD + } - script: - """ - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - for x in *_summary_for_plot.csv;do - name=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}') - id=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_pcASVnt\${id}_Report.html')" \${name} \ - ${readsstats} \ - \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ - ${params.metadata} \ - ${params.minimumCounts} \ - \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ - ${params.trymax} \ - ${params.stats} - done - """ - } - } - } - } } else { println("\n\t\033[0;31mMandatory argument not specified. For more info use `nextflow run vAMPirus.nf --help`\n\033[0m") exit 0 From f167d4165bfc942a26da32bb21cdfbe96bd8f84e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 2 Mar 2021 15:15:14 -0800 Subject: [PATCH 016/223] Fix missing ). Fix name --- bin/vAMPirus_Report.Rmd | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/vAMPirus_Report.Rmd b/bin/vAMPirus_Report.Rmd index 51603aa..300f310 100644 --- a/bin/vAMPirus_Report.Rmd +++ b/bin/vAMPirus_Report.Rmd @@ -134,14 +134,14 @@ if (params$skipReadProcessing == "true" || params$skipMerging == "true" ) {


-```{r load_datasets_bash, include=FALSE} +```{bash load_datasets_bash, include=FALSE} cat *_counts.csv >counts.csv cat *_summary_for_plot.csv >sum.csv cat *_PercentID.matrix >matrix.txt cat *.treefile >tree.txt ``` ```{r load_datasets, include=FALSE} -sample_name=read.csv("counts.csv") +sample_name="counts.csv" sample_metadata=params$metadata data<- read.csv(sample_name, check.names=FALSE) data2 <-as.data.frame(t(data)) @@ -156,7 +156,7 @@ data2 <- data2 %>% data2dim <- dim(data2) ##Loading metadata -samples <- read.csv(sample_metadata) +samples <- read.csv(sample_metadata, header = TRUE) ##Combining data and metadata data3 <- merge(data2, samples, by="sample") @@ -695,7 +695,7 @@ heat
```{r taxonomy, echo=FALSE} -if (params$skipTaxonomy == "true") +if (params$skipTaxonomy == "true") { # file fore here writeLines("\n--------------------------------------------------------------\n") cat(readLines(list.files(pattern="filter_reads.txt")) , sep = '\n') @@ -726,7 +726,7 @@ if (params$skipTaxonomy == "true")
```{r tree, echo=FALSE} -if (params$skipPhylogeny == "true") +if (params$skipPhylogeny == "true") { # file fore here writeLines("\n--------------------------------------------------------------\n") cat(readLines(list.files(pattern="filter_reads.txt")) , sep = '\n') From 5cafaf1c0474db6bb8c185145851fa2b710acb0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 2 Mar 2021 15:15:48 -0800 Subject: [PATCH 017/223] WIP - Divide processes ASV and ncASV. Use each in processes --- vAMPirus.nf | 177 +++++++++++++++++++++++++--------------------------- 1 file changed, 86 insertions(+), 91 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 100f78a..8810a6b 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -471,6 +471,21 @@ if (params.readsTest) { .into{ reads_ch; reads_qc_ch; reads_processing } } +// HERE fix if stament and list names. Also is not an integer +if (params.clusterNuclIDlist == "") { + msize=params.clusterNuclIDlist + def slist=msize.split(',').collect{it as int} + def nnuc=slist.size() +} else { + def nnuc=1 +} + +if (params.clusterAAIDlist == "") { + msize2=params.clusterAAIDlist + def slist2=msize2.split(',').collect{it as int} + def naa=slist2.size() +} + if (params.DataCheck || params.Analyze) { println("\n\tRunning vAMPirus Analyze pipeline - This might take a while, check out Nextflow tower (tower.nf) to remotely monitor the run.\n") @@ -1154,19 +1169,21 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ncASV", mode: "copy", overwrite: true, pattern: '*ncASV*.fasta' input: + each x from 1..nnuc file(fasta) from reads_vsearch5_ch output: + //HERE - sepearte avs and ncasv out and proceeses. matrix, couts and phylogeny tuple file("*_ncASV*.fasta"), file("*ASV.fasta") into ( nuclFastas_forDiamond_ch, nuclFastas_forCounts_ch, nuclFastas_forMatrix_ch) - tuple file("*_ncASV*.fasta"), file("*ASV.fasta") into nuclFastas_forphylogeny + file("*_ncASV*.fasta") into nuclFastas_forphylogeny_ncasv + file("*ASV.fasta") into nuclFastas_forphylogeny_asv script: if (params.clusterNuclIDlist) { + nid=slist1.get(x-1) """ cp ${fasta} ./${params.projtag}_ASV.fasta - for id in `echo ${params.clusterNuclIDlist} | tr "," "\\n"`;do - vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id \${id} - done + vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id ${nid} """ } else if (params.clusterNuclID) { """ @@ -1721,7 +1738,7 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch - file("*ncASV*counts.csv") into notu_counts_plots + tuple val("${id}"), file("*ncASV*counts.csv") into notu_counts_plots file("*_ASV*counts.csv") into asv_counts_plots script: @@ -1880,25 +1897,68 @@ if (params.DataCheck || params.Analyze) { if (!params.skipPhylogeny) { // need to edit paths + nuclFastas_forphylogeny_asv = Channel.create() + nuclFastas_forphylogeny_ncasv = Channel.create() + nuclFastas_forphylogeny.into(nuclFastas_forphylogeny_asv, nuclFastas_forphylogeny_ncasv) + + process ASV_Phylogeny { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ASV*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' + + input: + file(asvs) from nuclFastas_forphylogeny_asv + + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results + file("*iq.treefile") into nucl_phyl_plot + + script: + """ + pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + # Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + done + """ + } + if (params.ncASV) { - process Nucleotide_Phylogeny { + process ncASV_Phylogeny { label 'norm_cpus' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ncASV*aln.*' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ncASV*mt*' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ncASV*iq*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*_ASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*_ASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*_ASV*iq*' input: - tuple file(notus), file(asvs) from nuclFastas_forphylogeny + tuple file(notus), file(asvs) from nuclFastas_forphylogeny_ncasv output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results - file("*iq.treefile") into nucl_phyl_plot + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_ncasv + file("*iq.treefile") into nucl_phyl_plot_ncasv script: """ @@ -1925,77 +1985,12 @@ if (params.DataCheck || params.Analyze) { iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni fi done - for filename in ${asvs};do - pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - done """ } - } else { - - process ASV_Phylogeny { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' - - input: - file(asvs) from nuclFastas_forphylogeny - - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results - file("*iq.treefile") into nucl_phyl_plot - - script: - """ - for filename in ${asvs};do - pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - done - """ - } - } - } + + } + + } if (!params.skipAminoTyping) { @@ -2782,7 +2777,7 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqLikeObject.csv + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv for x in *phyloseqObject.csv;do echo "\$x" @@ -3301,11 +3296,11 @@ if (params.DataCheck || params.Analyze) { nucl_phyl_plot -> ${params.projtag}_ASV_iq.treefile */ report_asv = Channel.create() - asv_counts_plots.mix(taxplot1, asv_heatmap, nucl_phyl_plot).flatten().buffer(size:4).toList().into(report_asv) + asv_counts_plots.mix(taxplot1, asv_heatmap, nucl_phyl_plot).flatten().buffer(size:4).into(report_asv) if (params.ncASV) { - report_ncasv = Channel.empty() - notu_counts_plots.mix(taxplot1a, notu_heatmap, nucl_phyl_plot).flatten().toSortedList().flatten().buffer(size:4).toList().into(report_ncasv) + report_ncasv = Channel.create() + notu_counts_plots.mix(taxplot1a, notu_heatmap, nucl_phyl_plot_ncasv).flatten().toSortedList().flatten().buffer(size:4).into(report_ncasv) /* notu_counts_plots -> ${params.projtag}_ncASV${id}_counts.csv taxplot1a -> ${params.projtag}_ncASV${id}_summary_for_plot.csv @@ -3318,7 +3313,7 @@ if (params.DataCheck || params.Analyze) { if (params.pcASV) { report_pcasv_aa = Channel.create() - potu_Acounts.mix(taxplot4, potu_aa_heatmap, potu_Atree_plot).flatten().toSortedList().flatten().buffer(size:4).toList().into(report_pcasv_aa) + potu_Acounts.mix(taxplot4, potu_aa_heatmap, potu_Atree_plot).flatten().toSortedList().flatten().buffer(size:4).into(report_pcasv_aa) /*Report_pcASV_AminoAcid potu_Acounts -> ${params.projtag}_pcASV${id}_noTaxonomy_counts.csv taxplot4 -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_summary_for_plot.csv @@ -3326,7 +3321,7 @@ if (params.DataCheck || params.Analyze) { potu_Atree_plot -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_iq.treefile */ report_pcasv_nucl = Channel.create() - potu_Ncounts_for_report.mix(taxplot3, potu_nucl_heatmap, potu_Ntree_plot).flatten().toSortedList().flatten().buffer(size:4).toList().into(report_pcasv_nucl) + potu_Ncounts_for_report.mix(taxplot3, potu_nucl_heatmap, potu_Ntree_plot).flatten().toSortedList().flatten().buffer(size:4).into(report_pcasv_nucl) /*Report_pcASV_Nucleotide potu_Ncounts_for_report -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_counts.csv taxplot3 -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_summary_for_plot.csv @@ -3340,7 +3335,7 @@ if (params.DataCheck || params.Analyze) { if (!params.skipAminoTyping) { report_aminotypes = Channel.create() - aminocounts_plot.mix(taxplot2, aminotype_heatmap, amino_rax_plot).flatten().buffer(size:4).toList().into(report_aminotypes) + aminocounts_plot.mix(taxplot2, aminotype_heatmap, amino_rax_plot).flatten().buffer(size:4).into(report_aminotypes) /* Report_AminoTypes aminocounts_plot -> ${params.projtag}_AminoType_counts.csv @@ -3352,7 +3347,8 @@ if (params.DataCheck || params.Analyze) { report_aminotypes = Channel.empty() } - report_asv.mix(report_ncasv, report_pcasv_aa, report_pcasv_nucl,report_aminotypes).buffer(size:1).into(report_all_ch) + report_all_ch = Channel.create() + report_asv.mix(report_ncasv, report_pcasv_aa, report_pcasv_nucl, report_aminotypes).buffer(size:1).flatten().toList().view().into(report_all_ch) process Report { @@ -3363,14 +3359,13 @@ if (params.DataCheck || params.Analyze) { input: file(csv) from fastp_csv_in file(files) from report_all_ch - .collect() output: file("*.html") into report_all_out script: """ - name=\$( ls -1 | grep -w "_summary_for_plot.csv" | awk -F "_summary_for_plot.csv" '{print \$1}') + name=\$( ls *summary_for_plot.csv | awk -F "_summary_for_plot.csv" '{print \$1}') cp ${params.vampdir}/bin/vAMPirus_Report.Rmd . cp ${params.vampdir}/example_data/conf/vamplogo.png . Rscript -e "rmarkdown::render('vAMPirus_Report.Rmd',output_file='\${name}_Report.html')" \${name} \ From 76be22a1a3e2658d6267827ce40cc2e59cdf23c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 12:42:10 -0800 Subject: [PATCH 018/223] Change python 2to3 --- bin/virtualribosomev2/dna2pep.py | 457 +++++++++++++------------ bin/virtualribosomev2/mod_translate.py | 108 +++--- 2 files changed, 283 insertions(+), 282 deletions(-) diff --git a/bin/virtualribosomev2/dna2pep.py b/bin/virtualribosomev2/dna2pep.py index 6f69015..9d4e9f9 100644 --- a/bin/virtualribosomev2/dna2pep.py +++ b/bin/virtualribosomev2/dna2pep.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # Copyright 2006 Rasmus Wernersson, Technical University of Denmark # @@ -29,60 +29,60 @@ SYNOPSIS dna2pep [options] [input files] [-f outfile] - + DESCRIPTION TRANSLATION: The translation engine of dna2pep has full support for handling degenerate nucleotides (IUPAC definition, e.g. W = A or T, S = G or C). - All translation table defined by the NCBI taxonomy group is included, + All translation table defined by the NCBI taxonomy group is included, and a number of options determining the behaviour of STOP and START codons is avialable. - - INTRON and EXONS: dna2pep natively understands TAB files containing + + INTRON and EXONS: dna2pep natively understands TAB files containing Intron/Exon annotation (gb2tab / FeatureExtract). When translating files containing Intron/Exon structure, dna2pep will annotate the underlying gene-structure in the annotation of the translated sequence. - + Input files can be in FASTA (no Intron/Exon annotation) RAW (single sequence with no header - all non-letters are discarded) or TAB (incluing annotation) FORMAT. The output format will by default be FASTA - for files without annotation and TAB for files including annotation. + for files without annotation and TAB for files including annotation. The file format is autodetected by investigating the first line of the input. If no input files are specified, dna2pep will read from STDIN. - + OPTIONS -F, --outfile - Optional - specify an output file. If no output file is + Optional - specify an output file. If no output file is specified the output will go to STDOUT. - + -O, --outformat - Specify output format (see also the --fasta, --tab, + Specify output format (see also the --fasta, --tab, --report options below): - + FASTA: Fasta format (plain DNA, no sequence annotation) - + TAB: Tab format. Each line contains the following four fields, separated by tabs: name, seq, ann, comment - + See gb2tab (FeatureExtract) for details. - - REPORT: A nice visualization of the results. - - AUTO: [Default] Generate a both a report and sequence output - (use the same format as the one detected from the for + + REPORT: A nice visualization of the results. + + AUTO: [Default] Generate a both a report and sequence output + (use the same format as the one detected from the for the input files). --fasta filename Write output sequences in FASTA format to the specified file. Use '-' to indicate STDOUT. - + --tab filename Write output sequences in TAB format to the specified file. Use '-' to indicate STDOUT. - + --report filename Write report to the specified file. Use '-' to indicate STDOUT. @@ -90,121 +90,121 @@ -m, --matrix tablename/file Use alternative translation matrix instead of the build-in Standard Genetic Code for translation. - - If "tablename" is 1-6,9-16 or 21-23 one of the alternative - translation tables defined by the NCBI taxonomy group will be + + If "tablename" is 1-6,9-16 or 21-23 one of the alternative + translation tables defined by the NCBI taxonomy group will be used. - + Briefly, the following tables are defined: ----------------------------------------- - 1: The Standard Code - 2: The Vertebrate Mitochondrial Code - 3: The Yeast Mitochondrial Code - 4: The Mold, Protozoan, and Coelenterate Mitochondrial Code - and the Mycoplasma/Spiroplasma Code - 5: The Invertebrate Mitochondrial Code - 6: The Ciliate, Dasycladacean and Hexamita Nuclear Code - 9: The Echinoderm and Flatworm Mitochondrial Code - 10: The Euplotid Nuclear Code - 11: The Bacterial and Plant Plastid Code - 12: The Alternative Yeast Nuclear Code - 13: The Ascidian Mitochondrial Code - 14: The Alternative Flatworm Mitochondrial Code - 15: Blepharisma Nuclear Code - 16: Chlorophycean Mitochondrial Code - 21: Trematode Mitochondrial Code - 22: Scenedesmus obliquus mitochondrial Code - 23: Thraustochytrium Mitochondrial Code - + 1: The Standard Code + 2: The Vertebrate Mitochondrial Code + 3: The Yeast Mitochondrial Code + 4: The Mold, Protozoan, and Coelenterate Mitochondrial Code + and the Mycoplasma/Spiroplasma Code + 5: The Invertebrate Mitochondrial Code + 6: The Ciliate, Dasycladacean and Hexamita Nuclear Code + 9: The Echinoderm and Flatworm Mitochondrial Code + 10: The Euplotid Nuclear Code + 11: The Bacterial and Plant Plastid Code + 12: The Alternative Yeast Nuclear Code + 13: The Ascidian Mitochondrial Code + 14: The Alternative Flatworm Mitochondrial Code + 15: Blepharisma Nuclear Code + 16: Chlorophycean Mitochondrial Code + 21: Trematode Mitochondrial Code + 22: Scenedesmus obliquus mitochondrial Code + 23: Thraustochytrium Mitochondrial Code + See http://www.ncbi.nlm.nih.gov/Taxonomy [Genetic Codes] for a detailed description. Please notice that the table of start codons is also used (see the --allinternal option below for details). - + If a filename is supplied the translation table is read from - file instead. - + file instead. + The file should contain one line per codon in the format: - + codonaa-single letter code - - All 64 codons must be included. Stop codons is specified + + All 64 codons must be included. Stop codons is specified by "*". T and U is interchangeable. Blank lines and lines starting with "#" are ignored. - + See the "gcMitVertebrate.mtx" file in the dna2pep source distribution for a well documented example. -r x, --readingframe=x Specify the reading frame. For input files in TAB format this options is ignored, and the reading frame is build from the - annotated Intron/Exon structure. - + annotated Intron/Exon structure. + 1: Reading frame 1 (e.g. ATGxxxxxx). DEFAULT. 2: Reading frame 2 (e.g. xATGxxxxx). 3: Reading frame 3 (e.g. xxATGxxxx). - + -1: Reading frame 1 on the minus strand. -2: Reading frame 2 on the minus strand. -3: Reading frame 3 on the minus strand. - - all: Try all reading frames. + + all: Try all reading frames. This option also implies the -x option. - + plus: All positive reading frames. This option also implies the -x option. - + minus: All negative reading frames. This option also implies the -x option. - + -o mode, --orf mode - Report longest ORF in the reading frame(s) specified with the + Report longest ORF in the reading frame(s) specified with the -r option. - - Mode governs which criterias are used to allow the opening of - an ORF. "Strict start codons" => codons _always_ coding for - methione (e.g. ATG in the standard code), "Minor start codons" - => codon only coding for methionine at the start positon - (e.g. TTG in the standard genetic code). - + + Mode governs which criterias are used to allow the opening of + an ORF. "Strict start codons" => codons _always_ coding for + methione (e.g. ATG in the standard code), "Minor start codons" + => codon only coding for methionine at the start positon + (e.g. TTG in the standard genetic code). + Mode can be: ------------ strict: Open an ORF at "strict start codons" only. any: Open an ORF at any start codon. - none: Do not use start codons - look for the longest + none: Do not use start codons - look for the longest fragment before a STOP codon. - - The DNA fragment usedfor encoding the ORF will be added to the + + The DNA fragment usedfor encoding the ORF will be added to the comment field (TAB format only). - + -a, --allinternal By default the very first codon in each sequences is assumed to be the initial codon on the transcript. This means certain - non-methionine codons actually codes for metionine at this + non-methionine codons actually codes for metionine at this position. For example "TTG" in the standard genetic code (see above). - - Selecting this option treats all codons as internal codons. - + + Selecting this option treats all codons as internal codons. + -x, --readthroughstop Allow the translation to continue after a stop codon is reached. The stop codon will be marked as "*". - + -p, --plain, --ignoreannotation Ignore annotation for TAB files. If this options is selected TAB files will be treated in same way as FASTA files. - -c, --comment + -c, --comment Preserve the comment field in TAB files. Normally the comment field is silently dropped, since it makes no sense for FASTA files. - + -C, --processcomment Works as the -c option described above, except a bit of intelligent parsing is done on the comment field: If a "/spliced_product" sub-field is found (from TAB files create by FeatureExtract / gb2tab) only the part of the comment field before the DNA specific information - is kept in the comment field. + is kept in the comment field. -e, --exonstructure Default for TAB files. Annotate the underlying exons structure @@ -212,19 +212,19 @@ are fully or partially encoded within the first exon get the annotation character "1", positions in the secon exon get the character "2" etc. - + The hex-decimal system is used, which means up to 15 exons can be uniquely annotated, before the numbering wraps around to "0". - + -i, --intronphase Annotate where an intron interrupted the DNA sequences, and how the intron did cut the readingframe. - + 0 : phase-0 intron (inbetween the previous and current position). 1 : phase-1 intron. 2 : phase-2 intron. - - + + AUTHOR Rasmus Wernersson, raz@cbs.dtu.dk Feb-Mar 2006 @@ -234,11 +234,11 @@ WEB PAGE http://www.cbs.dtu.dk/services/VirtualRibosome/ - + REFERENCE Rasmus Wernersson Virtual Ribosome - Comprehensive DNA translation tool. - Submitted to Nucleic Acids Research, 2006 + Submitted to Nucleic Acids Research, 2006 """ import sys, re, mod_translate,string @@ -271,41 +271,41 @@ def makePretty(title,vals,labels,max_len): val = vals[j] lab = labels[j] pos = min(max_len,i+pwidth) - if lab: + if lab: spos = "%d" % pos else: spos = "" - + s = "%-2s %s %s\n" % (lab,val[i:pos],spos) l.append(s) l.append("\n") - return l + return l def explodePep(s): l = list(s) return " "+" ".join(l)+" " - + def revCom(dna): l = list(dna) l.reverse() rev_dna = "".join(l) return rev_dna.translate(transTable) - + def dnaComplement(dna): return dna.translate(transTable) - + def revStr(s): l = list(s) l.reverse() return "".join(l) - + def isDNAValid(dna): for c in dna: if not c in allValid: return False - + return True - + def combineToTab(name, seql): seq = "".join(seql) ann= "."*len(seq) @@ -320,19 +320,19 @@ def readRaw(lines): sl = [] for c in line.strip().upper(): if c.isalpha(): sl.append(c) - + seql.append("".join(sl)) - + l.append(combineToTab("Seq1",seql)) - return l - + return l + # Read FASTA format def readFasta(lines): l = [] - + name = "" seql = [] - + for line in lines: line = line.strip() if line.startswith(">"): @@ -342,104 +342,105 @@ def readFasta(lines): seql = [] else: seql.append(line) - + if name: l.append(combineToTab(name,seql)) - + return l -# read TAB format +# read TAB format def readTab(lines): l = [] - + for line in lines: line = line.strip() tokens = line.split("\t") if len(tokens) < 2: continue - + name = tokens[0] seq = tokens[1] - + if len(tokens) > 2: ann = tokens[2] else: ann = "."*len(seq) - + if len(tokens) > 3: com = tokens[3] else: com = "" - + l.append( (name,seq,ann,com) ) - + return l - + def readInput(lines): if not lines: return ([], True) - - line = lines[0] + + line = lines[0] tokens = line.split("\t") - + if line.startswith(">") and len(tokens) < 3: l = readFasta(lines) isFasta = True - + elif len(tokens) == 1: l = readRaw(lines) isFasta = True - + else: l = readTab(lines) isFasta = False - + return (l, isFasta) - + def writeFasta(seqs, outstream): for (name, seq, ann, com) in seqs: - print >> outstream, ">"+name + print(">"+name, file=outstream) for i in range(0,len(seq),60): - print >> outstream, seq[i:i+60] - + print(seq[i:i+60], file=outstream) + def writeTab(seqs, outstream): for tokens in seqs: - print >> outstream, "\t".join(tokens) + print("\t".join(tokens), file=outstream) def openForWriteOrDie(outfile): try: outstream = file(outfile,"w") - except IOError, (strerror): - print >> sys.stderr, "ERROR - cannot write to the specified file %s [%s]" % (outfile,strerror) + except IOError as xxx_todo_changeme: + (strerror) = xxx_todo_changeme + print("ERROR - cannot write to the specified file %s [%s]" % (outfile,strerror), file=sys.stderr) sys.exit(-1) - + return outstream def parseOpts(): # Quick hack to overrule the -h and --help feature # build into the optpase module if "-h" in sys.argv or "--help" in sys.argv: - print __doc__ + print(__doc__) sys.exit(0) parser = OptionParser() - + # File handling parser.add_option("-F","--outfile", type="string", dest="outfile", default="") parser.add_option("-O","--outformat", type="string", dest="outformat", default="AUTO") parser.add_option("--tab", type="string", dest="tabfile", default="") parser.add_option("--fasta", type="string", dest="fastafile", default="") parser.add_option("--report", type="string", dest="reportfile", default="") - + # Matrix parser.add_option("-m","--matrix", type="string", dest="matrix", default="1") - + # Reading frame parser.add_option("-r","--readingframe", type="string", dest="readingframe", default="1") - - # ORF finding + + # ORF finding parser.add_option("-o","--orf", type="string", dest="orf", default="") - + # Stop and Start codons parser.add_option("-a","--allinternal", action="store_true", dest="allinternal", default = False) parser.add_option("-x","--readthroughstop", action="store_true", dest="readthroughstop", default = False) @@ -455,38 +456,38 @@ def parseOpts(): # Debug parser.add_option("-d","--debug", action="store_true", dest="debug", default=False) - + (opt, args) = parser.parse_args() - + # Check reading frame if not opt.readingframe in ["1", "2", "3", "-1", "-2", "-3", "all", "plus","minus"]: sys.stderr.write("Invalid reading frame [%s]\n" % opt.readingframe) sys.exit(-1) - + if opt.readingframe in ["all","plus","minus"]: opt.readthroughstop = True - + # Chech ORF mode if not opt.orf in ["","strict","any","none"]: - print >> sys.stderr, "Invalid ORF mode [%s]\n" % opt.orf + print("Invalid ORF mode [%s]\n" % opt.orf, file=sys.stderr) sys.exit(-1) - + # Chech output format opt.outformat = opt.outformat.upper() if not opt.outformat in ["AUTO","TAB","FASTA","REPORT"]: - print >> sys.stderr("Invalid output format [%s]\n" % opt.outformat) + print(file=sys.stderr("Invalid output format [%s]\n" % opt.outformat)) sys.exit(-1) - + # Check mutually exclusive options if opt.intronrf: opt.exonann=False - + return (opt, args) if __name__ == "__main__": reports = [] pepseqs = [] opt, args = parseOpts() - + # Initialize translation matrix mtx = mod_translate.parseMatrixFile(opt.matrix) if not mtx: @@ -508,12 +509,12 @@ def parseOpts(): except: sys.stderr.write("ERROR: Cannot read from file '%s'\n" % fn) sys.exit(-1) - + try: (seq_list, isFasta) = readInput(lines) - except Exception, msg: - print >> sys.stderr, "ERROR parsing input files. Please verify the format (FASTA, RAW or TAB)" - print >> sys.stderr, "[%s]" % (str(msg)) + except Exception as msg: + print("ERROR parsing input files. Please verify the format (FASTA, RAW or TAB)", file=sys.stderr) + print("[%s]" % (str(msg)), file=sys.stderr) sys.exit(-1) # Ignore annotation? @@ -525,36 +526,36 @@ def parseOpts(): for (name, dna, ann, com) in seq_list: seq_proc = ann_proc = exnum_proc = "" - + # Test if the DNA sequence is valid if not isDNAValid(dna): sys.stderr.write("Non IUPAC characters is detected in sequence '%s' - skipping this entry\n" %name) #sys.stderr.write("seq: %s\n" % seq) continue - + # Files without intron/exon annotation ------------------------------------------- if isFasta: # reports.append([ORF_ANNOTATION]) - + d_collect = {} if opt.readingframe in ["all"]: rf_list = ["1","2","3","-1","-2","-3"] echo_rf = True - + elif opt.readingframe == "plus": rf_list = ["1","2","3"] echo_rf = True - + elif opt.readingframe == "minus": rf_list = ["-1","-2","-3"] echo_rf = True - + else: rf_list = [opt.readingframe] echo_rf = False - + for rf in rf_list: - + # Find current reading frame if rf == "1": qseq = dna @@ -574,19 +575,19 @@ def parseOpts(): # Do the actual translation pep = mod_translate.translate(qseq,mtx,not opt.allinternal,opt.readthroughstop) pa = mod_translate.annotate(qseq,mtx) - + # The annotation string may be longer that the peptide, if the -x more is not used - pa = pa[:len(pep)] + pa = pa[:len(pep)] # Store translated sequence if echo_rf: cname = name+"_rframe"+rf else: cname = name - + data = ( cname,pep,pa,qseq ) d_collect[rf] = data - + # Do ORF finding? if opt.orf: #Find longest ORF @@ -594,7 +595,7 @@ def parseOpts(): bestspan = (0,0) bestdata = None bestrf = "" - for key in d_collect.keys(): + for key in list(d_collect.keys()): data = d_collect[key] seq = data[1] ann = data[2] @@ -617,52 +618,52 @@ def parseOpts(): j = j_strict else: j = min(j_strict,j_any) - + if j == -1: break - + #Step 2 - find stop m = ann.find("*",j) if m == -1: m = len(ann) - - #print j,m - + + #print j,m + if (m - j) > bestlen: bestlen = m - j bestspan = (j, m) bestdata = data bestrf = key - + #print rf, bestlen #print seq[j:m+1] #print ann[j:m+1] - + j = m # Format the best hit if not bestdata: - bestdata = d_collect.values()[0] + bestdata = list(d_collect.values())[0] bestspan = (0,0) - bestrf = d_collect.keys()[0] - + bestrf = list(d_collect.keys())[0] + msg = "NO ORF FOUND (given the criteria '%s') for sequence '%s'\n\n" % (opt.orf,name) - reports.append([msg]) - + reports.append([msg]) + # clist = list(bestdata[1].lower()) name = bestdata[0] pep = bestdata[1] ann = bestdata[2] dna_work = bestdata[3] - + bpos, epos = bestspan orf_dna = dna_work[bpos*3:epos*3] orf = mod_translate.translate(orf_dna,mtx,True,False) new_pep = " "*bpos + orf + " "*(len(pep)-epos) - + name += "_ORF" - + d_collect = {} d_collect[bestrf] = (name,new_pep,ann,orf_dna) #print d_collect - + # Processing and Pretty printing... if opt.readingframe in ["all","plus","minus"] and (not opt.orf): if opt.readingframe == "all": @@ -677,17 +678,17 @@ def parseOpts(): dna_plus = dna dna_minus = revCom(dna) - + #dnapl = list(dna_plus) #dnaml = list(dna_minus) # dnapann = [" "]*len(dna_plus) # dnamann = [" "]*len(dna_minus) dnapann = ["."]*len(dna_plus) dnamann = ["."]*len(dna_minus) - + vals = [] labels = [] - + if doPlus: pep1 = d_collect["1"][1] ann1 = d_collect["1"][2] @@ -720,8 +721,8 @@ def parseOpts(): #dna_plus = "".join(dnapl) vals += [pep3e,pep2e,pep1e,dna_plus,"".join(dnapann)] labels += ["","","","5'",""] - - if doMinus: + + if doMinus: pepm1 = d_collect["-1"][1] annm1 = d_collect["-1"][2] pepm1e = explodePep(pepm1)+" "+" " @@ -741,7 +742,7 @@ def parseOpts(): peps = [pepm1,pepm2,pepm3] maxlen = max(len(pepm1),len(pepm2)) maxlen = max(maxlen,len(pepm3)) - + for i in range(0,maxlen): for j in range(0,3): ann = anns[j] @@ -766,37 +767,37 @@ def parseOpts(): # vals = [pep3,pep2,pep1,dna_plus,revStr(dna_minus),revStr(pepm1),revStr(pepm2),revStr(pepm3)] # labels = ["","","","5'","3'","","",""] title = "%s - reading frame(s): %s" % (name,opt.readingframe) - + l = makePretty(title,vals,labels,len(dna_plus)) - + ###print "".join(l) reports.append(l) - + else: - rf_list = d_collect.keys() + rf_list = list(d_collect.keys()) rf = rf_list[0] - + vals = [] labels = [] title = "%s\nReading frame: %s" % (name,rf) - + #rf_int = abs(int(rf)) - 1 pep = d_collect[rf][1] pepx = explodePep(pep) - + vals = [] labels = [] - + vals.append(pepx) labels.append("") - + pa = d_collect[rf][2] pax = ["."]*len(pa)*3 if rf.startswith("-"): dna_minus = revCom(dna) #print len(dna_minus) dnamann = ["."] * len(dna_minus) - if rf == "-1": + if rf == "-1": pepm = d_collect["-1"][1] annm = d_collect["-1"][2] pepme = explodePep(pepm)+" "+" " @@ -811,9 +812,9 @@ def parseOpts(): annm = d_collect["-3"][2] pepme = " "+explodePep(pepm)+" "+" " j = 2 - + pepme = pepme[:len(dna_minus)] - + for i in range(0,len(pepm)): ac = annm[i] if ac in ["M","m","*"]: @@ -852,42 +853,42 @@ def parseOpts(): if ac in ["M","m","*"]: dnapos = (i*3) + j if ac == "M": c = ">" - elif ac == "m": c = ")" + elif ac == "m": c = ")" else: c = "*" for k in range(dnapos,dnapos+3): dnapann[k] = c - + ann = "".join(dnapann) vals = [pepx,dna_plus,ann] - labels = ["","5'",""] - - + labels = ["","5'",""] + + l = makePretty(title,vals,labels,len(dna)) reports.append(l) ###print "".join(l) - - - for rf in rf_list: + + + for rf in rf_list: name,seq,ann,com = d_collect[rf] new_com = "" - + # Seq may contain leding and trailing spaces if we are in ORF finde mode if opt.orf: new_seq = [] new_ann = [] for i in range(0,len(seq)): - if seq[i] <> " ": + if seq[i] != " ": new_seq.append(seq[i]) new_ann.append(ann[i]) - + seq = "".join(new_seq) ann = "".join(new_ann) - + new_com = '/orf_mode="%s"; /dna="%s";' % (opt.orf,com) - + pepseqs.append( (name,seq,ann,new_com) ) # pepseqs.append( (cname,pep,pa,com.strip()) ) - + # Files with intron/exon annotation --------------------------------------------- else: exon_count = 1 @@ -895,17 +896,17 @@ def parseOpts(): start, end = mo.span() seq_proc += dna[start:end] ann_proc += ann[start:end] - + exnum_chr = "%x" % exon_count exnum_proc += exnum_chr * (end-start) exon_count = (exon_count + 1) % 0x10 - + # DEBUG if opt.debug: - print seq_proc - print ann_proc - print rf_proc - print exnum_proc + print(seq_proc) + print(ann_proc) + print(rf_proc) + print(exnum_proc) # Process comments if opt.keepcomment or opt.processcomment: @@ -928,37 +929,37 @@ def parseOpts(): rf_proc = "012" * (len(ann_proc) / 3) rf_proc += "012"[:len(ann_proc) % 3] - for i in range(1,len(pa)*3): # Skip first position + for i in range(1,len(pa)*3): # Skip first position if ann_proc[i] == "(": pa[i/3] = rf_proc[i] # Store translated sequence prot_ann = "".join(pa) pepseqs.append( (name,pep,prot_ann,com.strip()) ) - + # Pretty printing for the report title = "%s - " % (name) if opt.exonann: title += "translation and annotation of the exonic structure" - + elif opt.intronrf: title += "translation and annotation of the position and phase of the introns" - + vals = [pep,prot_ann] labels = ["pep:","ann:"] l = makePretty(title,vals,labels,len(pep)) reports.append(l) - + # Output the results ------------------------------------------------------- # Step 1) Combined results. if opt.outfile: outstrem = openForWriteOrDie(opt.outfile) else: outstream = sys.stdout - + if opt.outformat in ["REPORT","AUTO"]: for l in reports: outstream.writelines(l) - print >> outstream, "//" - + print("//", file=outstream) + if "TAB" == opt.outformat: outFasta = False elif "FASTA" == opt.outformat: @@ -970,24 +971,24 @@ def parseOpts(): writeFasta(pepseqs,outstream) else: writeTab(pepseqs,outstream) - - #outstream.close() + + #outstream.close() # Step 2) Write specifik sub-result if requested if opt.reportfile: if opt.reportfile == "-": outstream = sys.stdout else: outstream = openForWriteOrDie(opt.reportfile) - + for l in reports: outstream.writelines(l) - + if opt.fastafile: if opt.fastafile == "-": outstream = sys.stdout else: outstream = openForWriteOrDie(opt.fastafile) - + writeFasta(pepseqs,outstream) - + if opt.tabfile: if opt.tabfile == "-": outstream = sys.stdout else: outstream = openForWriteOrDie(opt.tabfile) - + writeTab(pepseqs,outstream) diff --git a/bin/virtualribosomev2/mod_translate.py b/bin/virtualribosomev2/mod_translate.py index c9017f9..a555603 100644 --- a/bin/virtualribosomev2/mod_translate.py +++ b/bin/virtualribosomev2/mod_translate.py @@ -1,4 +1,4 @@ -#!/usr/local/python/bin/python +#!/usr/bin/env python3 # Copyright 2002,2003,2004,2005 Rasmus Wernersson, Technical University of Denmark # @@ -35,7 +35,7 @@ def __init__(self): self.description = "" self.d_all = {} self.d_first = {} - + def toString(self): return "Description: %s\nd_all: %s\nd_first: %s" % (self.description,str(self.d_all),str(self.d_first)) @@ -96,7 +96,7 @@ def toString(self): iupac["N"] = "ACGT" #aNy -alphaDNA = "ACGTRYMKWSBDHVN" +alphaDNA = "ACGTRYMKWSBDHVN" alphaDNAStrict = "ACGT" alphaPep ="*ACDEFGHIKLMNPQRSTVWY" @@ -112,19 +112,19 @@ def parseNcbiTable(lines): for line in lines.split("\n"): line = line.strip() #print "!!!"+line - + if line.startswith("name ") and (desc == ""): dRec.description += line.split('"')[1]+" " - + elif line.startswith("id "): tab_id = line.split()[1] - + elif line.startswith("ncbieaa"): aa_all = line.split('"')[1] - + elif line.startswith("sncbieaa"): aa_first = line.split('"')[1] - + c = 0 for b1 in "TCAG": for b2 in "TCAG": @@ -134,7 +134,7 @@ def parseNcbiTable(lines): aaf = aa_first[c] if aaf == "-": aaf = aa_all[c] dRec.d_first[codon] = aaf - + c += 1 result[tab_id] = dRec dRec = TransTableRec() @@ -145,51 +145,51 @@ def parseMatrixLines(iterator): result = {} for line in iterator: line = line.strip() - - if not line: + + if not line: continue # Ignore blank lines - if line.startswith("#"): + if line.startswith("#"): continue # Ignore comment lines - + tokens = line.split() try: codon, aa = tokens - + # Skip invalid entries - if len(codon) <> 3: + if len(codon) != 3: badCodon = 1 else: codon = codon.upper().replace("U","T") - for c in codon: + for c in codon: if not c in alphaDNAStrict: badCodon = 1 badCodon = 0 - + if badCodon: raise "Bad codon: %s [%s]" % (codon,line) - - - if len(aa) <> 1: #or (not aa in alphaPep): + + + if len(aa) != 1: #or (not aa in alphaPep): raise "Bad aa: %s [%s]" % (aa,line) - + result[codon] = aa - - except Exception, e: + + except Exception as e: if DEBUG: sys.stderr.write("Matrix Error - %s\n" % e) - + if len(d) != 64 and DEBUG: sys.stderr.write("Matrix Error - size of matrix differs from 64 [%i]\n" % len(d)) - + return result - + def parseMatrixFile(filename): - if d_ncbi_table.has_key(filename): + if filename in d_ncbi_table: dRec = d_ncbi_table[filename] return dRec - + dRec = TransTableRec() - dRec.d_all = parseMatrixLines(open(filename,"r").xreadlines()) + dRec.d_all = parseMatrixLines(open(filename,"r")) dRec.d_first = dRec.d_all dRec.description = "Custom translation table '%s'" % filename return dRec @@ -208,29 +208,29 @@ def trim_old(seq): # Assumption: Degenerate codons are rare - speed is not an issue def decode(codon,dRec,isFirst): if len(codon) != 3: return [] - + #Use the relevant translation table if isFirst: d_gc = dRec.d_first else: d_gc = dRec.d_all - + #Check for the simple case: this is a standard non-degenerate codon - if d_gc.has_key(codon): + if codon in d_gc: return [ d_gc[codon]] - + #The codon is to some degree degenerate - start the whole recursive scheme result = [] - + for i in range(0,3): p = iupac[codon[i]] if (len(p) > 1): for c in p: result += (decode(codon[0:i]+c+codon[i+1:3],dRec,isFirst)) return result - + if len(p) == 0: return [] # Unknown/illegal char #return [d[codon]] - + def condense(lst): result = [] for e in lst: @@ -239,7 +239,7 @@ def condense(lst): def translate(seq,transRec): return translate(seq,transRec,True,True) - + def translate(seq,transRec,firstIsStartCodon,readThroughStopCodon): debug = False if not transRec: @@ -248,14 +248,14 @@ def translate(seq,transRec,firstIsStartCodon,readThroughStopCodon): result = [] seq = trim(seq) if firstIsStartCodon: isFirst = True - else: isFirst = False + else: isFirst = False for i in range(0,len(seq),3): aa = condense(decode(seq[i:i+3],transRec,isFirst)) - if debug: print seq[i:i+3], aa + if debug: print(seq[i:i+3], aa) if aa: - if aa[0] == "*" and not readThroughStopCodon: + if aa[0] == "*" and not readThroughStopCodon: break - + if len(aa) == 1: result.append(aa[0]) else: s = string.join(aa,"") @@ -264,12 +264,12 @@ def translate(seq,transRec,firstIsStartCodon,readThroughStopCodon): else : result.append("X") #Any #print seq[i:i+3] isFirst = False - - pepseq = "".join(result) + + pepseq = "".join(result) if debug: - print pepseq + print(pepseq) return pepseq - + # Annotate all possible start and stop codons def annotate(seq,transRec): debug = False @@ -279,18 +279,18 @@ def annotate(seq,transRec): for i in range(0,len(seq),3): codon = seq[i:i+3] aa = condense(decode(codon,transRec,True)) - if debug: print seq[i:i+3], aa + if debug: print(seq[i:i+3], aa) if aa: - if "*" in aa: + if "*" in aa: result.append("*") elif ["M"] == aa: aa_int = condense(decode(codon,transRec,False)) if aa_int == ["M"]: result.append("M") else: result.append("m") - else: - result.append(".") - - return "".join(result) + else: + result.append(".") + + return "".join(result) #def translate(seq): # translate(seq,None) @@ -298,10 +298,10 @@ def annotate(seq,transRec): try: import ncbi_genetic_codes d_ncbi_table = parseNcbiTable(ncbi_genetic_codes.ncbi_gc_table) - + except: pass - + if __name__ == "__main__": for line in sys.stdin.readlines(): - print translate(line,None,True,False) + print(translate(line,None,True,False)) From 33f5f3b0e95d772c65923eb10445b54694938ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 14:10:55 -0800 Subject: [PATCH 019/223] Change file to open. Fix tabs --- bin/virtualribosomev2/dna2pep.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/bin/virtualribosomev2/dna2pep.py b/bin/virtualribosomev2/dna2pep.py index 9d4e9f9..1ab8eff 100644 --- a/bin/virtualribosomev2/dna2pep.py +++ b/bin/virtualribosomev2/dna2pep.py @@ -248,7 +248,7 @@ complDNA = "TAACGRYWSMKVHDBN" allValid = validDNA+validDNA.lower() -transTable = string.maketrans(validDNA+validDNA.lower(),complDNA+complDNA.lower()) +transTable = str.maketrans(validDNA+validDNA.lower(),complDNA+complDNA.lower()) pwidth = 90 @@ -407,7 +407,7 @@ def writeTab(seqs, outstream): def openForWriteOrDie(outfile): try: - outstream = file(outfile,"w") + outstream = open(outfile,"w") except IOError as xxx_todo_changeme: (strerror) = xxx_todo_changeme @@ -417,11 +417,11 @@ def openForWriteOrDie(outfile): return outstream def parseOpts(): - # Quick hack to overrule the -h and --help feature - # build into the optpase module - if "-h" in sys.argv or "--help" in sys.argv: - print(__doc__) - sys.exit(0) + # Quick hack to overrule the -h and --help feature + # build into the optpase module + if "-h" in sys.argv or "--help" in sys.argv: + print(__doc__) + sys.exit(0) parser = OptionParser() @@ -454,10 +454,10 @@ def parseOpts(): parser.add_option("-c","--comment", action = "store_true", dest = "keepcomment", default=False) parser.add_option("-C","--processcomment", action = "store_true", dest = "processcomment", default=False) - # Debug - parser.add_option("-d","--debug", action="store_true", dest="debug", default=False) + # Debug + parser.add_option("-d","--debug", action="store_true", dest="debug", default=False) - (opt, args) = parser.parse_args() + (opt, args) = parser.parse_args() # Check reading frame if not opt.readingframe in ["1", "2", "3", "-1", "-2", "-3", "all", "plus","minus"]: @@ -505,7 +505,7 @@ def parseOpts(): lines = [] for fn in args: try: - lines += (file(fn,"r").readlines()) + lines += (open(fn,"r").readlines()) except: sys.stderr.write("ERROR: Cannot read from file '%s'\n" % fn) sys.exit(-1) From e1d01d1864484325c37f8477d3c24a41f86404b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 14:13:55 -0800 Subject: [PATCH 020/223] Change permissions --- bin/virtualribosomev2/dna2pep.py | 0 bin/virtualribosomev2/mod_translate.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/virtualribosomev2/dna2pep.py mode change 100644 => 100755 bin/virtualribosomev2/mod_translate.py diff --git a/bin/virtualribosomev2/dna2pep.py b/bin/virtualribosomev2/dna2pep.py old mode 100644 new mode 100755 diff --git a/bin/virtualribosomev2/mod_translate.py b/bin/virtualribosomev2/mod_translate.py old mode 100644 new mode 100755 From 412b1d4a6f714b7589b45cf83482b85edddd936f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 14:24:31 -0800 Subject: [PATCH 021/223] Remove py2 processes(translation) --- vAMPirus.nf | 453 +++++++++++++++++++++------------------------------- 1 file changed, 181 insertions(+), 272 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 8810a6b..3870224 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -938,225 +938,194 @@ if (params.DataCheck || params.Analyze) { } } - if (params.sing) { + process Translation_For_ProteinBased_Clustering_DC { - process Translating_For_ProteinClustering_DC { + label 'norm_cpus' - label 'low_cpus' + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true + input: + file(fasta) from nucl2aa - input: - file(fasta) from nucl2aa + output: + file("*ASVprotforclust.fasta") into clustering_aa + file("*_translation_report") into reportaa_VR + file("*_ASV_all.fasta") into asvfastaforaaclust - output: - file("*ASVprotforclust.fasta") into clustering_aa - file("*_translation_report") into reportaa_VR - file("*_ASV_all.fasta") into asvfastaforaaclust + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report + cp ${fasta} ${params.projtag}_ASV_all.fasta + """ + } - script: - """ - conda init && source activate virtualribosome + process Protein_clustering_DC { - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report - cp ${fasta} ${params.projtag}_ASV_all.fasta - """ + label 'norm_cpus' - } + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid", mode: "copy", overwrite: true, pattern: '*{.csv}' - } else { + input: + file(fasta) from clustering_aa + file(asvs) from asvfastaforaaclust - process Translation_For_ProteinBased_Clustering_DC { + output: + file("number_per_percentage_prot.csv") into number_per_percent_prot_plot - label 'norm_cpus' + script: + // add awk script to count seqs + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + for id in `echo ${params.datacheckaaIDlist} | tr "," "\\n"`;do + if [ \${id} == ".55" ];then + word=3 + elif [ \${id} == ".65" ];then + word=4 + else + word=5 + fi + awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta + cd-hit -i ${params.projtag}_filtered_proteins.fasta -n \${word} -c \${id} -o ${params.projtag}_pcASV\${id}.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr + grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list + y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) + echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr + t=1 + b=1 + for x in \$(cat temporaryclusters.list);do + echo "Extracting \$x" + name="\$( echo \$x | awk -F ">" '{print \$2}')" + clust="pcASV"\${t}"" + echo "\${name}" + awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list + t=\$(( \${t}+1 )) + b=\$(( \${b}+1 )) + done + ls *_tmp.list + u=1 + for x in *_tmp.list;do + name="\$(echo \$x | awk -F "_p" '{print \$1}')" + echo "\${name}" + cluster="\$(echo \$x | awk -F "_" '{print \$3}')" + echo "\${cluster}" + grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list + seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta + vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta + grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list + for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do + echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders + u=\$(( \${u}+1 )) + done + u=1 + ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta + done + cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv + grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list + j=1 + for x in \$(cat lala.list);do + echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list + echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv + j=\$(( \${j}+1 )) + done + rm lala.list + awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list + for x in \$(cat tmporder.list);do + grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list + done + paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv + ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta + stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true + stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta + else + rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta + fi + rm *.list + rm Cluster* + rm *types* + rm *tmp* + rm ${params.projtag}_pcASV\${id}.fast* + done + for x in *aminoacid*noTaxonomy.fasta;do + id=\$( echo \$x | awk -F "_noTax" '{print \$1}' | awk -F "pcASV" '{print \$2}') + numb=\$( grep -c ">" \$x) + echo "\${id},\${numb}" >> number_per_percentage_protz.csv + done + yesirr=\$( wc -l number_per_percentage_protz.csv | awk '{print \$1}') + tail -\$(( \${yesirr}-1 )) number_per_percentage_protz.csv > number_per_percentage_prot.csv + head -1 number_per_percentage_protz.csv >> number_per_percentage_prot.csv + rm number_per_percentage_protz.csv + """ + } - conda 'python=2.7' + if (!params.skipReadProcessing || !params.skipMerging ) { - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true + process combine_csv_DC { - input: - file(fasta) from nucl2aa + input: + file(csv) from fastp_csv_in1 + .collect() output: - file("*ASVprotforclust.fasta") into clustering_aa - file("*_translation_report") into reportaa_VR - file("*_ASV_all.fasta") into asvfastaforaaclust + file("final_reads_stats.csv") into fastp_csv_dc script: """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report - cp ${fasta} ${params.projtag}_ASV_all.fasta + cat ${csv} >all_reads_stats.csv + head -n1 all_reads_stats.csv >tmp.names.csv + cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv + cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv + rm tmp.names.csv tmp.reads.stats.csv """ - } - } - process Protein_clustering_DC { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid", mode: "copy", overwrite: true, pattern: '*{.csv}' - - input: - file(fasta) from clustering_aa - file(asvs) from asvfastaforaaclust + } + } else { + process skip_combine_csv_DC { output: - file("number_per_percentage_prot.csv") into number_per_percent_prot_plot + file("filter_reads.txt") into fastp_csv_dc script: - // add awk script to count seqs """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - for id in `echo ${params.datacheckaaIDlist} | tr "," "\\n"`;do - if [ \${id} == ".55" ];then - word=3 - elif [ \${id} == ".65" ];then - word=4 - else - word=5 - fi - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -n \${word} -c \${id} -o ${params.projtag}_pcASV\${id}.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr - grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list - y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) - echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr - t=1 - b=1 - for x in \$(cat temporaryclusters.list);do - echo "Extracting \$x" - name="\$( echo \$x | awk -F ">" '{print \$2}')" - clust="pcASV"\${t}"" - echo "\${name}" - awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list - t=\$(( \${t}+1 )) - b=\$(( \${b}+1 )) - done - ls *_tmp.list - u=1 - for x in *_tmp.list;do - name="\$(echo \$x | awk -F "_p" '{print \$1}')" - echo "\${name}" - cluster="\$(echo \$x | awk -F "_" '{print \$3}')" - echo "\${cluster}" - grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list - seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta - vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta - grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list - for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do - echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders - u=\$(( \${u}+1 )) - done - u=1 - ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta - done - cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv - ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta - stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true - stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta - else - rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta - fi - rm *.list - rm Cluster* - rm *types* - rm *tmp* - rm ${params.projtag}_pcASV\${id}.fast* - done - for x in *aminoacid*noTaxonomy.fasta;do - id=\$( echo \$x | awk -F "_noTax" '{print \$1}' | awk -F "pcASV" '{print \$2}') - numb=\$( grep -c ">" \$x) - echo "\${id},\${numb}" >> number_per_percentage_protz.csv - done - yesirr=\$( wc -l number_per_percentage_protz.csv | awk '{print \$1}') - tail -\$(( \${yesirr}-1 )) number_per_percentage_protz.csv > number_per_percentage_prot.csv - head -1 number_per_percentage_protz.csv >> number_per_percentage_prot.csv - rm number_per_percentage_protz.csv + echo "Read processing steps skipped." >filter_reads.txt """ } + } - if (!params.skipReadProcessing || !params.skipMerging ) { - - process combine_csv_DC { - - input: - file(csv) from fastp_csv_in1 - .collect() - - output: - file("final_reads_stats.csv") into fastp_csv_dc - - script: - """ - cat ${csv} >all_reads_stats.csv - head -n1 all_reads_stats.csv >tmp.names.csv - cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv - cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv - rm tmp.names.csv tmp.reads.stats.csv - """ - - } - } else { - - process skip_combine_csv_DC { - output: - file("filter_reads.txt") into fastp_csv_dc - - script: - """ - echo "Read processing steps skipped." >filter_reads.txt - """ - } - } - - report_dc_in = Channel.create() - fastp_csv_dc.mix( reads_per_sample_preFilt, reads_per_sample_postFilt, prefilt_basefreq, postFilt_basefreq, prefilt_qualityscore, postFilt_qualityscore, prefilt_gccontent, postFilt_gccontent, prefilt_averagequality, postFilt_averagequality, prefilt_length, postFilt_length, number_per_percent_nucl_plot, number_per_percent_prot_plot - ).into(report_dc_in) + report_dc_in = Channel.create() + fastp_csv_dc.mix( reads_per_sample_preFilt, reads_per_sample_postFilt, prefilt_basefreq, postFilt_basefreq, prefilt_qualityscore, postFilt_qualityscore, prefilt_gccontent, postFilt_gccontent, prefilt_averagequality, postFilt_averagequality, prefilt_length, postFilt_length, number_per_percent_nucl_plot, number_per_percent_prot_plot + ).into(report_dc_in) - process Report_DataCheck { + process Report_DataCheck { - label 'norm_cpus' + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Report", mode: "copy", overwrite: true, pattern: '*.{html}' + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Report", mode: "copy", overwrite: true, pattern: '*.{html}' - input: - file(files) from report_dc_in - .collect() + input: + file(files) from report_dc_in + .collect() - output: - file("*.html") into datacheckreport + output: + file("*.html") into datacheckreport - script: - """ - cp ${params.vampdir}/bin/vAMPirus_DC_Report.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_DC_Report.Rmd',output_file='${params.projtag}_DataCheck_Report.html')" ${params.projtag} \ - ${params.skipReadProcessing} \ - ${params.skipMerging} \ - ${params.skipAdapterRemoval} - """ - } + script: + """ + cp ${params.vampdir}/bin/vAMPirus_DC_Report.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_DC_Report.Rmd',output_file='${params.projtag}_DataCheck_Report.html')" ${params.projtag} \ + ${params.skipReadProcessing} \ + ${params.skipMerging} \ + ${params.skipAdapterRemoval} + """ + } } else if (params.Analyze) { @@ -1994,53 +1963,24 @@ if (params.DataCheck || params.Analyze) { if (!params.skipAminoTyping) { - if (params.sing) { - - process Translating_For_Aminotypes { - - label 'low_cpus' + process Translate_For_AminoTyping { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true - - input: - file(fasta) from asvsforAminotyping - - output: - file("${params.projtag}_all_translations.fasta") into amintypegen - file("${params.projtag}_translation_report") into proteinstage_vap_report - - script: - """ - conda init && source activate virtualribosome - - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report - """ - - } - - } else { - - process Translate_For_AminoTyping { - - label 'low_cpus' - - conda 'python=2.7' + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true - input: - file(fasta) from asvsforAminotyping + input: + file(fasta) from asvsforAminotyping - output: - file("${params.projtag}_all_translations.fasta") into amintypegen - file("${params.projtag}_translation_report") into proteinstage_vap_report + output: + file("${params.projtag}_all_translations.fasta") into amintypegen + file("${params.projtag}_translation_report") into proteinstage_vap_report - script: - """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report - """ - } - } + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report + """ + } process Generate_AminoTypes { @@ -2423,57 +2363,26 @@ if (params.DataCheck || params.Analyze) { if (params.pcASV) { // ASV_nucl -> ASV_aa -> clusteraa by %id with ch-hit -> extract representative nucl sequences to generate new OTU file - if (params.sing) { - - process Translating_For_pcASV_Generation { + process Translation_For_pcASV_Generation { - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' - - input: - file(fasta) from nucl2aa - - output: - file("*ASV*translations.fasta") into clustering_aa - file("*_ASV_translations_report") into reportaa_VR - file("*_ASV_nucleotide.fasta") into asvfastaforaaclust - - script: - """ - conda init && source activate virtualribosome - - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report - cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta - """ - - } - - } else { - - process Translation_For_pcASV_Generation { - - label 'low_cpus' - - conda 'python=2.7' + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' - input: - file(fasta) from nucl2aa + input: + file(fasta) from nucl2aa - output: - file("*ASV*translations.fasta") into clustering_aa - file("*_ASV_translations_report") into reportaa_VR - file("*_ASV_nucleotide.fasta") into asvfastaforaaclust + output: + file("*ASV*translations.fasta") into clustering_aa + file("*_ASV_translations_report") into reportaa_VR + file("*_ASV_nucleotide.fasta") into asvfastaforaaclust - script: - """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report - cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta - """ - } - } + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report + cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta + """ + } process Generate_pcASVs { From b97a41ad6f4034ce333d8411c88ffac7d3a41203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 16:03:34 -0800 Subject: [PATCH 022/223] Refactor code. Divide asv and ncasv processes --- vAMPirus.nf | 1077 +++++++++++++++++++++------------------------------ 1 file changed, 452 insertions(+), 625 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 3870224..38124f7 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1131,6 +1131,9 @@ if (params.DataCheck || params.Analyze) { if (params.ncASV) { + reads_vsearch5_ch + .into{ asv_file_for_ncasvs; nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch } + process NucleotideBased_ASV_clustering { label 'norm_cpus' @@ -1139,55 +1142,40 @@ if (params.DataCheck || params.Analyze) { input: each x from 1..nnuc - file(fasta) from reads_vsearch5_ch + file(fasta) from asv_file_for_ncasvs output: - //HERE - sepearte avs and ncasv out and proceeses. matrix, couts and phylogeny - tuple file("*_ncASV*.fasta"), file("*ASV.fasta") into ( nuclFastas_forDiamond_ch, nuclFastas_forCounts_ch, nuclFastas_forMatrix_ch) - file("*_ncASV*.fasta") into nuclFastas_forphylogeny_ncasv - file("*ASV.fasta") into nuclFastas_forphylogeny_asv + file("*_ncASV*.fasta") into ( nuclFastas_forphylogeny_ncasv, nuclFastas_forDiamond_ncasv_ch, nuclFastas_forCounts_ncasv_ch, nuclFastas_forMatrix_ncasv_ch ) script: if (params.clusterNuclIDlist) { nid=slist1.get(x-1) """ - cp ${fasta} ./${params.projtag}_ASV.fasta - vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id ${nid} + vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id ${nid} """ } else if (params.clusterNuclID) { """ - cp ${fasta} ./${params.projtag}_ASV.fasta - id=${params.clusterNuclID} - vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id \${id} + vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id ${params.clusterNuclID} """ } } - } else { - reads_vsearch5_ch - .into{ nuclFastas_forDiamond_ch; nuclFastas_forCounts_ch; nuclFastas_forphylogeny; nuclFastas_forMatrix_ch } - } - - if (!params.skipTaxonomy) { - if (params.ncASV) { + if (!params.skipTaxonomy) { process Nucleotide_Taxonomy_Inference { label 'high_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy", mode: "copy", overwrite: true, pattern: '*ncASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*ncASV*dmd.out' input: - tuple file(notus), file(asvs) from nuclFastas_forDiamond_ch + file(asvs) from nuclFastas_forDiamond_ncasv_ch output: - file("*.fasta") into tax_labeled_fasta - tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond - file("*ncASV*summary_for_plot.csv") into taxplot1a - file("*_ASV*_summary_for_plot.csv") into taxplot1 + file("*.fasta") into tax_labeled_fasta1 + tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_ncasv + file("*ncASV*summary_for_plot.csv") into taxplot_ncasv script: """ @@ -1195,133 +1183,6 @@ if (params.DataCheck || params.Analyze) { virdb=${params.dbdir}/${params.dbname} grep ">" \${virdb} > headers.list headers="headers.list" - for filename in ${notus};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - j=1 - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - echo "[ncASV#]" > otu.list - echo "[ncASV sequence length]" > length.list - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - fi - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " - done for filename in ${asvs};do name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 @@ -1452,513 +1313,479 @@ if (params.DataCheck || params.Analyze) { rm headers.list """ } + } - } else { + process Generate_ncASV_Counts_Table { - process ASV_Taxonomy_Inference { + label 'norm_cpus' - label 'high_cpus' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*_ASV*.{biome,csv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Counts", mode: "copy", overwrite: true, pattern: '*ncASV*.{biome,csv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' + input: + file(notus) from nuclFastas_forCounts_ncasv_ch + file(merged) from nuclCounts_mergedreads_ch - input: - file(reads) from nuclFastas_forDiamond_ch + output: + tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch + tuple val("${id}"), file("*ncASV*counts.csv") into notu_counts_plots + file("*_ASV*counts.csv") into asv_counts_plots - output: - file("*.fasta") into tax_labeled_fasta - tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond - file("*_ASV*_summary_for_plot.csv") into taxplot1 - script: - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - for filename in ${reads};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - j=1 - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - else - for s in \$(cat seqids.lst);do - echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - fi - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " - done - rm headers.list - """ - } - } + script: + """ + for filename in ${notus};do + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv + fi + done + """ } - if (params.ncASV) { + process Generate_ncASV_Matrices { - process Generate_Counts_Tables_Nucleotide { + label 'low_cpus' - label 'norm_cpus' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Matrices", mode: "copy", overwrite: true, pattern: '*ncASV*PercentID.matrix' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*_ASV*.{biome,csv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Counts", mode: "copy", overwrite: true, pattern: '*ncASV*.{biome,csv}' + input: - input: - tuple file(notus), file(asvs) from nuclFastas_forCounts_ch - file(merged) from nuclCounts_mergedreads_ch + file(notus) from nuclFastas_forMatrix_ncasv_ch - output: - tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch - tuple val("${id}"), file("*ncASV*counts.csv") into notu_counts_plots - file("*_ASV*counts.csv") into asv_counts_plots + output: + file("*.matrix") into clustmatrices_ncasv + file("*ncASV*PercentID.matrix") into notu_heatmap - script: - """ - for filename in ${notus};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - fi - done - if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv + script: + // remove if statement later (no fin) + """ + for filename in ${notus};do + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done fi - """ + done + """ } - } else { - process Generate_ASV_Counts_Tables { - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*ASV*.{biome,csv}' - - input: - file(asvs) from nuclFastas_forCounts_ch - file(merged) from nuclCounts_mergedreads_ch + if (!params.skipPhylogeny) { - output: - tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch - file("*_ASV*counts.csv") into asv_counts_plots + process ncASV_Phylogeny { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ncASV*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ncASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ncASV*iq*' + + input: + file(asvs) from nuclFastas_forphylogeny_ncasv + + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_ncasv + file("*iq.treefile") into nucl_phyl_plot_ncasv + + script: + """ + pre=\$(echo ${asvs} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + # Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + fi + """ + } - script: - """ - if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - fi - """ - } } - if (params.ncASV) { + } else { + reads_vsearch5_ch + .into{ nuclFastas_forDiamond_ch; nuclFastas_forCounts_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_ch } + } - process Generate_Nucleotide_Matrix { + process ASV_Taxonomy_Inference { - label 'low_cpus' + label 'high_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*_ASV*PercentID.matrix' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Matrix", mode: "copy", overwrite: true, pattern: '*ncASV*PercentID.matrix' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' - input: - tuple file(notus), file(asvs) from nuclFastas_forMatrix_ch + input: + file(reads) from nuclFastas_forDiamond_asv_ch - output: - file("*.matrix") into clustmatrices - file("*ncASV*PercentID.matrix") into notu_heatmap - file("*_ASV*PercentID.matrix") into asv_heatmap + output: + file("*.fasta") into tax_labeled_fasta2 + tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv + file("*_ASV*_summary_for_plot.csv") into taxplot_asv - script: - // remove if statement later (no fin) - """ - for filename in ${notus};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + for filename in ${reads};do + name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') + diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + j=1 + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + echo "[ASV#]" > otu.list + echo "[ASV sequence length]" > length.list + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." fi + fi + echo "Done with \$s" done - if [ `echo ${asvs} | grep -c "_ASV"` -eq 1 ];then - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - clustalo -i ${asvs} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i ${asvs} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done + else + for s in \$(cat seqids.lst);do + echo "[ASV#]" > otu.list + echo "[ASV sequence length]" > length.list + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi fi - """ - } - } else { + echo "Done with \$s" + done + fi + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm *asvnames.txt + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: \${filename} " + done + rm headers.list + """ + } - process Generate_ASV_Matrix { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*ASV*PercentID.matrix' - - input: - file(reads) from nuclFastas_forMatrix_ch - - output: - file("*.matrix") into clustmatrices - file("*_ASV*PercentID.matrix") into asv_heatmap - - script: - // remove if statement later (no fin) - """ - for filename in ${reads};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - else - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - fi - done - """ - } - } + process Generate_ASV_Counts_Tables { - if (!params.skipPhylogeny) { // need to edit paths - - nuclFastas_forphylogeny_asv = Channel.create() - nuclFastas_forphylogeny_ncasv = Channel.create() - nuclFastas_forphylogeny.into(nuclFastas_forphylogeny_asv, nuclFastas_forphylogeny_ncasv) - - process ASV_Phylogeny { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' - - input: - file(asvs) from nuclFastas_forphylogeny_asv - - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results - file("*iq.treefile") into nucl_phyl_plot - - script: - """ - pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - done - """ - } - - if (params.ncASV) { - - process ncASV_Phylogeny { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ncASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ncASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ncASV*iq*' - - input: - tuple file(notus), file(asvs) from nuclFastas_forphylogeny_ncasv - - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_ncasv - file("*iq.treefile") into nucl_phyl_plot_ncasv - - script: - """ - for filename in ${notus};do - pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - fi - done - """ - } + label 'norm_cpus' - } + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*ASV*.{biome,csv}' + + input: + file(asvs) from nuclFastas_forCounts_asv_ch + file(merged) from nuclCounts_mergedreads_ch + + output: + tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch_asv + file("*_ASV*counts.csv") into asv_counts_plots_asv + + script: + """ + if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv + fi + """ + } + + process Generate_ASV_Matrices { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*ASV*PercentID.matrix' + input: + file(reads) from nuclFastas_forMatrix_asv_ch + + output: + file("*.matrix") into clustmatrices_asv + file("*_ASV*PercentID.matrix") into asv_heatmap_asv + + script: + // remove if statement later (no fin) + """ + for filename in ${reads};do + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + else + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + fi + done + """ + } + + if (!params.skipPhylogeny) { // need to edit paths + + process ASV_Phylogeny { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ASV*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' + + input: + file(asvs) from nuclFastas_forphylogeny_asv + + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_asv + file("*iq.treefile") into nucl_phyl_plot_asv + + script: + """ + pre=\$(echo ${asvs} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + # Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } } if (!params.skipAminoTyping) { @@ -2035,7 +1862,7 @@ if (params.DataCheck || params.Analyze) { """ } - process Generate_AminoType_Matrix { + process Generate_AminoType_Matrices { label 'low_cpus' From 449669eebc98eb7bd35f94552d04b1b22f90dd56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 16:20:09 -0800 Subject: [PATCH 023/223] Remove . --- vampirus.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vampirus.config b/vampirus.config index fbd73e3..aff8d25 100644 --- a/vampirus.config +++ b/vampirus.config @@ -58,11 +58,11 @@ params { // Minimum size or representation for sequence to be considered in ASV generation minSize="8" // Percent similarity to cluster nucleotide ASV sequences - clusterNuclID=".85" + clusterNuclID="85" // List of percent similarities to cluster nucleotide ASV sequences - must be separated by a comma (ex. ".95,.96") clusterNuclIDlist="" // Default percent similarity to cluster aminoacid sequences - clusterAAID=".97" + clusterAAID="97" // List of percent similarities to cluster aminoacid sequences - must be separated by ".95,.96" clusterAAIDlist="" // Minimum length of amino acid translation to be considered during protein clustered ASV (pcASV) generation. Recommended to put this at the expected aminoacid sequence length based on your maximum read length (e.g. if maxLen="420", then minAA should be 420/3 or 140) @@ -71,7 +71,7 @@ params { // Counts table generation parameters // Percent similarity to use for ASV/cASV counts table generation with vsearch - asvcountID=".97" + asvcountID="97" // Parameters for protein counts table generation // Minimum Bitscore for counts ProtCountsBit="50" From 1e858a7be875e8013b401d908be39e59cae1e6b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 16:20:19 -0800 Subject: [PATCH 024/223] Add percentage --- vAMPirus.nf | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 38124f7..f3793e7 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -472,7 +472,7 @@ if (params.readsTest) { } // HERE fix if stament and list names. Also is not an integer -if (params.clusterNuclIDlist == "") { +if (!params.clusterNuclIDlist == "") { msize=params.clusterNuclIDlist def slist=msize.split(',').collect{it as int} def nnuc=slist.size() @@ -1151,11 +1151,11 @@ if (params.DataCheck || params.Analyze) { if (params.clusterNuclIDlist) { nid=slist1.get(x-1) """ - vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id ${nid} + vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id .${nid} """ } else if (params.clusterNuclID) { """ - vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id ${params.clusterNuclID} + vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id .${params.clusterNuclID} """ } } @@ -1173,7 +1173,7 @@ if (params.DataCheck || params.Analyze) { file(asvs) from nuclFastas_forDiamond_ncasv_ch output: - file("*.fasta") into tax_labeled_fasta1 + file("*.fasta") into tax_labeled_fasta_ncasv tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_ncasv file("*ncASV*summary_for_plot.csv") into taxplot_ncasv @@ -1327,9 +1327,9 @@ if (params.DataCheck || params.Analyze) { file(merged) from nuclCounts_mergedreads_ch output: - tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch + tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch_ncasv tuple val("${id}"), file("*ncASV*counts.csv") into notu_counts_plots - file("*_ASV*counts.csv") into asv_counts_plots + file("*_ASV*counts.csv") into ncasv_counts_plots script: """ @@ -1430,7 +1430,7 @@ if (params.DataCheck || params.Analyze) { } else { reads_vsearch5_ch - .into{ nuclFastas_forDiamond_ch; nuclFastas_forCounts_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_ch } + .into{ nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch } } process ASV_Taxonomy_Inference { @@ -1444,7 +1444,7 @@ if (params.DataCheck || params.Analyze) { file(reads) from nuclFastas_forDiamond_asv_ch output: - file("*.fasta") into tax_labeled_fasta2 + file("*.fasta") into tax_labeled_fasta_asv tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv file("*_ASV*_summary_for_plot.csv") into taxplot_asv @@ -1687,7 +1687,7 @@ if (params.DataCheck || params.Analyze) { """ if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome + vsearch --usearch_global ${merged} --db ${asvs} --id .${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv rm \${name}_count.csv @@ -1699,7 +1699,7 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*ASV*PercentID.matrix' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrices", mode: "copy", overwrite: true, pattern: '*ASV*PercentID.matrix' input: file(reads) from nuclFastas_forMatrix_asv_ch @@ -1866,7 +1866,7 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Matrix", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Matrices", mode: "copy", overwrite: true input: file(prot) from aminotypesClustal @@ -1967,7 +1967,7 @@ if (params.DataCheck || params.Analyze) { diamond blastp -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" >access.list - echo "[pcASV sequence length]" >length.list + echo "[AminoType sequence length]" >length.list echo "[e-value]" >evalue.list echo "[Bitscore]" >bit.list echo "[Percent ID (aa)]" >pid.list From 24f645b3478800e783f1273f2fb2bfdaf9ef22a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 17:24:22 -0800 Subject: [PATCH 025/223] Remove . --- example_data/conf/test.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/example_data/conf/test.config b/example_data/conf/test.config index 774f905..d213a47 100644 --- a/example_data/conf/test.config +++ b/example_data/conf/test.config @@ -15,9 +15,9 @@ params { outdir="vAMPtestresults" workingdir="${projectDir}/example_data/" projtag="vAMPtest" - clusterNuclID=".85" - clusterAAID=".85" + clusterNuclID="85" + clusterAAID="85" dbname="test_db.fasta" dbdir="${projectDir}/example_data/conf/" - stats="run" + stats = true } From e380799a3d58691b5581f66533a252123d5f24d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 17:33:26 -0800 Subject: [PATCH 026/223] Add name --- example_data/conf/test.config | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/example_data/conf/test.config b/example_data/conf/test.config index d213a47..b68646b 100644 --- a/example_data/conf/test.config +++ b/example_data/conf/test.config @@ -3,8 +3,7 @@ Test Config File vAMPirus ======================================================================================== Virus Amplicon Analysis Pipeline - Author: Alex J.Veglia - Version: 1.0 (dev) + Author: Alex J.Veglia, Ramón E. Rivera Vicéns ---------------------------------------------------------------------------------------- */ From b6f1ddced4672b6df021cfe857d1e8d8af6568a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 17:47:08 -0800 Subject: [PATCH 027/223] Update id list --- vampirus.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vampirus.config b/vampirus.config index aff8d25..dae7c9d 100644 --- a/vampirus.config +++ b/vampirus.config @@ -59,11 +59,11 @@ params { minSize="8" // Percent similarity to cluster nucleotide ASV sequences clusterNuclID="85" - // List of percent similarities to cluster nucleotide ASV sequences - must be separated by a comma (ex. ".95,.96") + // List of percent similarities to cluster nucleotide ASV sequences - must be separated by a comma (ex. "95,96") clusterNuclIDlist="" // Default percent similarity to cluster aminoacid sequences clusterAAID="97" - // List of percent similarities to cluster aminoacid sequences - must be separated by ".95,.96" + // List of percent similarities to cluster aminoacid sequences - must be separated by "95,96" clusterAAIDlist="" // Minimum length of amino acid translation to be considered during protein clustered ASV (pcASV) generation. Recommended to put this at the expected aminoacid sequence length based on your maximum read length (e.g. if maxLen="420", then minAA should be 420/3 or 140) minAA="140" From 21507faf40b08618c44801100831f7622d2e8928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 17:50:13 -0800 Subject: [PATCH 028/223] WIP - Add if for nnuc --- vAMPirus.nf | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index f3793e7..e14f64c 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -472,15 +472,17 @@ if (params.readsTest) { } // HERE fix if stament and list names. Also is not an integer -if (!params.clusterNuclIDlist == "") { +if (params.clusterNuclIDlist == "") { + def nnuc=1 +} else { msize=params.clusterNuclIDlist def slist=msize.split(',').collect{it as int} def nnuc=slist.size() -} else { - def nnuc=1 } if (params.clusterAAIDlist == "") { + def naa=1 +} else { msize2=params.clusterAAIDlist def slist2=msize2.split(',').collect{it as int} def naa=slist2.size() @@ -1155,7 +1157,7 @@ if (params.DataCheck || params.Analyze) { """ } else if (params.clusterNuclID) { """ - vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id .${params.clusterNuclID} + vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV${params.clusterNuclID}.fasta --threads ${task.cpus} --relabel ncASV --id .${params.clusterNuclID} """ } } From 22aecd74f4473562875cf66a921fe795edd4db04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 18:08:02 -0800 Subject: [PATCH 029/223] WIP - remove def --- vAMPirus.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index e14f64c..cd996c7 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -473,7 +473,7 @@ if (params.readsTest) { // HERE fix if stament and list names. Also is not an integer if (params.clusterNuclIDlist == "") { - def nnuc=1 + nnuc=1 } else { msize=params.clusterNuclIDlist def slist=msize.split(',').collect{it as int} @@ -481,7 +481,7 @@ if (params.clusterNuclIDlist == "") { } if (params.clusterAAIDlist == "") { - def naa=1 + naa=1 } else { msize2=params.clusterAAIDlist def slist2=msize2.split(',').collect{it as int} From 0cceba5c05a59d4bf2c6e529e917b5b46a7d3b8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 18:56:32 -0800 Subject: [PATCH 030/223] Add id tag. Fix list --- vAMPirus.nf | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index cd996c7..e42f513 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -473,19 +473,23 @@ if (params.readsTest) { // HERE fix if stament and list names. Also is not an integer if (params.clusterNuclIDlist == "") { - nnuc=1 + a=params.clusterNuclID + slist=[a] + nnuc=slist.size() } else { msize=params.clusterNuclIDlist - def slist=msize.split(',').collect{it as int} - def nnuc=slist.size() + slist=msize.split(',').collect{it as int} + nnuc=slist.size() } if (params.clusterAAIDlist == "") { - naa=1 + b=params.clusterAAID + slist2=[b] + naa=slist2.size() } else { msize2=params.clusterAAIDlist def slist2=msize2.split(',').collect{it as int} - def naa=slist2.size() + naa=slist2.size() } if (params.DataCheck || params.Analyze) { @@ -1140,6 +1144,8 @@ if (params.DataCheck || params.Analyze) { label 'norm_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ncASV", mode: "copy", overwrite: true, pattern: '*ncASV*.fasta' input: @@ -1150,10 +1156,11 @@ if (params.DataCheck || params.Analyze) { file("*_ncASV*.fasta") into ( nuclFastas_forphylogeny_ncasv, nuclFastas_forDiamond_ncasv_ch, nuclFastas_forCounts_ncasv_ch, nuclFastas_forMatrix_ncasv_ch ) script: + nid=slist.get(x-1) + mtag="ID=" + slist.get(x-1) if (params.clusterNuclIDlist) { - nid=slist1.get(x-1) """ - vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id .${nid} + vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV${nid}.fasta --threads ${task.cpus} --relabel ncASV --id .${nid} """ } else if (params.clusterNuclID) { """ @@ -1339,7 +1346,7 @@ if (params.DataCheck || params.Analyze) { if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome + vsearch --usearch_global ${merged} --db \${filename} --id .\${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv rm \${name}_count.csv From 129305a1b103cb504a6b87694c749b11367fa637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 19:40:42 -0800 Subject: [PATCH 031/223] Add id tag. Fix missing channels --- vAMPirus.nf | 353 ++++++++++++++++++++++++---------------------------- 1 file changed, 161 insertions(+), 192 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index e42f513..a44cb7d 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -761,35 +761,6 @@ if (params.DataCheck || params.Analyze) { } - /* BEfore examples - process Length_Filtering { //changed - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" - - input: - file(reads) from collect_samples_ch - - output: - file("*_merged_preFilt_clean.fasta") into ( nuclCounts_mergedreads_ch, pcASV_mergedreads_ch ) - file("*_merged_clean_Lengthfiltered.fastq") into reads_vsearch2_ch - file("*_merged_preFilt_clean.fastq") into ( mergeforprotcounts, mergeforpcASVaacounts ) - file("**hist.txt") into histos - - script: - """ - bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt__preClean_length_hist.txt gcbins=auto - fastp -i ${reads} -o ${params.projtag}_merged_preFilt_clean.fastq -b ${params.maxLen} -l ${params.minLen} --thread ${task.cpus} -n 1 - reformat.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_preFilt_clean.fasta t=${task.cpus} - bbduk.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fastq minlength=${params.maxLen} maxlength=${params.maxLen} t=${task.cpus} - bbduk.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq bhist=${params.projtag}_all_merged_postFilt_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_postFilt_qualityScore_hist.txt gchist=${params.projtag}_all_merged_postFilt_gcContent_hist.txt aqhist=${params.projtag}_all_merged_postFilt_averageQuaulity_hist.txt lhist=${params.projtag}_all_merged_postFilt_length_hist.txt gcbins=auto - """ - }*/ - process Length_Filtering { label 'norm_cpus' @@ -805,7 +776,7 @@ if (params.DataCheck || params.Analyze) { output: file("*_merged_preFilt_clean.fastq") into ( mergeforprotcounts, mergeforpcASVaacounts ) - file("*_merged_preFilt_clean.fasta") into ( nuclCounts_mergedreads_ch, pcASV_mergedreads_ch ) + file("*_merged_preFilt_clean.fasta") into ( nuclCounts_mergedreads_asv_ch, nuclCounts_mergedreads_ncasv_ch, pcASV_mergedreads_ch ) file("*_merged_clean_Lengthfiltered.fastq") into reads_vsearch2_ch file("*preFilt_preClean_baseFrequency_hist.csv") into prefilt_basefreq @@ -1153,7 +1124,7 @@ if (params.DataCheck || params.Analyze) { file(fasta) from asv_file_for_ncasvs output: - file("*_ncASV*.fasta") into ( nuclFastas_forphylogeny_ncasv, nuclFastas_forDiamond_ncasv_ch, nuclFastas_forCounts_ncasv_ch, nuclFastas_forMatrix_ncasv_ch ) + tuple nid, file("*_ncASV*.fasta") into ( nuclFastas_forphylogeny_ncasv, nuclFastas_forDiamond_ncasv_ch, nuclFastas_forCounts_ncasv_ch, nuclFastas_forMatrix_ncasv_ch ) script: nid=slist.get(x-1) @@ -1170,16 +1141,18 @@ if (params.DataCheck || params.Analyze) { } if (!params.skipTaxonomy) { - + // here nid for output?? process Nucleotide_Taxonomy_Inference { label 'high_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy", mode: "copy", overwrite: true, pattern: '*ncASV*.{fasta,csv,tsv}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*ncASV*dmd.out' input: - file(asvs) from nuclFastas_forDiamond_ncasv_ch + tuple nid, file(asvs) from nuclFastas_forDiamond_ncasv_ch output: file("*.fasta") into tax_labeled_fasta_ncasv @@ -1187,138 +1160,137 @@ if (params.DataCheck || params.Analyze) { file("*ncASV*summary_for_plot.csv") into taxplot_ncasv script: + mtag="ID=" + nid """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} grep ">" \${virdb} > headers.list headers="headers.list" - for filename in ${asvs};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - j=1 - if [ `echo \${filename} | grep -c "ASV"` -eq 1 ];then - for s in \$(cat seqids.lst);do - echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + j=1 + if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then + for s in \$(cat seqids.lst);do + echo "[ASV#]" > otu.list + echo "[ASV sequence length]" > length.list + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." fi - echo "Done with \$s" - done - fi - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " + fi + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm *asvnames.txt + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: ${asvs}" rm headers.list """ } @@ -1328,66 +1300,60 @@ if (params.DataCheck || params.Analyze) { label 'norm_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*_ASV*.{biome,csv}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Counts", mode: "copy", overwrite: true, pattern: '*ncASV*.{biome,csv}' input: - file(notus) from nuclFastas_forCounts_ncasv_ch - file(merged) from nuclCounts_mergedreads_ch + tuple nid, file(notus) from nuclFastas_forCounts_ncasv_ch + file(merged) from nuclCounts_mergedreads_ncasv_ch output: tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch_ncasv tuple val("${id}"), file("*ncASV*counts.csv") into notu_counts_plots - file("*_ASV*counts.csv") into ncasv_counts_plots + file("*ASV*counts.csv") into ncasv_counts_plots script: + mtag="ID=" + nid """ - for filename in ${notus};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db \${filename} --id .\${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - fi - done + name=\$( echo ${notus} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db ${notus} --id .${nid} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv """ } process Generate_ncASV_Matrices { - + //here do I need the for loop label 'low_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Matrices", mode: "copy", overwrite: true, pattern: '*ncASV*PercentID.matrix' input: - - file(notus) from nuclFastas_forMatrix_ncasv_ch + tuple nid, file(asvs) from nuclFastas_forMatrix_ncasv_ch output: file("*.matrix") into clustmatrices_ncasv file("*ncASV*PercentID.matrix") into notu_heatmap script: - // remove if statement later (no fin) + mtag="ID=" + nid """ - for filename in ${notus};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - fi + name=\$( echo ${asvs}| awk -F ".fasta" '{print \$1}') + clustalo -i ${asvs} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i ${asvs} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix done """ } @@ -1398,18 +1364,21 @@ if (params.DataCheck || params.Analyze) { label 'norm_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ncASV*aln.*' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ncASV*mt*' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ncASV*iq*' input: - file(asvs) from nuclFastas_forphylogeny_ncasv + tuple nid, file(asvs) from nuclFastas_forphylogeny_ncasv output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_ncasv + tuple nid, file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_ncasv file("*iq.treefile") into nucl_phyl_plot_ncasv script: + mtag="ID=" + nid """ pre=\$(echo ${asvs} | awk -F ".fasta" '{print \$1}' ) mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta @@ -1686,7 +1655,7 @@ if (params.DataCheck || params.Analyze) { input: file(asvs) from nuclFastas_forCounts_asv_ch - file(merged) from nuclCounts_mergedreads_ch + file(merged) from nuclCounts_mergedreads_asv_ch output: tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch_asv From 0ed4e8d73e306a3d97037f32160970747596a08b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 19:58:30 -0800 Subject: [PATCH 032/223] Fix Generate_ncASV_Matrices process --- vAMPirus.nf | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index a44cb7d..8f3f63e 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -445,7 +445,6 @@ if (params.help) { exit 0 } -// This will be printed to the user in each run. here thy can check if the values the selected are fine log.info """\ ================================================================================================================================================ vAMPirus v${workflow.manifest.version} - Virus Amplicon Sequencing Analysis Pipeline @@ -471,7 +470,6 @@ if (params.readsTest) { .into{ reads_ch; reads_qc_ch; reads_processing } } -// HERE fix if stament and list names. Also is not an integer if (params.clusterNuclIDlist == "") { a=params.clusterNuclID slist=[a] @@ -1141,7 +1139,7 @@ if (params.DataCheck || params.Analyze) { } if (!params.skipTaxonomy) { - // here nid for output?? + process Nucleotide_Taxonomy_Inference { label 'high_cpus' @@ -1326,7 +1324,6 @@ if (params.DataCheck || params.Analyze) { } process Generate_ncASV_Matrices { - //here do I need the for loop label 'low_cpus' tag "${mtag}" @@ -1346,15 +1343,8 @@ if (params.DataCheck || params.Analyze) { name=\$( echo ${asvs}| awk -F ".fasta" '{print \$1}') clustalo -i ${asvs} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} clustalo -i ${asvs} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done + cat \${name}_PercentIDq.matrix | tr " " "," | grep "," >\${name}_PercentIDq.matrix + rm \${name}_PercentIDq.matrix """ } From e9a23a2168363cfa0267994fd4d92daa359b9cd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 20:08:23 -0800 Subject: [PATCH 033/223] Remove extra letter --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 8f3f63e..8fab14a 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1343,7 +1343,7 @@ if (params.DataCheck || params.Analyze) { name=\$( echo ${asvs}| awk -F ".fasta" '{print \$1}') clustalo -i ${asvs} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} clustalo -i ${asvs} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - cat \${name}_PercentIDq.matrix | tr " " "," | grep "," >\${name}_PercentIDq.matrix + cat \${name}_PercentIDq.matrix | tr " " "," | grep "," >\${name}_PercentID.matrix rm \${name}_PercentIDq.matrix """ } From 242815a9c9d2eba7f5dadb5ff6774bafe8fb0219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 20:52:53 -0800 Subject: [PATCH 034/223] Add nid for pcASV processes. Refactor code --- vAMPirus.nf | 674 +++++++++++++++++++++++----------------------------- 1 file changed, 296 insertions(+), 378 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 8fab14a..01c9f59 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -486,7 +486,7 @@ if (params.clusterAAIDlist == "") { naa=slist2.size() } else { msize2=params.clusterAAIDlist - def slist2=msize2.split(',').collect{it as int} + slist2=msize2.split(',').collect{it as int} naa=slist2.size() } @@ -1125,17 +1125,11 @@ if (params.DataCheck || params.Analyze) { tuple nid, file("*_ncASV*.fasta") into ( nuclFastas_forphylogeny_ncasv, nuclFastas_forDiamond_ncasv_ch, nuclFastas_forCounts_ncasv_ch, nuclFastas_forMatrix_ncasv_ch ) script: - nid=slist.get(x-1) - mtag="ID=" + slist.get(x-1) - if (params.clusterNuclIDlist) { + nid=slist.get(x-1) + mtag="ID=" + slist.get(x-1) """ vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV${nid}.fasta --threads ${task.cpus} --relabel ncASV --id .${nid} """ - } else if (params.clusterNuclID) { - """ - vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV${params.clusterNuclID}.fasta --threads ${task.cpus} --relabel ncASV --id .${params.clusterNuclID} - """ - } } if (!params.skipTaxonomy) { @@ -2183,106 +2177,35 @@ if (params.DataCheck || params.Analyze) { label 'norm_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV", mode: "copy", overwrite: true, pattern: '*pcASV*.{fasta}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Problematic", mode: "copy", overwrite: true, pattern: '*problem*.{fasta}' input: + each x from 1..naa file(fasta) from clustering_aa file(asvs) from asvfastaforaaclust output: - file("${params.projtag}_nucleotide_pcASV*.fasta") into ( pcASV_ntDiamond_ch, pcASV_nt_counts_ch, pcASV_ntmatrix_ch, pcASV_ntmafft_ch ) - file("*_aminoacid_pcASV*_noTaxonomy.fasta") into ( pcASV_aaMatrix_ch, pcASV_aaDiamond_ch, pcASV_aaMafft_ch, pcASV_aaCounts_ch, pcASVEMBOSS ) - tuple file("*.fasta"), file("*.clstr"), file("*.csv"), file("*.gc") into ( pcASVsupplementalfiles ) + tuple nid, file("${params.projtag}_nucleotide_pcASV*.fasta") into ( pcASV_ntDiamond_ch, pcASV_nt_counts_ch, pcASV_ntmatrix_ch, pcASV_ntmafft_ch ) + tuple nid, file("*_aminoacid_pcASV*_noTaxonomy.fasta") into ( pcASV_aaMatrix_ch, pcASV_aaDiamond_ch, pcASV_aaMafft_ch, pcASV_aaCounts_ch, pcASVEMBOSS ) + tuple nid, file("*.fasta"), file("*.clstr"), file("*.csv"), file("*.gc") into ( pcASVsupplementalfiles ) script: - // add awk script to count seqs - if (params.clusterAAIDlist) { - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - for id in `echo ${params.clusterAAIDlist} | tr "," "\\n"`;do - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -c \${id} -o ${params.projtag}_pcASV\${id}.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr - grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list - y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) - echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr - t=1 - b=1 - for x in \$(cat temporaryclusters.list);do - echo "Extracting \$x" - name="\$( echo \$x | awk -F ">" '{print \$2}')" - clust="pcASV"\${t}"" - echo "\${name}" - awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list - t=\$(( \${t}+1 )) - b=\$(( \${b}+1 )) - done - ls *_tmp.list - u=1 - for x in *_tmp.list;do - name="\$(echo \$x | awk -F "_p" '{print \$1}')" - echo "\${name}" - cluster="\$(echo \$x | awk -F "_" '{print \$3}')" - echo "\${cluster}" - grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list - seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta - vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta - grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list - for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do - echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders - u=\$(( \${u}+1 )) - done - u=1 - ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta - done - cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv - ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta - stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true - stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta - else - rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta - fi - rm *.list - rm Cluster* - rm *types* - rm *tmp* - rm ${params.projtag}_pcASV\${id}.fast* - done - """ - } else if (params.clusterAAID) { + // add awk script to count seqs + nid=slist2.get(x-1) + mtag="ID=" + slist2.get(x-1) """ set +e cp ${params.vampdir}/bin/rename_seq.py . - id=${params.clusterAAID} awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -c ${params.clusterAAID} -o ${params.projtag}_pcASV\${id}.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr - grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list - y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) - echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr + cd-hit -i ${params.projtag}_filtered_proteins.fasta -c ${nid} -o ${params.projtag}_pcASV${nid}.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV${nid}.fasta.clstr >${params.projtag}_pcASV${nid}.clstr + grep ">Cluster_" ${params.projtag}_pcASV${nid}.clstr >temporaryclusters.list + y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV${nid}.clstr) + echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV${nid}.clstr t=1 b=1 for x in \$(cat temporaryclusters.list);do @@ -2290,7 +2213,7 @@ if (params.DataCheck || params.Analyze) { name="\$( echo \$x | awk -F ">" '{print \$2}')" clust="pcASV"\${t}"" echo "\${name}" - awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list + awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV${nid}.clstr > "\${name}"_"\${clust}"_tmp.list t=\$(( \${t}+1 )) b=\$(( \${b}+1 )) done @@ -2313,11 +2236,11 @@ if (params.DataCheck || params.Analyze) { u=1 ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta done - cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV${nid}_noTaxonomy.fasta + grep -w "*" ${params.projtag}_pcASV${nid}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_pcASV${nid}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list + grep ">" ${params.projtag}_pcASV${nid}.fasta >lala.list j=1 for x in \$(cat lala.list);do echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list @@ -2329,22 +2252,22 @@ if (params.DataCheck || params.Analyze) { for x in \$(cat tmporder.list);do grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list done - paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv - ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta - stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 - stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta + paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster${nid}_summary.csv + ./rename_seq.py ${params.projtag}_pcASV${nid}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV${nid}_noTaxonomy.fasta + stats.sh in=${params.projtag}_aminoacid_pcASV${nid}_noTaxonomy.fasta gc=${params.projtag}_pcASV${nid}_aminoacid_clustered.gc gcformat=4 + stats.sh in=${params.projtag}_nucleotide_pcASV${nid}_noTaxonomy.fasta gc=${params.projtag}_pcASV${nid}_nucleotide_clustered.gc gcformat=4 + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV${nid}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_pcASV${nid}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_pcASV${nid}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV${nid}_problematic_nucleotides.fasta else - rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta + rm ${params.projtag}_pcASV${nid}_problematic_translations.fasta fi rm *.list rm Cluster* rm *types* rm *tmp* - rm ${params.projtag}_pcASV\${id}.fast* + rm ${params.projtag}_pcASV${nid}.fast* """ } } @@ -2355,12 +2278,14 @@ if (params.DataCheck || params.Analyze) { label 'high_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' input: - file(reads) from pcASV_ntDiamond_ch + tuple nid, file(reads) from pcASV_ntDiamond_ch output: file("*.fasta") into ( pcASV_labeled ) @@ -2368,15 +2293,16 @@ if (params.DataCheck || params.Analyze) { file("*_summary_for_plot.csv") into taxplot3 script: + mtag="ID=" + slist2.get(x-1) """ set +e cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} grep ">" \${virdb} >> headers.list headers="headers.list" - for filename in ${reads};do - name=\$(ls \${filename} | awk -F "_noTax" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + + name=\$(ls ${reads} | awk -F "_noTax" '{print \$1}') + diamond blastx -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" >access.list echo "[pcASV sequence length]" >length.list @@ -2386,7 +2312,7 @@ if (params.DataCheck || params.Analyze) { echo "[pcASV#]" >otu.list echo "[Virus ID]" >"\$name"_virus.list echo "[Gene]" >"\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + grep ">" ${reads} | awk -F ">" '{print \$2}' > seqids.lst echo "extracting genes and names" touch new_"\$name"_headers.txt j=1 @@ -2473,7 +2399,7 @@ if (params.DataCheck || params.Analyze) { done echo "Now editing "\$name" fasta headers" ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_headers.txt "\$name"_TaxonomyLabels.fasta + ./rename_seq.py ${reads} new_"\$name"_headers.txt "\$name"_TaxonomyLabels.fasta awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta echo "[Sequence header]" > newnames.list cat new_"\$name"_headers.txt >> newnames.list @@ -2496,7 +2422,7 @@ if (params.DataCheck || params.Analyze) { rm "\$name"_genes.list rm newnames.list rm access.list - echo "Taxonomy inferred for: \${filename} " + echo "Taxonomy inferred for: ${reads} " done rm *headers.list """ @@ -2507,10 +2433,12 @@ if (params.DataCheck || params.Analyze) { label 'norm_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Counts", mode: "copy", overwrite: true, pattern: '*.{biome,csv,txt}' input: - file(potus) from pcASV_nt_counts_ch + tuple nid, file(potus) from pcASV_nt_counts_ch file(merged) from pcASV_mergedreads_ch output: @@ -2518,15 +2446,13 @@ if (params.DataCheck || params.Analyze) { file("*.csv") into potu_Ncounts_for_report script: + mtag="ID=" + slist2.get(x-1) """ - for filename in ${potus};do - ident=\$( echo \${filename} | awk -F "pcASV" '{print \$2}' | awk -F "_noTaxonomy.fasta" '{print \$1}') - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - done + name=\$( echo ${potus} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db ${potus} --id .${nid} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv """ } @@ -2534,32 +2460,26 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Matrix", mode: "copy", overwrite: true input: - file(potus) from pcASV_ntmatrix_ch + tuple nid, file(potus) from pcASV_ntmatrix_ch output: file("*.matrix") into pcASVclustmatrices file("*PercentID.matrix") into potu_nucl_heatmap script: + //check --percent-id second clustalo + mtag="ID=" + slist2.get(x-1) """ - for filename in ${potus};do - ident=\$( echo \${filename} | awk -F "pcASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - done + name=\$( echo ${potus} | awk -F ".fasta" '{print \$1}') + clustalo -i ${potus} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} + clustalo -i ${potus} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + cat \${name}_PercentIDq.matrix | tr " " "," | grep "," >\${name}_PercentID.matrix + rm \${name}_PercentIDq.matrix """ } @@ -2569,49 +2489,50 @@ if (params.DataCheck || params.Analyze) { label 'norm_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*mt*' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' input: - file(reads) from pcASV_ntmafft_ch + tuple nid, file(reads) from pcASV_ntmafft_ch output: tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_nucleotide_phylogeny_results file("*iq.treefile") into potu_Ntree_plot script: + mtag="ID=" + slist2.get(x-1) """ - for filename in ${reads};do - pre=\$( echo \${filename} | awk -F "_noTax" '{print \$1}' ) - mafft --maxiterate 5000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + pre=\$( echo ${reads} | awk -F "_noTax" '{print \$1}' ) + mafft --maxiterate 5000 --auto ${reads} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # pcASV_Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_noTaxonomy_mt -d nt -s 203 --disable-checkpoint + # pcASV_Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_noTaxonomy_mt -d nt -s 203 --disable-checkpoint - # pcASV_Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq --redo -T auto ${params.iqCustomnt} + # pcASV_Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq --redo -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo-nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo-nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - done + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi """ } } @@ -2620,31 +2541,25 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Matrix", mode: "copy", overwrite: true input: - file(prot) from pcASV_aaMatrix_ch + tuple nid, file(prot) from pcASV_aaMatrix_ch output: file("*.matrix") into pcASVaaMatrix file("*PercentID.matrix") into potu_aa_heatmap script: + mtag="ID=" + slist2.get(x-1) """ - for filename in ${prot};do - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - done + name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') + clustalo -i ${prot} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} + clustalo -i ${prot} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + cat \${name}_PercentIDq.matrix | tr " " "," | grep "," >\${name}_PercentID.matrix + rm \${name}_PercentIDq.matrix """ } @@ -2654,6 +2569,8 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' @@ -2662,38 +2579,38 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' input: - file(prot) from pcASVEMBOSS + tuple nid, file(prot) from pcASVEMBOSS output: tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into pcASV_emboss script: + // check do I need for loop + mtag="ID=" + slist2.get(x-1) """ - for filename in ${prot};do - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - garnier -sequence \${filename} -outfile \${name}_2dStructures.garnier - hmoment -seqall \${filename} -graph svg -plot - mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg - iep -sequence \${filename} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep - mv iep.svg ./"\${name}"_IsoelectricPoint.svg - pepstats -sequence \${filename} -outfile \${name}_ProteinProperties.pepstats - grep ">" \${filename} | awk -F ">" '{print \$2}' > tmpsequence.list - for x in \$(cat tmpsequence.list);do - echo \$x > tmp1.list - seqtk subseq \${filename} tmp1.list > tmp2.fasta - len=\$(tail -1 tmp2.fasta | awk '{print length}') - pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo - mv pepinfo.svg ./"\$x"_PropertiesPlot.svg - cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo - rm "\$x"_PropertiesPlot.pepinfo - pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepnet.svg ./"\$x"_HelicalNet.svg - pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepwheel.svg ./"\$x"_HelicalWheel.svg - rm tmp1.list tmp2.fasta - done - rm tmpsequence.list + name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') + garnier -sequence ${prot} -outfile \${name}_2dStructures.garnier + hmoment -seqall ${prot} -graph svg -plot + mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg + iep -sequence ${prot} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep + mv iep.svg ./"\${name}"_IsoelectricPoint.svg + pepstats -sequence ${prot} -outfile \${name}_ProteinProperties.pepstats + grep ">" ${prot} | awk -F ">" '{print \$2}' > tmpsequence.list + for x in \$(cat tmpsequence.list);do + echo \$x > tmp1.list + seqtk subseq ${prot} tmp1.list > tmp2.fasta + len=\$(tail -1 tmp2.fasta | awk '{print length}') + pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo + mv pepinfo.svg ./"\$x"_PropertiesPlot.svg + cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo + rm "\$x"_PropertiesPlot.pepinfo + pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepnet.svg ./"\$x"_HelicalNet.svg + pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepwheel.svg ./"\$x"_HelicalWheel.svg + rm tmp1.list tmp2.fasta done + rm tmpsequence.list """ } } @@ -2704,12 +2621,14 @@ if (params.DataCheck || params.Analyze) { label 'high_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' input: - file(reads) from pcASV_aaDiamond_ch + tuple nid, file(reads) from pcASV_aaDiamond_ch output: file("*.fasta") into ( pcASV_labeledAA ) @@ -2717,134 +2636,133 @@ if (params.DataCheck || params.Analyze) { file("*_summary_for_plot.csv") into taxplot4 script: + mtag="ID=" + slist2.get(x-1) """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} grep ">" \${virdb} >> headers.list headers="headers.list" - for filename in ${reads};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastp -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" >access.list - echo "[pcASV sequence length]" >length.list - echo "[e-value]" >evalue.list - echo "[Bitscore]" >bit.list - echo "[Percent ID (aa)]" >pid.list - echo "[pcASVaa#]" >otu.list - echo "[Virus ID]" >"\$name"_virus.list - echo "[Gene]" >"\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_headers.txt - j=1 - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi + name=\$(ls ${reads} | awk -F ".fasta" '{print \$1}') + diamond blastp -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" >access.list + echo "[pcASV sequence length]" >length.list + echo "[e-value]" >evalue.list + echo "[Bitscore]" >bit.list + echo "[Percent ID (aa)]" >pid.list + echo "[pcASVaa#]" >otu.list + echo "[Virus ID]" >"\$name"_virus.list + echo "[Gene]" >"\$name"_genes.list + grep ">" ${reads} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_headers.txt + j=1 + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >>otu.list - echo "\$acc" >>access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >>otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASVaa\${j}_\${virus}_\${gene}" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >>otu.list + echo "\$acc" >>access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list + echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >>otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">pcASVaa\${j}_\${virus}_\${gene}" >>new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_headers.txt "\$name"_wTax.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_wTax.fasta > "\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_headers.txt >> newnames.list - touch sequence.list - awk 'BEGIN{RS=">";ORS=""}{print \$2"\\n"}' \${name}_tmpssasv.fasta >>sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_summary_phyloseqObject.csv - paste -d"\\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " + fi + echo "Done with \$s" done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${reads} new_"\$name"_headers.txt "\$name"_wTax.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_wTax.fasta > "\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_headers.txt >> newnames.list + touch sequence.list + awk 'BEGIN{RS=">";ORS=""}{print \$2"\\n"}' \${name}_tmpssasv.fasta >>sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_summary_phyloseqObject.csv + paste -d"\\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: ${reads} " rm *headers.list """ } @@ -2856,49 +2774,50 @@ if (params.DataCheck || params.Analyze) { label 'norm_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' input: - file(prot) from pcASV_aaMafft_ch + tuple nid, file(prot) from pcASV_aaMafft_ch output: tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_protein_phylogeny_results file("*iq.treefile") into potu_Atree_plot script: + mtag="ID=" + slist2.get(x-1) """ - for filename in ${prot};do - pre=\$( echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --maxiterate 5000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + pre=\$( echo ${prot} | awk -F ".fasta" '{print \$1}' ) + mafft --maxiterate 5000 --auto ${prot} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # pcASV_Protein_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint + # pcASV_Protein_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint - # pcASV_Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} + # pcASV_Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - done + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi """ } } @@ -2910,7 +2829,7 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Counts", mode: "copy", overwrite: true input: - file(fasta) from pcASV_aaCounts_ch + tuple nid, file(fasta) from pcASV_aaCounts_ch file(merged) from mergeforpcASVaacounts file(samplist) from samplistpotu @@ -2919,35 +2838,34 @@ if (params.DataCheck || params.Analyze) { file("*counts.csv") into potu_Acounts script: + // check do I need for loop """ set +e - for filename in ${fasta};do - potu="\$( echo \${filename} | awk -F "_" '{print \$3}')" - diamond makedb --in \${filename} --db \${filename} - diamond blastx -q ${merged} -d \${filename} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_\${potu}_Counts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 - echo "OTU_ID" >tmp.col1.txt - echo "Generating sample id list" - grep ">" \${filename} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list - cat otuid.list >> tmp.col1.txt - echo "Beginning them counts tho my g" - for y in \$( cat ${samplist} );do - echo "Starting with \$y now ..." - grep "\$y" ${params.projtag}_\${potu}_Counts_dmd.out > tmp."\$y".out - echo "Isolated hits" - echo "Created uniq subject id list" - echo "\$y" > "\$y"_col.txt - echo "Starting my counts" - for z in \$(cat otuid.list);do - echo "Counting \$z hits" - echo "grep -wc "\$z" >> "\$y"_col.txt" - grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt - echo "\$z counted" - done - done - paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_aminoacid_\${potu}_noTaxonomy_counts.csv - rm tmp* - rm *col.txt - done + potu="\$( echo ${fasta} | awk -F "_" '{print \$3}')" + diamond makedb --in ${fasta} --db ${fasta} + diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_\${potu}_Counts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 + echo "OTU_ID" >tmp.col1.txt + echo "Generating sample id list" + grep ">" ${fasta} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list + cat otuid.list >> tmp.col1.txt + echo "Beginning them counts tho my g" + for y in \$( cat ${samplist} );do + echo "Starting with \$y now ..." + grep "\$y" ${params.projtag}_\${potu}_Counts_dmd.out > tmp."\$y".out + echo "Isolated hits" + echo "Created uniq subject id list" + echo "\$y" > "\$y"_col.txt + echo "Starting my counts" + for z in \$(cat otuid.list);do + echo "Counting \$z hits" + echo "grep -wc "\$z" >> "\$y"_col.txt" + grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt + echo "\$z counted" + done + done + paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_aminoacid_\${potu}_noTaxonomy_counts.csv + rm tmp* + rm *col.txt """ } } From bd90e4d66cc3f106c1a785db85363f6155571ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 21:01:51 -0800 Subject: [PATCH 035/223] Fix tag. Add . in ID parameter --- vAMPirus.nf | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 01c9f59..e53043a 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2201,7 +2201,7 @@ if (params.DataCheck || params.Analyze) { set +e cp ${params.vampdir}/bin/rename_seq.py . awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -c ${nid} -o ${params.projtag}_pcASV${nid}.fasta + cd-hit -i ${params.projtag}_filtered_proteins.fasta -c .${nid} -o ${params.projtag}_pcASV${nid}.fasta sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV${nid}.fasta.clstr >${params.projtag}_pcASV${nid}.clstr grep ">Cluster_" ${params.projtag}_pcASV${nid}.clstr >temporaryclusters.list y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV${nid}.clstr) @@ -2293,7 +2293,7 @@ if (params.DataCheck || params.Analyze) { file("*_summary_for_plot.csv") into taxplot3 script: - mtag="ID=" + slist2.get(x-1) + mtag="ID=" + nid """ set +e cp ${params.vampdir}/bin/rename_seq.py . @@ -2446,7 +2446,7 @@ if (params.DataCheck || params.Analyze) { file("*.csv") into potu_Ncounts_for_report script: - mtag="ID=" + slist2.get(x-1) + mtag="ID=" + nid """ name=\$( echo ${potus} | awk -F ".fasta" '{print \$1}') vsearch --usearch_global ${merged} --db ${potus} --id .${nid} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome @@ -2473,7 +2473,7 @@ if (params.DataCheck || params.Analyze) { script: //check --percent-id second clustalo - mtag="ID=" + slist2.get(x-1) + mtag="ID=" + nid """ name=\$( echo ${potus} | awk -F ".fasta" '{print \$1}') clustalo -i ${potus} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} @@ -2503,7 +2503,7 @@ if (params.DataCheck || params.Analyze) { file("*iq.treefile") into potu_Ntree_plot script: - mtag="ID=" + slist2.get(x-1) + mtag="ID=" + nid """ pre=\$( echo ${reads} | awk -F "_noTax" '{print \$1}' ) mafft --maxiterate 5000 --auto ${reads} >\${pre}_ALN.fasta @@ -2553,7 +2553,7 @@ if (params.DataCheck || params.Analyze) { file("*PercentID.matrix") into potu_aa_heatmap script: - mtag="ID=" + slist2.get(x-1) + mtag="ID=" + nid """ name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') clustalo -i ${prot} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} @@ -2586,7 +2586,7 @@ if (params.DataCheck || params.Analyze) { script: // check do I need for loop - mtag="ID=" + slist2.get(x-1) + mtag="ID=" + nid """ name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') garnier -sequence ${prot} -outfile \${name}_2dStructures.garnier @@ -2636,7 +2636,7 @@ if (params.DataCheck || params.Analyze) { file("*_summary_for_plot.csv") into taxplot4 script: - mtag="ID=" + slist2.get(x-1) + mtag="ID=" + nid """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} @@ -2788,7 +2788,7 @@ if (params.DataCheck || params.Analyze) { file("*iq.treefile") into potu_Atree_plot script: - mtag="ID=" + slist2.get(x-1) + mtag="ID=" + nid """ pre=\$( echo ${prot} | awk -F ".fasta" '{print \$1}' ) mafft --maxiterate 5000 --auto ${prot} >\${pre}_ALN.fasta @@ -2826,6 +2826,8 @@ if (params.DataCheck || params.Analyze) { label 'high_cpus' + tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Counts", mode: "copy", overwrite: true input: @@ -2839,6 +2841,7 @@ if (params.DataCheck || params.Analyze) { script: // check do I need for loop + mtag="ID=" + nid """ set +e potu="\$( echo ${fasta} | awk -F "_" '{print \$3}')" @@ -3005,8 +3008,6 @@ if (params.DataCheck || params.Analyze) { } - } - } else { println("\n\t\033[0;31mMandatory argument not specified. For more info use `nextflow run vAMPirus.nf --help`\n\033[0m") exit 0 From 6dd02e8c50a74741392aeb7bfba5dc1cf41b502e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 10 Mar 2021 21:04:37 -0800 Subject: [PATCH 036/223] Fix process pcASV_Nucleotide_Taxonomy_Inference --- vAMPirus.nf | 240 ++++++++++++++++++++++++++-------------------------- 1 file changed, 119 insertions(+), 121 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index e53043a..d86cfc7 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2300,130 +2300,128 @@ if (params.DataCheck || params.Analyze) { virdb=${params.dbdir}/${params.dbname} grep ">" \${virdb} >> headers.list headers="headers.list" - - name=\$(ls ${reads} | awk -F "_noTax" '{print \$1}') - diamond blastx -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" >access.list - echo "[pcASV sequence length]" >length.list - echo "[e-value]" >evalue.list - echo "[Bitscore]" >bit.list - echo "[Percent ID (aa)]" >pid.list - echo "[pcASV#]" >otu.list - echo "[Virus ID]" >"\$name"_virus.list - echo "[Gene]" >"\$name"_genes.list - grep ">" ${reads} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_headers.txt - j=1 - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi + name=\$(ls ${reads} | awk -F "_noTax" '{print \$1}') + diamond blastx -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" >access.list + echo "[pcASV sequence length]" >length.list + echo "[e-value]" >evalue.list + echo "[Bitscore]" >bit.list + echo "[Percent ID (aa)]" >pid.list + echo "[pcASV#]" >otu.list + echo "[Virus ID]" >"\$name"_virus.list + echo "[Gene]" >"\$name"_genes.list + grep ">" ${reads} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_headers.txt + j=1 + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >>otu.list + echo "\$acc" >>access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list + echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >>otu.list - echo "\$acc" >>access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list - echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >>otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >>otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${reads} new_"\$name"_headers.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_headers.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_noTaxonomy_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: ${reads} " + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${reads} new_"\$name"_headers.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_headers.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_noTaxonomy_summary_for_plot.csv; + rm tmpcol.list tmp2col.list done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: ${reads} " rm *headers.list """ } From 7efd1e2af1643c337fa9dad075878450f59fea04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Fri, 12 Mar 2021 16:12:57 -0800 Subject: [PATCH 037/223] Add missing } --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index d86cfc7..ba65098 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2270,7 +2270,6 @@ if (params.DataCheck || params.Analyze) { rm ${params.projtag}_pcASV${nid}.fast* """ } - } if (!params.skipTaxonomy) { @@ -3005,6 +3004,7 @@ if (params.DataCheck || params.Analyze) { } } + } } else { println("\n\t\033[0;31mMandatory argument not specified. For more info use `nextflow run vAMPirus.nf --help`\n\033[0m") From 284c6ecd2b888e9d82f11f653ba7b321f91ce530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Fri, 12 Mar 2021 17:26:54 -0800 Subject: [PATCH 038/223] WIP. Add tuple. Fix report channels --- vAMPirus.nf | 54 ++++++++++++++++++++++++----------------------------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index ba65098..5625089 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1149,7 +1149,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.fasta") into tax_labeled_fasta_ncasv tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_ncasv - file("*ncASV*summary_for_plot.csv") into taxplot_ncasv + tuple nid, file("*ncASV*summary_for_plot.csv") into taxplot_ncasv script: mtag="ID=" + nid @@ -1303,8 +1303,7 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch_ncasv - tuple val("${id}"), file("*ncASV*counts.csv") into notu_counts_plots - file("*ASV*counts.csv") into ncasv_counts_plots + tuple nid, file("*ncASV*counts.csv") into notu_counts_plots script: mtag="ID=" + nid @@ -1329,7 +1328,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.matrix") into clustmatrices_ncasv - file("*ncASV*PercentID.matrix") into notu_heatmap + tuple nid, file("*ncASV*PercentID.matrix") into notu_heatmap script: mtag="ID=" + nid @@ -1359,7 +1358,7 @@ if (params.DataCheck || params.Analyze) { output: tuple nid, file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_ncasv - file("*iq.treefile") into nucl_phyl_plot_ncasv + tuple nid, file("*iq.treefile") into nucl_phyl_plot_ncasv script: mtag="ID=" + nid @@ -1643,17 +1642,15 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch_asv - file("*_ASV*counts.csv") into asv_counts_plots_asv + file("*_ASV*counts.csv") into asv_counts_plots script: """ - if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db ${asvs} --id .${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - fi + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db ${asvs} --id .${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv """ } @@ -1668,7 +1665,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.matrix") into clustmatrices_asv - file("*_ASV*PercentID.matrix") into asv_heatmap_asv + file("*_ASV*PercentID.matrix") into asv_heatmap script: // remove if statement later (no fin) @@ -2289,7 +2286,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.fasta") into ( pcASV_labeled ) tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond - file("*_summary_for_plot.csv") into taxplot3 + tuple nid, file("*_summary_for_plot.csv") into taxplot3 script: mtag="ID=" + nid @@ -2440,7 +2437,7 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*_counts.txt"), file("*_counts.biome") into pcASVcounts_vsearch - file("*.csv") into potu_Ncounts_for_report + tuple nid, file("*.csv") into potu_Ncounts_for_report script: mtag="ID=" + nid @@ -2466,7 +2463,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.matrix") into pcASVclustmatrices - file("*PercentID.matrix") into potu_nucl_heatmap + tuple nid, file("*PercentID.matrix") into potu_nucl_heatmap script: //check --percent-id second clustalo @@ -2497,7 +2494,7 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_nucleotide_phylogeny_results - file("*iq.treefile") into potu_Ntree_plot + tuple nid, file("*iq.treefile") into potu_Ntree_plot script: mtag="ID=" + nid @@ -2547,7 +2544,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.matrix") into pcASVaaMatrix - file("*PercentID.matrix") into potu_aa_heatmap + tuple nid, file("*PercentID.matrix") into potu_aa_heatmap script: mtag="ID=" + nid @@ -2630,7 +2627,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.fasta") into ( pcASV_labeledAA ) tuple file("*phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond - file("*_summary_for_plot.csv") into taxplot4 + tuple nid, file("*_summary_for_plot.csv") into taxplot4 script: mtag="ID=" + nid @@ -2782,7 +2779,7 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_protein_phylogeny_results - file("*iq.treefile") into potu_Atree_plot + tuple nid, file("*iq.treefile") into potu_Atree_plot script: mtag="ID=" + nid @@ -2834,7 +2831,7 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*_counts.csv"), file("*dmd.out") into potuaacounts_summary - file("*counts.csv") into potu_Acounts + tuple nid, file("*counts.csv") into potu_Acounts script: // check do I need for loop @@ -2904,12 +2901,9 @@ if (params.DataCheck || params.Analyze) { """ echo "Read processing steps skipped." >filter_reads.txt """ - } - } - //NEW REPORT !!!!!!!!!!!!!!!!! /*Report_ASV asv_counts_plots -> ${params.projtag}_ASV_counts.csv @@ -2918,11 +2912,11 @@ if (params.DataCheck || params.Analyze) { nucl_phyl_plot -> ${params.projtag}_ASV_iq.treefile */ report_asv = Channel.create() - asv_counts_plots.mix(taxplot1, asv_heatmap, nucl_phyl_plot).flatten().buffer(size:4).into(report_asv) + asv_counts_plots.mix(taxplot_asv, asv_heatmap, nucl_phyl_plot_asv).flatten().buffer(size:4).into(report_asv) if (params.ncASV) { report_ncasv = Channel.create() - notu_counts_plots.mix(taxplot1a, notu_heatmap, nucl_phyl_plot_ncasv).flatten().toSortedList().flatten().buffer(size:4).into(report_ncasv) + notu_counts_plots.mix(taxplot_ncasv, notu_heatmap, nucl_phyl_plot_ncasv).groupTuple(by:0, size:4).into(report_ncasv) /* notu_counts_plots -> ${params.projtag}_ncASV${id}_counts.csv taxplot1a -> ${params.projtag}_ncASV${id}_summary_for_plot.csv @@ -2935,7 +2929,7 @@ if (params.DataCheck || params.Analyze) { if (params.pcASV) { report_pcasv_aa = Channel.create() - potu_Acounts.mix(taxplot4, potu_aa_heatmap, potu_Atree_plot).flatten().toSortedList().flatten().buffer(size:4).into(report_pcasv_aa) + potu_Acounts.mix(taxplot4, potu_aa_heatmap, potu_Atree_plot).groupTuple(by:0, size:4).into(report_pcasv_aa) /*Report_pcASV_AminoAcid potu_Acounts -> ${params.projtag}_pcASV${id}_noTaxonomy_counts.csv taxplot4 -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_summary_for_plot.csv @@ -2943,7 +2937,7 @@ if (params.DataCheck || params.Analyze) { potu_Atree_plot -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_iq.treefile */ report_pcasv_nucl = Channel.create() - potu_Ncounts_for_report.mix(taxplot3, potu_nucl_heatmap, potu_Ntree_plot).flatten().toSortedList().flatten().buffer(size:4).into(report_pcasv_nucl) + potu_Ncounts_for_report.mix(taxplot3, potu_nucl_heatmap, potu_Ntree_plot).groupTuple(by:0, size:4).into(report_pcasv_nucl) /*Report_pcASV_Nucleotide potu_Ncounts_for_report -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_counts.csv taxplot3 -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_summary_for_plot.csv @@ -2970,7 +2964,7 @@ if (params.DataCheck || params.Analyze) { } report_all_ch = Channel.create() - report_asv.mix(report_ncasv, report_pcasv_aa, report_pcasv_nucl, report_aminotypes).buffer(size:1).flatten().toList().view().into(report_all_ch) + report_asv.mix(report_ncasv, report_pcasv_aa, report_pcasv_nucl, report_aminotypes).view().into(report_all_ch) process Report { From 790095f428568f015c602a35527164d9c51fada0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Fri, 12 Mar 2021 18:12:18 -0800 Subject: [PATCH 039/223] Fix issue with input files in report --- vAMPirus.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/vAMPirus.nf b/vAMPirus.nf index 5625089..8688a19 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2981,6 +2981,7 @@ if (params.DataCheck || params.Analyze) { script: """ + if [ -e input.3 ];then cat input.3 | sed -r 's|\\[(\\/\\w+.*)\\]|\\1|g' | tr -d " " | tr "," "\\n" >flist.txt ; for x in `cat flist.txt`;do cp \$x . ;done ;fi name=\$( ls *summary_for_plot.csv | awk -F "_summary_for_plot.csv" '{print \$1}') cp ${params.vampdir}/bin/vAMPirus_Report.Rmd . cp ${params.vampdir}/example_data/conf/vamplogo.png . From a23b1fedae76c9980860e519a60d437bd3a84ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Sun, 14 Mar 2021 09:19:13 -0700 Subject: [PATCH 040/223] Fix channel. Erase sed line --- vAMPirus.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 8688a19..8cc6478 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2964,7 +2964,7 @@ if (params.DataCheck || params.Analyze) { } report_all_ch = Channel.create() - report_asv.mix(report_ncasv, report_pcasv_aa, report_pcasv_nucl, report_aminotypes).view().into(report_all_ch) + report_asv.mix(report_ncasv, report_pcasv_aa, report_pcasv_nucl, report_aminotypes).map{it.flatten()}.into(report_all_ch) process Report { @@ -2981,7 +2981,6 @@ if (params.DataCheck || params.Analyze) { script: """ - if [ -e input.3 ];then cat input.3 | sed -r 's|\\[(\\/\\w+.*)\\]|\\1|g' | tr -d " " | tr "," "\\n" >flist.txt ; for x in `cat flist.txt`;do cp \$x . ;done ;fi name=\$( ls *summary_for_plot.csv | awk -F "_summary_for_plot.csv" '{print \$1}') cp ${params.vampdir}/bin/vAMPirus_Report.Rmd . cp ${params.vampdir}/example_data/conf/vamplogo.png . From 1c026f1cf534b5344c06ef630220e6c7b54383c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Sun, 14 Mar 2021 09:36:18 -0700 Subject: [PATCH 041/223] Fix onComplete print --- vAMPirus.nf | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 8cc6478..8f345fe 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -3004,15 +3004,26 @@ if (params.DataCheck || params.Analyze) { println("\n\t\033[0;31mMandatory argument not specified. For more info use `nextflow run vAMPirus.nf --help`\n\033[0m") exit 0 } - -workflow.onComplete { - log.info ( workflow.success ? \ - "---------------------------------------------------------------------------------" \ - + "\n\033[0;32mDone! Open the following reports in your browser\033[0m" \ - + "\n\033[0;32mPipeline performance report: ${params.workingdir}/${params.outdir}/${params.tracedir}/vampirus_report.html\033[0m" \ - + "\n\033[0;32mvAMPirus --DataCheck interactive report: ${params.workingdir}/${params.outdir}/DataCheck/*.hmtl\033[0m" \ - + "\n\033[0;32mvAMPirus --Analyze interactive report: ${params.workingdir}/${params.outdir}/Analyze/*.hmtl\033[0m" \ - : \ - "---------------------------------------------------------------------------------" \ - + "\n\033[0;31mSomething went wrong. Check error message below and/or log files.\033[0m" ) +if (params.DataCheck) { + workflow.onComplete { + log.info ( workflow.success ? \ + "---------------------------------------------------------------------------------" \ + + "\n\033[0;32mDone! Open the following reports in your browser\033[0m" \ + + "\n\033[0;32mPipeline performance report: ${params.workingdir}/${params.outdir}/${params.tracedir}/vampirus_report.html\033[0m" \ + + "\n\033[0;32mvAMPirus --DataCheck interactive report: ${params.workingdir}/${params.outdir}/DataCheck/*.hmtl\033[0m" \ + : \ + "---------------------------------------------------------------------------------" \ + + "\n\033[0;31mSomething went wrong. Check error message below and/or log files.\033[0m" ) + } +} else if (params.Analyze) { + workflow.onComplete { + log.info ( workflow.success ? \ + "---------------------------------------------------------------------------------" \ + + "\n\033[0;32mDone! Open the following reports in your browser\033[0m" \ + + "\n\033[0;32mPipeline performance report: ${params.workingdir}/${params.outdir}/${params.tracedir}/vampirus_report.html\033[0m" \ + + "\n\033[0;32mvAMPirus --Analyze interactive report: ${params.workingdir}/${params.outdir}/Analyze/*.hmtl\033[0m" \ + : \ + "---------------------------------------------------------------------------------" \ + + "\n\033[0;31mSomething went wrong. Check error message below and/or log files.\033[0m" ) + } } From 05f6f61cd24b92829854cbb4a2ef372b82cd9542 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 23 Mar 2021 09:24:12 -0500 Subject: [PATCH 042/223] added oligtyping installation and databse annotation download and options --- vampirus.config | 8 +++++--- vampirus_startup.sh | 17 +++++++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/vampirus.config b/vampirus.config index dae7c9d..db310e0 100644 --- a/vampirus.config +++ b/vampirus.config @@ -25,7 +25,7 @@ params { // Merged read length filtering parameters - // Minimum merged read length - reads below the specified maximum read length will be used for counts only + // Minimum merged read length - reads with lengths greater than minLen and below the specified maximum read length will be used for counts only minLen="400" // Maximum merged read length - reads with length equal to the specified max read length will be used to generate uniques and ASVs (safe to set at expected amplicon size to start) maxLen="420" @@ -57,7 +57,7 @@ params { alpha="1" // Minimum size or representation for sequence to be considered in ASV generation minSize="8" - // Percent similarity to cluster nucleotide ASV sequences + // Percent similarity to cluster nucleotide ASV sequences (used when --ncASV is set) clusterNuclID="85" // List of percent similarities to cluster nucleotide ASV sequences - must be separated by a comma (ex. "95,96") clusterNuclIDlist="" @@ -65,7 +65,7 @@ params { clusterAAID="97" // List of percent similarities to cluster aminoacid sequences - must be separated by "95,96" clusterAAIDlist="" - // Minimum length of amino acid translation to be considered during protein clustered ASV (pcASV) generation. Recommended to put this at the expected aminoacid sequence length based on your maximum read length (e.g. if maxLen="420", then minAA should be 420/3 or 140) + // Minimum length of amino acid translation to be considered during protein clustered ASV (pcASV) generation. Recommended to put this at the expected amino acid sequence length based on your maximum read length (e.g. if maxLen="420", then minAA should be 420/3 so 140) minAA="140" // Counts table generation parameters @@ -86,6 +86,8 @@ params { dbname="DATABASENAME" // Path to Directory where database is being stored dbdir="DATABASEDIR" + // Path to hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. + dbanno="DATABASEANNOT" // Toggle use of RefSeq header format; default is Reverence Viral DataBase (RVDB) refseq="F" // Set minimum bitscore for best hit in taxonomy assignment diff --git a/vampirus_startup.sh b/vampirus_startup.sh index 5f5089a..e4a618e 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -18,6 +18,7 @@ vampirus_startup.sh -h [-d 1|2|3|4] [-s] [ -d 1|2|3|4 ] Set this option to create a database directiory within the current working directory and download the following databases for taxonomy assignment: 1 - Download the proteic version of the Reference Viral DataBase (See the paper for more information on this database: https://f1000research.com/articles/8-530) + NOTE: need to use RVDB for sequence classification 2 - Download only NCBIs Viral protein RefSeq database 3 - Download only the complete NCBI NR protein database 4 - Download all three databases @@ -124,6 +125,11 @@ conda_c() { fi } +echo "Downloading oligotyping program" +conda init && source activate vAMPirus +pip install oligotyping --yes +conda deactivate + nextflow_c() { source_c cd $mypwd @@ -186,15 +192,18 @@ if [[ $DATABASE -eq 1 ]] then mkdir "$mypwd"/Databases cd "$mypwd"/Databases dir="$(pwd)" - echo "Database installation: RVDB version 19.0 (latest as of 2020-06)" - curl -o U-RVDBv19.0-prot.fasta.bz2 https://rvdb-prot.pasteur.fr/files/U-RVDBv19.0-prot.fasta.bz2 - bunzip2 U-RVDBv19.0-prot.fasta.bz2 + echo "Database installation: RVDB version 21.0 (latest as of 2021-02)" + curl -o U-RVDBv21.0-prot.fasta.bz2 https://rvdb-prot.pasteur.fr/files/U-RVDBv21.0-prot.fasta.bz2 + bunzip2 U-RVDBv21.0-prot.fasta.bz2 + curl -o U-RVDBv21.0-prot-hmm-txt.zip https://rvdb-prot.pasteur.fr/files/U-RVDBv21.0-prot-hmm-txt.zip echo "Editing confiration file for you now..." sed 's/DATABASENAME/U-RVDBv19.0-prot.fasta/g' "$mypwd"/vampirus.config > tmp1.config sed "s|DATABASEDIR|${dir}|g" tmp1.config > tmp2.config + sed "s|DATABASEANNOT|${dir}/U-RVDBv21.0-prot-hmm-txt.zip|g" tmp2.config > tmp3.config rm tmp1.config - cat tmp2.config > "$mypwd"/vampirus.config rm tmp2.config + cat tmp3.config > "$mypwd"/vampirus.config + rm tmp3.config echo "Database downloaded and configuration file edited, you should confirm the path and database name was set correctly in the config file." elif [[ $DATABASE -eq 2 ]] then mkdir "$mypwd"/Databases From 141c6b085fd896c03c2ac913b789c2d595d20cfc Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 23 Mar 2021 09:50:11 -0500 Subject: [PATCH 043/223] fixed oligotyping install --- vampirus_startup.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/vampirus_startup.sh b/vampirus_startup.sh index e4a618e..13c7e09 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -125,11 +125,6 @@ conda_c() { fi } -echo "Downloading oligotyping program" -conda init && source activate vAMPirus -pip install oligotyping --yes -conda deactivate - nextflow_c() { source_c cd $mypwd @@ -181,6 +176,12 @@ else cat tmp1.config > "$mypwd"/vampirus.config rm tmp1.config fi + +echo "Downloading oligotyping program" +conda init && source activate vAMPirus +pip install oligotyping +conda deactivate + echo "-------------------------------------------------------------------------------- Conda check/install done" echo "Now lets check the status of Nextflow on your system..." From 9698c229b12b10103fc97ea47e32193127815c0d Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 23 Mar 2021 14:48:40 -0500 Subject: [PATCH 044/223] Added blast to yml file and added Shannon entropy analysis to datacheck --- vAMPirus.nf | 164 +++++++++++++++++++++++++++++++++++++++++++++-- vampirus_env.yml | 1 + 2 files changed, 160 insertions(+), 5 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 8f345fe..e37dc75 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -826,7 +826,7 @@ if (params.DataCheck || params.Analyze) { """ } - process Extract_Uniques { + process Extracting_Uniques { label 'low_cpus' @@ -872,7 +872,7 @@ if (params.DataCheck || params.Analyze) { file(fasta) from reads_vsearch4_ch output: - file("*ASVs.fasta") into ( reads_vsearch5_ch, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) + file("*ASVs.fasta") into ( reads_vsearch5_ch, asv_med, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) script: """ @@ -946,7 +946,7 @@ if (params.DataCheck || params.Analyze) { output: file("number_per_percentage_prot.csv") into number_per_percent_prot_plot - + file("*pcASV100*") into amino_med script: // add awk script to count seqs """ @@ -1040,6 +1040,158 @@ if (params.DataCheck || params.Analyze) { """ } + process ASV_Shannons_Entropy_Analysis { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Nucleotide/ShannonEntropy", mode: "copy", overwrite: true + + input: + file(asvs) from asv_med + + output: + + file("*_ASV_entropy_breakdown.csv") into asv_entro_csv + file("*ASV*") into entrop + + script: + """ + set +e + #alignment + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_mafftAlign.fasta + #trimming + trimal -in ${params.projtag}_ASVs_mafftAlign.fasta -out ${params.projtag}_ASVs_mafftAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_ASVs_mafftAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_ASVs_mafftAligned.fasta + mv ${params.projtag}_ASVs_mafftAligned.fasta-TRIMMED ./${params.projtag}_ASVs_Aligned_informativeonly.fasta + #entopy analysis + entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta + #summarize entropy peaks + awk '{print \$2}' testaligned.fasta-ENTROPY >> tmp_value.list + for x in \$(cat tmp_value.list) + do echo "\$x" + if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; + then echo dope >> above-0.0-.list + fi + if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; + then echo dope >> above-0.1-.list + fi + if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; + then echo dope >> above-0.2-.list + fi + if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; + then echo dope >> above-0.3-.list + fi + if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; + then echo dope >> above-0.4-.list + fi + if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; + then echo dope >> above-0.5-.list + fi + if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; + then echo dope >> above-0.6-.list + fi + if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; + then echo dope >> above-0.7-.list + fi + if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; + then echo dope >> above-0.8-.list + fi + if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; + then echo dope >> above-0.9-.list + fi + if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; + then echo dope >> above-1.0-.list + fi + if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; + then echo dope >> above-1.5-.list + fi + done + for z in above*.list; + do entrop=\$(echo \$z | awk -F "-" '{print \$2}') + echo ""\$entrop", "\$(wc -l \$z | awk '{print \$1}')"" >> ${params.projtag}_ASV_entropy_breakdown.csv + done + rm above* + """ + + } + + process AminoType_Shannons_Entropy_Analysis { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/ShannonEntropy", mode: "copy", overwrite: true, pattern: '*{.csv}' + + input: + file(aminos) from amino_med + + output: + + file("*AminoType_entropy_breakdown.csv") into amino_entro_csv + file("*AminoTypes*") into aminos + + script: + """ + #alignment + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta + #trimming + trimal -in ${params.projtag}_AminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_AminoTypes_mafftAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_mafftAligned.fasta + mv ${params.projtag}_AminoTypes_mafftAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta + #entropy analysis + entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta --amino-acid-sequences + #summarize entropy peaks + awk '{print \$2}' ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list + for x in \$(cat tmp_value.list) + do echo "\$x" + if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; + then echo dope >> above-0.0-.list + fi + if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; + then echo dope >> above-0.1-.list + fi + if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; + then echo dope >> above-0.2-.list + fi + if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; + then echo dope >> above-0.3-.list + fi + if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; + then echo dope >> above-0.4-.list + fi + if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; + then echo dope >> above-0.5-.list + fi + if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; + then echo dope >> above-0.6-.list + fi + if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; + then echo dope >> above-0.7-.list + fi + if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; + then echo dope >> above-0.8-.list + fi + if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; + then echo dope >> above-0.9-.list + fi + if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; + then echo dope >> above-1.0-.list + fi + if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; + then echo dope >> above-1.5-.list + fi + done + for z in above*.list; + do entrop=\$(echo \$z | awk -F "-" '{print \$2}') + echo ""\$entrop", "\$(wc -l \$z | awk '{print \$1}')"" >> ${params.projtag}_AminoType_entropy_breakdown.csv + done + rm above* + + """ + + } + if (!params.skipReadProcessing || !params.skipMerging ) { process combine_csv_DC { @@ -1366,11 +1518,13 @@ if (params.DataCheck || params.Analyze) { pre=\$(echo ${asvs} | awk -F ".fasta" '{print \$1}' ) mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta + mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint # Nucleotide_Phylogeny if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} diff --git a/vampirus_env.yml b/vampirus_env.yml index 95423f3..df49583 100644 --- a/vampirus_env.yml +++ b/vampirus_env.yml @@ -9,6 +9,7 @@ channels: - genomedk dependencies: - python=3.6 + - blast=2.11.0 - diamond=0.9.30 - fastqc=0.11.9 - fastp=0.20.1 From bcf09885f7afb34bbc872b8151b3dac0067e5c7d Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 23 Mar 2021 15:53:57 -0500 Subject: [PATCH 045/223] Added options for MED and processes for MED in Analyze loop --- vAMPirus.nf | 65 ++++++++++++++++++++++++++++++++++++++++++++++--- vampirus.config | 14 ++++++++++- 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index e37dc75..19750fd 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1128,6 +1128,7 @@ if (params.DataCheck || params.Analyze) { output: file("*AminoType_entropy_breakdown.csv") into amino_entro_csv + file ("*.png") into file("*AminoTypes*") into aminos script: @@ -1286,7 +1287,7 @@ if (params.DataCheck || params.Analyze) { if (!params.skipTaxonomy) { - process Nucleotide_Taxonomy_Inference { + process Nucleotide_Taxonomy_Inference { /////// editttt label 'high_cpus' @@ -1545,10 +1546,10 @@ if (params.DataCheck || params.Analyze) { } else { reads_vsearch5_ch - .into{ nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch } + .into{ nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch, asv_for_med } } - process ASV_Taxonomy_Inference { + process ASV_Taxonomy_Inference { /////// editttt label 'high_cpus' @@ -1901,6 +1902,40 @@ if (params.DataCheck || params.Analyze) { } } + if (params.asvMED) { + + process ASV_Minimum_Entropy_Decomposition { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASV/MED", mode: "copy", overwrite: true + + input: + + file(asvs) from asv_for_med + + output: + + script: + """ + set +e + #alignment + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_mafftAlign.fasta + #trimming + trimal -in ${params.projtag}_ASVs_mafftAlign.fasta -out ${params.projtag}_ASVs_mafftAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_ASVs_mafftAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_ASVs_mafftAligned.fasta + mv ${params.projtag}_ASVs_mafftAligned.fasta-TRIMMED ./${params.projtag}_ASVs_Aligned_informativeonly.fasta + #entopy analysis + entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta + #Decomposition + oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.asvC} --skip-check-input --no-figures + + """ + } + + } + if (!params.skipAminoTyping) { process Translate_For_AminoTyping { @@ -1936,7 +1971,7 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*.fasta"), file("${params.projtag}_AminoTypes.clstr"), file("${params.projtag}_AminoType_summary_map.csv"), file("${params.projtag}_clustered.gc") into ( supplementalfiles ) - file("${params.projtag}_AminoTypes_noTaxonomy.fasta") into ( aminotypesCounts, aminotypesMafft, aminotypesClustal, aminotypesBlast, aminotypesEmboss ) + file("${params.projtag}_AminoTypes_noTaxonomy.fasta") into ( aminotypesCounts, aminotypesMafft, aminotypesClustal, aminotypesBlast, aminotypesEmboss, aminos_for_med ) script: """ @@ -2301,6 +2336,28 @@ if (params.DataCheck || params.Analyze) { } } + if (params.aminoMED) { + + process AminoType_Minimum_Entropy_Decomposition { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASV/MED", mode: "copy", overwrite: true + + input: + + file(aminos) from aminos_for_med + + output: + + script: + """ + + """ + } + + } + if (params.pcASV) { // ASV_nucl -> ASV_aa -> clusteraa by %id with ch-hit -> extract representative nucl sequences to generate new OTU file process Translation_For_pcASV_Generation { diff --git a/vampirus.config b/vampirus.config index db310e0..aef6beb 100644 --- a/vampirus.config +++ b/vampirus.config @@ -68,6 +68,13 @@ params { // Minimum length of amino acid translation to be considered during protein clustered ASV (pcASV) generation. Recommended to put this at the expected amino acid sequence length based on your maximum read length (e.g. if maxLen="420", then minAA should be 420/3 so 140) minAA="140" + // Minimum Entropy Decomposition (MED) parameters for clustering (https://merenlab.org/2012/05/11/oligotyping-pipeline-explained/) + + // If you plan to do MED on ASVs using the option "--asvMED" you can set here the number of positions for oligotyping to take into consideration + asvC="" + // If you plan to do MED on ASVs using the option "--aminoMED" you can set here the number of positions for oligotyping to take into consideration + aminoC="" + // Counts table generation parameters // Percent similarity to use for ASV/cASV counts table generation with vsearch @@ -141,11 +148,16 @@ params { // Manadotory arguments Analyze=false DataCheck=false -// Clustering options +// Non-Mandatory Clustering options // Cluster nucleotide sequences (ncASVs) ncASV = false // Cluster by aminoacid translations and generate protein-based OTUs (pcASVs) pcASV = false + // Generate virus types with MED of ASV sequences + asvMED = false + // Generate virus types with MED of ASV sequences + aminoMED = false + // Skip options // Skip all Read Processing steps skipReadProcessing=false From 38a05d797ded1dda08806e1df576b79cfe4f915e Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 23 Mar 2021 17:23:40 -0500 Subject: [PATCH 046/223] added lines for csv generation --- vAMPirus.nf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 19750fd..31898f9 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1052,6 +1052,7 @@ if (params.DataCheck || params.Analyze) { output: file("*_ASV_entropy_breakdown.csv") into asv_entro_csv + file("") file("*ASV*") into entrop script: @@ -1067,7 +1068,7 @@ if (params.DataCheck || params.Analyze) { #entopy analysis entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta #summarize entropy peaks - awk '{print \$2}' testaligned.fasta-ENTROPY >> tmp_value.list + awk '{print \$2}' ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list for x in \$(cat tmp_value.list) do echo "\$x" if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; @@ -1107,6 +1108,7 @@ if (params.DataCheck || params.Analyze) { then echo dope >> above-1.5-.list fi done + echo "Base_position, Shannon's_Entropy" >> ${params.projtag}_ASV_entropy_breakdown.csv for z in above*.list; do entrop=\$(echo \$z | awk -F "-" '{print \$2}') echo ""\$entrop", "\$(wc -l \$z | awk '{print \$1}')"" >> ${params.projtag}_ASV_entropy_breakdown.csv @@ -1126,13 +1128,12 @@ if (params.DataCheck || params.Analyze) { file(aminos) from amino_med output: - file("*AminoType_entropy_breakdown.csv") into amino_entro_csv file ("*.png") into file("*AminoTypes*") into aminos script: - """ + """ #alignment mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta #trimming @@ -1183,14 +1184,13 @@ if (params.DataCheck || params.Analyze) { then echo dope >> above-1.5-.list fi done + echo "Base_position, Shannon's_Entropy" >> ${params.projtag}_AminoType_entropy_breakdown.csv for z in above*.list; do entrop=\$(echo \$z | awk -F "-" '{print \$2}') echo ""\$entrop", "\$(wc -l \$z | awk '{print \$1}')"" >> ${params.projtag}_AminoType_entropy_breakdown.csv done rm above* - - """ - + """ } if (!params.skipReadProcessing || !params.skipMerging ) { @@ -1930,7 +1930,7 @@ if (params.DataCheck || params.Analyze) { entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta #Decomposition oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.asvC} --skip-check-input --no-figures - + """ } From 960fccaf1d2a1c60756a31c91cb15d3736037cd9 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 23 Mar 2021 17:54:21 -0500 Subject: [PATCH 047/223] edits --- vAMPirus.nf | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 31898f9..54bb6ed 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1108,12 +1108,18 @@ if (params.DataCheck || params.Analyze) { then echo dope >> above-1.5-.list fi done - echo "Base_position, Shannon's_Entropy" >> ${params.projtag}_ASV_entropy_breakdown.csv + echo "Entropy,Peaks_above" >> ${params.projtag}_ASV_entropy_breakdown.csv for z in above*.list; do entrop=\$(echo \$z | awk -F "-" '{print \$2}') echo ""\$entrop", "\$(wc -l \$z | awk '{print \$1}')"" >> ${params.projtag}_ASV_entropy_breakdown.csv done rm above* + + mv ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY ./tmp.fasta + cat "Base_position Shannons_Entropy" >> ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY + cat tmp.fasta >> ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY + rm tmp.fasta + """ } @@ -1184,12 +1190,16 @@ if (params.DataCheck || params.Analyze) { then echo dope >> above-1.5-.list fi done - echo "Base_position, Shannon's_Entropy" >> ${params.projtag}_AminoType_entropy_breakdown.csv + echo "Entropy,Peaks_above" >> ${params.projtag}_AminoType_entropy_breakdown.csv for z in above*.list; do entrop=\$(echo \$z | awk -F "-" '{print \$2}') echo ""\$entrop", "\$(wc -l \$z | awk '{print \$1}')"" >> ${params.projtag}_AminoType_entropy_breakdown.csv done rm above* + mv ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY ./tmp.fasta + cat "Base_position Shannons_Entropy" >> ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY + cat tmp.fasta >> ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY + rm tmp.fasta """ } From 2368c440c6cb1ebac5f110aaae7227a7283037aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 23 Mar 2021 15:54:30 -0700 Subject: [PATCH 048/223] Add MED plots and tables --- bin/vAMPirus_DC_Report.Rmd | 66 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/bin/vAMPirus_DC_Report.Rmd b/bin/vAMPirus_DC_Report.Rmd index 0914be4..7a6b8f1 100644 --- a/bin/vAMPirus_DC_Report.Rmd +++ b/bin/vAMPirus_DC_Report.Rmd @@ -398,6 +398,72 @@ pnp ``` NOTE: The "1" represents the number of AminoTypes which are unique amino acid sequences in your dataset
+ + +### ASVs MED + +
+ +```{r med_asv, echo=FALSE} +med_asv=read.delim(paste(params$projtag, sep="","_ASVs_Aligned_informativeonly.fasta-ENTROPY"), sep = "\t", header=TRUE) + +mplot=plot_ly(med_asv, x=~Base_position, y=~Shannons_Entropy,type="bar", name="Entropy", opacity = .8, line=list(color='#088da5'), + hovertemplate = paste('Base position: %{x}','
Entropy: %{y}','')) +mplot<- mplot %>% layout(xaxis=list(title="Base position")) +mplot<- mplot %>% layout(yaxis=list(title="Entropy")) +mplot<- mplot %>% config(toImageButtonOptions=list(format='svg',filename='ASV_MED', height= 500, width= 800, scale= 1), displaylogo = FALSE) +mplot +``` +
+ +### ASVs Peaks Range Information + +
+ +```{r med_asv_peak, echo=FALSE} +med_asv_csv=read.csv(paste(params$projtag, sep="", "_ASV_entropy_breakdown.csv"), header=TRUE) +paged_table(med_asv_csv, options = list(rows.print = 10)) +``` +
+ +### AminoTypes MED + +
+ +```{r med_amino, echo=FALSE} +med_amino=read.delim(paste(params$projtag, sep="","_AminoTypes_Aligned_informativeonly.fasta-ENTROPY"), sep = "\t", header=TRUE) + +mplot=plot_ly(med_amino, x=~Base_position, y=~Shannons_Entropy,type="bar", name="Entropy", opacity = .8, line=list(color='#088da5'), + hovertemplate = paste('Base position: %{x}','
Entropy: %{y}','')) +mplot<- mplot %>% layout(xaxis=list(title="Base position")) +mplot<- mplot %>% layout(yaxis=list(title="Entropy")) +mplot<- mplot %>% config(toImageButtonOptions=list(format='svg',filename='AminoTypes_MED', height= 500, width= 800, scale= 1), displaylogo = FALSE) +mplot +``` +
+ +### AminoTypes Peaks Range Information + +
+ +```{r med_amino_peak, echo=FALSE} +med_amino_csv=read.csv(paste(params$projtag, sep="", "_AminoType_entropy_breakdown.csv"), header=TRUE) +paged_table(med_amino_csv, options = list(rows.print = 10)) +``` +
+ +### ASVs vs AminoTypes + +
+ +```{r med_comparison, echo=FALSE} +mplotbox <- plot_ly(med_asv, y=~Shannons_Entropy, type="box", boxmean='sd', boxpoints="outlier", jitter=0.1, pointpos=0, name="ASVs") +mplotbox<- mplotbox %>% add_trace(med_amino, y=~Shannons_Entropy, type="box", boxmean='sd', boxpoints="outliers", jitter=0.1, pointpos=0, name="AminoTypes") +mplotbox<- mplotbox %>% layout(legend = list(y=.5)) +mplotbox<- mplotbox %>% config(toImageButtonOptions=list(format='svg',filename='ASV_vs_AminoTypes', height= 500, width= 800, scale= 1), displaylogo = FALSE) +mplotbox +``` +



From 78ff79f081b8f41d7fe8d19646a88493a3c29c90 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 23 Mar 2021 18:06:06 -0500 Subject: [PATCH 049/223] connected datacheck med channels --- vAMPirus.nf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 54bb6ed..c231e5d 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1052,7 +1052,7 @@ if (params.DataCheck || params.Analyze) { output: file("*_ASV_entropy_breakdown.csv") into asv_entro_csv - file("") + file("Aligned_informativeonly.fasta-ENTROPY") into asv_entropy file("*ASV*") into entrop script: @@ -1114,7 +1114,6 @@ if (params.DataCheck || params.Analyze) { echo ""\$entrop", "\$(wc -l \$z | awk '{print \$1}')"" >> ${params.projtag}_ASV_entropy_breakdown.csv done rm above* - mv ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY ./tmp.fasta cat "Base_position Shannons_Entropy" >> ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY cat tmp.fasta >> ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY @@ -1135,7 +1134,7 @@ if (params.DataCheck || params.Analyze) { output: file("*AminoType_entropy_breakdown.csv") into amino_entro_csv - file ("*.png") into + file ("*Aligned_informativeonly.fasta-ENTROPY") into amino_entropy file("*AminoTypes*") into aminos script: @@ -1238,7 +1237,7 @@ if (params.DataCheck || params.Analyze) { } report_dc_in = Channel.create() - fastp_csv_dc.mix( reads_per_sample_preFilt, reads_per_sample_postFilt, prefilt_basefreq, postFilt_basefreq, prefilt_qualityscore, postFilt_qualityscore, prefilt_gccontent, postFilt_gccontent, prefilt_averagequality, postFilt_averagequality, prefilt_length, postFilt_length, number_per_percent_nucl_plot, number_per_percent_prot_plot + fastp_csv_dc.mix( reads_per_sample_preFilt, reads_per_sample_postFilt, prefilt_basefreq, postFilt_basefreq, prefilt_qualityscore, postFilt_qualityscore, prefilt_gccontent, postFilt_gccontent, prefilt_averagequality, postFilt_averagequality, prefilt_length, postFilt_length, number_per_percent_nucl_plot, number_per_percent_prot_plot, amino_entro_csv, amino_entropy, asv_entro_csv, asv_entropy ).into(report_dc_in) process Report_DataCheck { From 70dc57f78d4b0c181691d01e211d65af749c7826 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 23 Mar 2021 18:17:15 -0500 Subject: [PATCH 050/223] conda replaced --- vampirus_startup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vampirus_startup.sh b/vampirus_startup.sh index 13c7e09..5df8e89 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -178,8 +178,8 @@ else fi echo "Downloading oligotyping program" -conda init && source activate vAMPirus -pip install oligotyping +conda init && conda activate vAMPirus +pip install oligotyping conda deactivate echo "-------------------------------------------------------------------------------- Conda check/install done" From c8127f8bf82ca0bdbfb1094928d75be294234f56 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 23 Mar 2021 18:19:22 -0500 Subject: [PATCH 051/223] changed semicolon --- vAMPirus.nf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index c231e5d..8bef557 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1237,8 +1237,7 @@ if (params.DataCheck || params.Analyze) { } report_dc_in = Channel.create() - fastp_csv_dc.mix( reads_per_sample_preFilt, reads_per_sample_postFilt, prefilt_basefreq, postFilt_basefreq, prefilt_qualityscore, postFilt_qualityscore, prefilt_gccontent, postFilt_gccontent, prefilt_averagequality, postFilt_averagequality, prefilt_length, postFilt_length, number_per_percent_nucl_plot, number_per_percent_prot_plot, amino_entro_csv, amino_entropy, asv_entro_csv, asv_entropy - ).into(report_dc_in) + fastp_csv_dc.mix( reads_per_sample_preFilt, reads_per_sample_postFilt, prefilt_basefreq, postFilt_basefreq, prefilt_qualityscore, postFilt_qualityscore, prefilt_gccontent, postFilt_gccontent, prefilt_averagequality, postFilt_averagequality, prefilt_length, postFilt_length, number_per_percent_nucl_plot, number_per_percent_prot_plot, amino_entro_csv, amino_entropy, asv_entro_csv, asv_entropy).into(report_dc_in) process Report_DataCheck { @@ -1555,7 +1554,7 @@ if (params.DataCheck || params.Analyze) { } else { reads_vsearch5_ch - .into{ nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch, asv_for_med } + .into{ nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch; asv_for_med } } process ASV_Taxonomy_Inference { /////// editttt From 6ab2a17498899018bc2a25a157a0e24b38fbda5d Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 23 Mar 2021 18:26:13 -0500 Subject: [PATCH 052/223] editted output file nae --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 8bef557..4ba62d7 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -946,7 +946,7 @@ if (params.DataCheck || params.Analyze) { output: file("number_per_percentage_prot.csv") into number_per_percent_prot_plot - file("*pcASV100*") into amino_med + file("*pcASV1.0_noTaxonomy*") into amino_med script: // add awk script to count seqs """ From 4311757ccd0766ec09840550b19bd2eb69128eeb Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 23 Mar 2021 18:41:41 -0500 Subject: [PATCH 053/223] editted errors in datacheck --- vAMPirus.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 4ba62d7..81ce02b 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -946,7 +946,7 @@ if (params.DataCheck || params.Analyze) { output: file("number_per_percentage_prot.csv") into number_per_percent_prot_plot - file("*pcASV1.0_noTaxonomy*") into amino_med + file("*aminoacid_pcASV1.0_noTaxonomy.fasta") into amino_med script: // add awk script to count seqs """ @@ -1115,7 +1115,7 @@ if (params.DataCheck || params.Analyze) { done rm above* mv ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY ./tmp.fasta - cat "Base_position Shannons_Entropy" >> ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY + echo "Base_position Shannons_Entropy" >> ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY cat tmp.fasta >> ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY rm tmp.fasta @@ -1196,7 +1196,7 @@ if (params.DataCheck || params.Analyze) { done rm above* mv ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY ./tmp.fasta - cat "Base_position Shannons_Entropy" >> ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY + echo "Base_position Shannons_Entropy" >> ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY cat tmp.fasta >> ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY rm tmp.fasta """ From 40e1807c086ae872f2c2646ff58912c4ddf7d069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 23 Mar 2021 17:20:29 -0700 Subject: [PATCH 054/223] Fix figures --- bin/vAMPirus_DC_Report.Rmd | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bin/vAMPirus_DC_Report.Rmd b/bin/vAMPirus_DC_Report.Rmd index 7a6b8f1..e7ab7cf 100644 --- a/bin/vAMPirus_DC_Report.Rmd +++ b/bin/vAMPirus_DC_Report.Rmd @@ -407,7 +407,7 @@ NOTE: The "1" represents the number of AminoTypes which are unique amino acid se ```{r med_asv, echo=FALSE} med_asv=read.delim(paste(params$projtag, sep="","_ASVs_Aligned_informativeonly.fasta-ENTROPY"), sep = "\t", header=TRUE) -mplot=plot_ly(med_asv, x=~Base_position, y=~Shannons_Entropy,type="bar", name="Entropy", opacity = .8, line=list(color='#088da5'), +mplot=plot_ly(med_asv, x=med_asv$Base_position, y=med_asv$Shannons_Entropy,type="bar", name="Entropy", opacity = .8, line=list(color='#088da5'), hovertemplate = paste('Base position: %{x}','
Entropy: %{y}','')) mplot<- mplot %>% layout(xaxis=list(title="Base position")) mplot<- mplot %>% layout(yaxis=list(title="Entropy")) @@ -416,7 +416,7 @@ mplot ```
-### ASVs Peaks Range Information +### ASVs Peaks Range Information
@@ -433,7 +433,7 @@ paged_table(med_asv_csv, options = list(rows.print = 10)) ```{r med_amino, echo=FALSE} med_amino=read.delim(paste(params$projtag, sep="","_AminoTypes_Aligned_informativeonly.fasta-ENTROPY"), sep = "\t", header=TRUE) -mplot=plot_ly(med_amino, x=~Base_position, y=~Shannons_Entropy,type="bar", name="Entropy", opacity = .8, line=list(color='#088da5'), +mplot=plot_ly(med_amino, x=med_amino$Base_position, y=med_amino$Shannons_Entropy,type="bar", name="Entropy", opacity = .8, line=list(color='#088da5'), hovertemplate = paste('Base position: %{x}','
Entropy: %{y}','')) mplot<- mplot %>% layout(xaxis=list(title="Base position")) mplot<- mplot %>% layout(yaxis=list(title="Entropy")) @@ -442,7 +442,7 @@ mplot ```
-### AminoTypes Peaks Range Information +### AminoTypes Peaks Range Information
@@ -452,13 +452,13 @@ paged_table(med_amino_csv, options = list(rows.print = 10)) ```
-### ASVs vs AminoTypes +### ASVs vs AminoTypes
```{r med_comparison, echo=FALSE} -mplotbox <- plot_ly(med_asv, y=~Shannons_Entropy, type="box", boxmean='sd', boxpoints="outlier", jitter=0.1, pointpos=0, name="ASVs") -mplotbox<- mplotbox %>% add_trace(med_amino, y=~Shannons_Entropy, type="box", boxmean='sd', boxpoints="outliers", jitter=0.1, pointpos=0, name="AminoTypes") +mplotbox <- plot_ly(med_asv, y=med_asv$Shannons_Entropy, type="box", boxmean='sd', boxpoints="outlier", jitter=0.1, pointpos=0, name="ASVs") +mplotbox<- mplotbox %>% add_trace(med_amino, y=med_amino$Shannons_Entropy, type="box", boxmean='sd', boxpoints="outliers", jitter=0.1, pointpos=0, name="AminoTypes") mplotbox<- mplotbox %>% layout(legend = list(y=.5)) mplotbox<- mplotbox %>% config(toImageButtonOptions=list(format='svg',filename='ASV_vs_AminoTypes', height= 500, width= 800, scale= 1), displaylogo = FALSE) mplotbox From 91c744cb3865cb4086856705ad96869a2e041675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 23 Mar 2021 17:24:08 -0700 Subject: [PATCH 055/223] Add missing * --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 81ce02b..3a817ce 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1052,7 +1052,7 @@ if (params.DataCheck || params.Analyze) { output: file("*_ASV_entropy_breakdown.csv") into asv_entro_csv - file("Aligned_informativeonly.fasta-ENTROPY") into asv_entropy + file("*Aligned_informativeonly.fasta-ENTROPY") into asv_entropy file("*ASV*") into entrop script: From cc283b1849c3b15e443f69f50de541a94026bcd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 23 Mar 2021 17:28:27 -0700 Subject: [PATCH 056/223] Fix name --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 3a817ce..24df4cd 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -3229,7 +3229,7 @@ if (params.DataCheck) { "---------------------------------------------------------------------------------" \ + "\n\033[0;32mDone! Open the following reports in your browser\033[0m" \ + "\n\033[0;32mPipeline performance report: ${params.workingdir}/${params.outdir}/${params.tracedir}/vampirus_report.html\033[0m" \ - + "\n\033[0;32mvAMPirus --DataCheck interactive report: ${params.workingdir}/${params.outdir}/DataCheck/*.hmtl\033[0m" \ + + "\n\033[0;32mvAMPirus --DataCheck interactive report: ${params.workingdir}/${params.outdir}/DataCheck/Report/*.hmtl\033[0m" \ : \ "---------------------------------------------------------------------------------" \ + "\n\033[0;31mSomething went wrong. Check error message below and/or log files.\033[0m" ) From d66bba98511f98d379dae9f18003c4d1aea17512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 23 Mar 2021 17:37:36 -0700 Subject: [PATCH 057/223] Edit space --- bin/vAMPirus_DC_Report.Rmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/vAMPirus_DC_Report.Rmd b/bin/vAMPirus_DC_Report.Rmd index e7ab7cf..6ee6df3 100644 --- a/bin/vAMPirus_DC_Report.Rmd +++ b/bin/vAMPirus_DC_Report.Rmd @@ -407,7 +407,7 @@ NOTE: The "1" represents the number of AminoTypes which are unique amino acid se ```{r med_asv, echo=FALSE} med_asv=read.delim(paste(params$projtag, sep="","_ASVs_Aligned_informativeonly.fasta-ENTROPY"), sep = "\t", header=TRUE) -mplot=plot_ly(med_asv, x=med_asv$Base_position, y=med_asv$Shannons_Entropy,type="bar", name="Entropy", opacity = .8, line=list(color='#088da5'), +mplot=plot_ly(med_asv, x=med_asv$Base_position, y=med_asv$Shannons_Entropy, type="bar", name="Entropy", opacity = .8, line=list(color='#088da5'), hovertemplate = paste('Base position: %{x}','
Entropy: %{y}','')) mplot<- mplot %>% layout(xaxis=list(title="Base position")) mplot<- mplot %>% layout(yaxis=list(title="Entropy")) @@ -433,7 +433,7 @@ paged_table(med_asv_csv, options = list(rows.print = 10)) ```{r med_amino, echo=FALSE} med_amino=read.delim(paste(params$projtag, sep="","_AminoTypes_Aligned_informativeonly.fasta-ENTROPY"), sep = "\t", header=TRUE) -mplot=plot_ly(med_amino, x=med_amino$Base_position, y=med_amino$Shannons_Entropy,type="bar", name="Entropy", opacity = .8, line=list(color='#088da5'), +mplot=plot_ly(med_amino, x=med_amino$Base_position, y=med_amino$Shannons_Entropy, type="bar", name="Entropy", opacity = .8, line=list(color='#088da5'), hovertemplate = paste('Base position: %{x}','
Entropy: %{y}','')) mplot<- mplot %>% layout(xaxis=list(title="Base position")) mplot<- mplot %>% layout(yaxis=list(title="Entropy")) From a1608c32e354e09954e9a10f820fe27da94a6c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 23 Mar 2021 17:39:04 -0700 Subject: [PATCH 058/223] Add files for figure --- bin/vAMPirus_DC_Report.Rmd | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/vAMPirus_DC_Report.Rmd b/bin/vAMPirus_DC_Report.Rmd index 6ee6df3..0578dce 100644 --- a/bin/vAMPirus_DC_Report.Rmd +++ b/bin/vAMPirus_DC_Report.Rmd @@ -457,6 +457,9 @@ paged_table(med_amino_csv, options = list(rows.print = 10))
```{r med_comparison, echo=FALSE} +med_asv=read.delim(paste(params$projtag, sep="","_ASVs_Aligned_informativeonly.fasta-ENTROPY"), sep = "\t", header=TRUE) +med_amino=read.delim(paste(params$projtag, sep="","_AminoTypes_Aligned_informativeonly.fasta-ENTROPY"), sep = "\t", header=TRUE) + mplotbox <- plot_ly(med_asv, y=med_asv$Shannons_Entropy, type="box", boxmean='sd', boxpoints="outlier", jitter=0.1, pointpos=0, name="ASVs") mplotbox<- mplotbox %>% add_trace(med_amino, y=med_amino$Shannons_Entropy, type="box", boxmean='sd', boxpoints="outliers", jitter=0.1, pointpos=0, name="AminoTypes") mplotbox<- mplotbox %>% layout(legend = list(y=.5)) From 5dc272e746a47d74bd5f91e573662781f5cea691 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 24 Mar 2021 08:28:09 -0500 Subject: [PATCH 059/223] fixed outputname --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 81ce02b..3a817ce 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1052,7 +1052,7 @@ if (params.DataCheck || params.Analyze) { output: file("*_ASV_entropy_breakdown.csv") into asv_entro_csv - file("Aligned_informativeonly.fasta-ENTROPY") into asv_entropy + file("*Aligned_informativeonly.fasta-ENTROPY") into asv_entropy file("*ASV*") into entrop script: From 8dfbd30b592c8bd1babb57a645d6c2adbb1b6215 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 17:03:18 -0500 Subject: [PATCH 060/223] Added MED to Analyze --- vAMPirus.nf | 194 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 182 insertions(+), 12 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 24df4cd..7e339ee 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -720,7 +720,7 @@ if (params.DataCheck || params.Analyze) { } - process Compile_Reads { + process Filtering_Prep1 { label 'low_cpus' @@ -739,7 +739,7 @@ if (params.DataCheck || params.Analyze) { """ } - process Compile_Names { + process Filtering_Prep2 { label 'low_cpus' @@ -1805,7 +1805,7 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch_asv - file("*_ASV*counts.csv") into asv_counts_plots + file("*_ASV*counts.csv") into (asv_counts_plots, asvcount_med) script: """ @@ -1881,7 +1881,7 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_asv - file("*iq.treefile") into nucl_phyl_plot_asv + file("*iq.treefile") into (nucl_phyl_plot_asv, asvphy_med) script: """ @@ -1916,17 +1916,18 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASV/MED", mode: "copy", overwrite: true - + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASV/${params.projtag}_asvMED_${params.asvC}", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASV/${params.projtag}_asvMED_${params.asvC}/OLIGO-REPRESENTATIVES", mode: "copy", overwrite: true input: file(asvs) from asv_for_med output: + file("*_ASV_Grouping.csv") into asvgroupscsv + file("${params.projtag}_ASV_group_reps_aligned.fasta") into groupreps script: """ - set +e #alignment mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_mafftAlign.fasta #trimming @@ -1937,11 +1938,98 @@ if (params.DataCheck || params.Analyze) { #entopy analysis entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta #Decomposition - oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.asvC} --skip-check-input --no-figures + oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.asvC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + #generatemaps + cd ./${params.projtag}_asvMED_${params.asvC}/OLIGO-REPRESENTATIVES/ + echo "ASV,Group,IDPattern" + j=1 + for x in *_unique; + do gid=$(echo \$x | awk -F "_" '{print \$1}') + uni=$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') + grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list + seqtk subseq ${asvs} asv.list > Group"\${j}"_sequences.fasta + for z in $( cat asv.list) + do echo ""\$z",Group"\$gid","\$uni"" >> ${params.projtag}_ASV_Grouping.csv + done + rm asv.list + echo "Group\${j}" >> ${params.projtag}_group_reps_aligned.fasta + echo "\$uni" > group.list + seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta + tail -1 group.fasta >> ${params.projtag}_group_reps_aligned.fasta + mv "\$gid"_"\$uni" ./Group"\$j"_"\$uni"_aligned.fasta + mv "\$gid"_"\$uni"_unique ./Group"\$j"_"\$uni"_unqiues_aligned.fasta + rm "\$gid"*.cPickle + j=\$((\$j+1)) + done + mv ${params.projtag}_ASV_Grouping.csv ../../ + mv ${params.projtag}_ASV_group_reps_aligned.fasta ../../ + cd .. """ } + process ASV_MED_Reps_phylogeny { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' + + input: + file(reps) from groupreps + + output: + tuple file("*_Aminotype_Group_Reps") into align_results_asvmed + file("*iq.treefile") into asv_group_rep_tree + + script: + """ + # Protein_ModelTest + modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.protag}_ASV_Group_Reps_mt -d aa -s 203 --disable-checkpoint + + # Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq --redo -T auto ${params.iqCustomaa} + + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} + + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} + + elif [ "${params.parametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + + else + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } + + process Adding_ASV_MED_Info { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny", mode: "copy", overwrite: true + + input: + file(counts) from asvcount_med + file(tree) from asvphy_med + file(map) from asvgroupscsv + output: + + + script: + """ + + + """ + } } if (!params.skipAminoTyping) { @@ -1978,8 +2066,9 @@ if (params.DataCheck || params.Analyze) { file(asvs) from asvaminocheck output: - tuple file("*.fasta"), file("${params.projtag}_AminoTypes.clstr"), file("${params.projtag}_AminoType_summary_map.csv"), file("${params.projtag}_clustered.gc") into ( supplementalfiles ) + tuple file("*.fasta"), file("${params.projtag}_AminoTypes.clstr"), file("${params.projtag}_clustered.gc") into ( supplementalfiles ) file("${params.projtag}_AminoTypes_noTaxonomy.fasta") into ( aminotypesCounts, aminotypesMafft, aminotypesClustal, aminotypesBlast, aminotypesEmboss, aminos_for_med ) + file("${params.projtag}_AminoType_summary_map.csv") into aminomapmed script: """ @@ -2171,7 +2260,7 @@ if (params.DataCheck || params.Analyze) { virus="NO" gene="HIT" echo ">AminoType\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) + j=\$((\$\$1)) echo "\$s done." fi else @@ -2350,17 +2439,98 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASV/MED", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/MED", mode: "copy", overwrite: true input: - file(aminos) from aminos_for_med output: + file("*_AminoType_Grouping.csv") into atygroupscsv + file("${params.projtag}_AminoType_group_reps_aligned.fasta") into atygroupreps script: """ + #alignment + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta + #trimming + trimal -in ${params.projtag}_AmminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_AminoTypes_mafftAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_mafftAligned.fasta + mv ${params.projtag}_AminoTypes_mafftAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta + #entopy analysis + entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta + #Decomposition + oligotype ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.asvC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + #generatemaps + cd ./${params.projtag}_asvMED_${params.asvC}/OLIGO-REPRESENTATIVES/ + echo "AminoType,Group,IDPattern" + j=1 + for x in *_unique; + do gid=$(echo \$x | awk -F "_" '{print \$1}') + uni=$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') + grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list + seqtk subseq ${aminos} asv.list > Group"\${j}"_sequences.fasta + for z in $( cat asv.list) + do echo ""\$z",Group"\$gid","\$uni"" >> ${params.projtag}_AminoType_Grouping.csv + + done + rm asv.list + echo "Group\${j}" >> ${params.projtag}_group_reps_aligned.fasta + echo "\$uni" > group.list + seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta + tail -1 group.fasta >> ${params.projtag}_group_reps_aligned.fasta + mv "\$gid"_"\$uni" ./Group"\$j"_"\$uni"_aligned.fasta + mv "\$gid"_"\$uni"_unique ./Group"\$j"_"\$uni"_unqiues_aligned.fasta + rm "\$gid"*.cPickle + j=\$((\$j+1)) + done + mv ${params.projtag}_AminoType_Grouping.csv ../../ + mv ${params.projtag}_AminoType_group_reps_aligned.fasta ../../ + cd .. + + """ + } + + process AminoType_MED_Reps_phylogeny { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' + + input: + file(reps) from atygroupreps + + output: + tuple file("*_Aminotype_Group_Reps") into align_results_aminmed + file("*iq.treefile") into amino_group_rep_tree + + script: + """ + # Protein_ModelTest + modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.protag}_AminoType_Group_Reps_mt -d aa -s 203 --disable-checkpoint + + # Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq --redo -T auto ${params.iqCustomaa} + + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} + + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} + + elif [ "${params.parametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + else + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi """ } From 72bdaa85d2c62e218941cf7fe4465b74f37d4207 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 17:47:39 -0500 Subject: [PATCH 061/223] Added Scripts for MED info incorportation --- bin/vAMPirus_ReportA.Rmd | 705 ------------------------------------- bin/vAMPirus_ReportB.Rmd | 725 --------------------------------------- vAMPirus.nf | 101 ++++-- 3 files changed, 71 insertions(+), 1460 deletions(-) delete mode 100644 bin/vAMPirus_ReportA.Rmd delete mode 100644 bin/vAMPirus_ReportB.Rmd diff --git a/bin/vAMPirus_ReportA.Rmd b/bin/vAMPirus_ReportA.Rmd deleted file mode 100644 index ad6fbf1..0000000 --- a/bin/vAMPirus_ReportA.Rmd +++ /dev/null @@ -1,705 +0,0 @@ ---- -title: "vAMPirus Analyze Report `r commandArgs(trailingOnly=T)[1]`" -date: "Generated on: `r Sys.time()`" -output: html_document -params: - interactive: TRUE - reads: !r commandArgs(trailingOnly=T)[2] # reads - counts: !r commandArgs(trailingOnly=T)[3] # csv - metadata: !r commandArgs(trailingOnly=T)[4] # metadata - filter: !r commandArgs(trailingOnly=T)[5] # filter min counts - heatmap: !r commandArgs(trailingOnly=T)[6] # heatmap - tax: !r commandArgs(trailingOnly=T)[7] # tax - try: !r commandArgs(trailingOnly=T)[8] # trymax - stats: !r commandArgs(trailingOnly=T)[9] # stats ---- - - -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE, - message = FALSE, - warning = FALSE, - out.width="100%") -``` - -```{r pathways, echo=FALSE} -knitr::include_graphics("vamplogo.png") -``` - -```{r load_libraries, include=FALSE} - -library(BiocManager) -library(vegan) -#library(rstatix) -library(tidyverse) -library(scales) -library(cowplot) -library(dplyr) -library(ggtree) -library(plotly) -#library(BiocParallel) -library(knitr) -library(kableExtra) #install.packages("kableExtra") -library(rmarkdown) -library(processx) #install.packages("processx") -#register(MulticoreParam(4)) -``` - -```{r colors, include=FALSE} -mycol=c('#088da5','#73cdc8','#ff6f61','#7cb8df','#88b04b','#00a199','#6B5B95','#92A8D1','#b0e0e6','#ff7f50','#088d9b','#E15D44','#e19336') -``` -
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -NOTE: Most plots are interactive and you can use the legend to specify samples/treatment of interest. You can also download an .svg version of each figure within this report. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -
-

  Pre- and Post-Adapter Removal Read Stats

-
-```{r readstats, echo=FALSE} -reads_stats=read.csv(params$reads) -#reads_stats=read.csv("PVID_final_reads_stats.csv") -paged_table(reads_stats,options = list(rows.print = 20)) - -#test plotly table -fig <- plot_ly( - type = 'table', - header = list(values=names(reads_stats), - align = c('left'), - line = list(width = 1, color = 'black'), - fill = list(color = 'rgb(45, 100, 230)')), - cells = list(values=unname(reads_stats), - line = list(width = 1, color = 'black'), - fill = list(color = 'white'), - align = c('center'), - font = list(color = '#506784', size = 10)) - ) - -#fig -``` -
-
- - -### Total number of reads before and after adapter removal - -```{r readstats_plot, echo=FALSE} -# Plot of reads before and after -ptotal <- plot_ly(typle="box",marker=list(colors=mycol)) -ptotal <- ptotal %>% add_boxplot(y=reads_stats$Total_before, name="Reads before filtering") -ptotal <- ptotal %>% add_boxplot(y=reads_stats$Total_after, name="Reads after filtering") -#ptotal <- ptotal %>% layout(title=list(text="Number of reads before and after filtering")) -ptotal <- ptotal %>% layout(legend = list(x=10,y=.5)) -ptotal <- ptotal %>% config(toImageButtonOptions=list(format='svg',filename='TotReads_b4_af_adaptrem', height= 500, width= 800, scale= 1)) -ptotal -``` -
- -### Forward (R1) and reverse (R2) read length before and after adapter removal - -```{r readstats_plot2, echo=FALSE} -# Plot of R1 and R2 before and after -pr <- plot_ly(y=reads_stats$R1_before_length, type="box", name="R1 length before") -pr <- pr %>% add_boxplot(y=reads_stats$R1_after_length, name="R1 length after") -pr <- pr %>% add_boxplot(y=reads_stats$R2_before_length, name="R2 length before") -pr <- pr %>% add_boxplot(y=reads_stats$R2_after_length, name="R2 length after") -#pr <- pr %>% layout(title = "R1 and R2 Length") -pr <- pr %>% layout(legend = list(x=10,y=.5)) -pr <- pr %>% config(toImageButtonOptions=list(format='svg',filename='readlen_b4_af_adaptrem', height= 500, width= 800, scale= 1)) -pr -``` -
-
-
-```{r load_datasets, include=FALSE} -sample_name=params$counts -sample_metadata=params$metadata -#sample_name="vAMPset_nOTU.90_counts.csv" -#sample_metadata="meta.csv" -data<- read.csv(sample_name, check.names=FALSE) -data2 <-as.data.frame(t(data)) -data2$sample <- row.names(data2) -colnames(data2)<- as.matrix(data2[1,]) -as.data.frame(data2) -data2 <- data2[-1,] - -#X.OTU.ID for X.Sequence. -data2 <- data2 %>% - rename(sample=OTU_ID) -data2dim <- dim(data2) - -##Loading metadata -samples <- read.csv(sample_metadata, header=TRUE) - -##Combining data and metadata -data3 <- merge(data2, samples, by="sample") - -dim_data3 <- dim(data3) -dim_samples <- dim(samples) -cols <- dim_data3[2]-dim_samples[2]+1 -first <-colnames(data3)[2] -last <- colnames(data3)[cols] -data3[,2:cols] <- lapply(data3[,2:cols], as.character) -data3[,2:cols] <- lapply(data3[,2:cols], as.numeric) - -#Calculate total reads per sample -data4 <- data3%>% - mutate(sum=select(.,2:cols)%>% - apply(1, sum, na.rm=TRUE)) - -``` - - -

  Number of Reads Per Sample

- -```{r plot, echo=FALSE} -# sample and count -con <- plot_ly(data4, x = ~sum, y = ~sample, name = "Sample", type = 'scatter', - mode = "markers", marker = list(color = "#088da5"), hovertemplate = paste('Sample: %{y}','
Total reads: %{x}','')) -con <- con %>% layout(xaxis = list(title = "Total reads"), yaxis = list(title = "Sample")) -con <- con %>% config(toImageButtonOptions=list(format='svg',filename='Counts_per_sample', height= 500, width= 800, scale= 1)) -con -``` -
-
-
-```{r filter_data, include=FALSE} -##Filter samples with low reads -nfil=params$filter -#nfil=1000 -data5 <- data4 %>% - filter(sum>nfil) - #can cause errors -data5dim <-dim(data5) -minreads<-min(data5$sum) -``` -
-
-
-
-
- -

  Rarefaction

-```{r rarefaction, echo=FALSE, cache=FALSE} -##Rarefaction curves -rarefaction <- rarecurve(data5[,2:cols]) - -##rarefied dataset -raredata <- as.data.frame(rrarefy(data5[,2:cols], sample=minreads)) -``` -
-
-
-
-
- - -

  Diversity Analyses Plots

- -
-
- -### Shannon diversity - -
-```{r diversity_analysis, echo=FALSE} -metadata <- data5[,(cols+1):data5dim[2]] -metadata$sample <- data5$sample -index <-diversity(raredata, index= "shannon") -shannondata5 <- as.data.frame(index) -shannondata5$sample<- data5$sample -shannondata5_2 <- merge(shannondata5, metadata, by="sample") - -#shannonplot <- ggplot(shannondata5_2, aes(x=treatment,color=treatment,y=index))+ -# geom_boxplot()+ -# geom_point()+ -# theme_classic()+ -# labs(y="Index",x="Treatment")+ -# theme(axis.text=element_text(size=12))+ -# theme(legend.position = "none") - -#sh<-ggplotly(shannonplot) -#sh <- sh %>% layout(title = list(text="Shannon diversty",y=.99)) -#sh - -sh <- plot_ly(shannondata5_2, x=~treatment, y=~index, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) -#sh <- sh %>% layout(title = list(text="Shannon diversty",y=.99)) -sh <- sh %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Index"), xaxis=list(title = "Treatment")) -sh <- sh %>% config(toImageButtonOptions=list(format='svg',filename='ShannonDiv', height= 500, width= 800, scale= 1)) -sh - -if (params$stats == "true" ) { - shannonaov <- aov(index ~ treatment, data= shannondata5_2) - st <- shapiro.test(resid(shannonaov)) - bt <- bartlett.test(index ~ treatment, data= shannondata5_2) - - if (st$p.value > .05 && bt$p.value > .05) { - print("Shapiro Test of normality - data is normal p-value > 0.05") - print(shapiro.test(resid(shannonaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05") - print(bartlett.test(index ~ treatment, data= shannondata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA Results") - print(summary(shannonaov)) - writeLines("\n--------------------------------------------------------------\n") - #Tukey Honest Significant Differences (pairwise comparison) - significant p <.05 - print("Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05") - print(TukeyHSD(shannonaov)) - writeLines("\n--------------------------------------------------------------\n") - } else { - print("Shapiro Test of normality - data is normal if p-value > 0.05") - print(shapiro.test(resid(shannonaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous if p-value > 0.05") - print(bartlett.test(index ~ treatment, data= shannondata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("Data either not normal or variance not homogenous") - print("Kruskal-Wallis Test - test significant if p <.05") - #Kruskal-Wallis test - significant p <.05 - mykt <- kruskal.test(index ~ treatment, data= shannondata5_2) - print(mykt) - writeLines("\n--------------------------------------------------------------\n") - if (mykt$p.value < .05) { - #Pairwise comparison - print("Wilcox.test - pairwise comparison") - print(pairwise.wilcox.test(shannondata5_2$index, shannondata5_2$treatment, p.adjust.method = "BH")) - } else { - print("Data not significant. Skipping pairwise comparison") - } - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA - one or more of the assumptions not met, take with a grain of salt.") - print(summary(shannonaov)) - writeLines("\n--------------------------------------------------------------\n") - } -} else { - print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") -} -``` -
-
-
-
- -### Simpson diversty - -
-```{r diversity_analysis2, echo=FALSE} -index <- diversity(raredata, index= "simpson") -simpsondata5 <- as.data.frame(index) -simpsondata5$sample<- data5$sample -simpsondata5_2 <- merge(simpsondata5, metadata, by="sample") - -#simpsonplot <- ggplot(simpsondata5_2, aes(x=treatment,color=treatment,y=index))+ -# geom_boxplot()+ -# geom_point()+ -# theme_classic()+ -# labs(y="Index",x="Treatment")+ -# theme(axis.text=element_text(size=12))+ -# theme(legend.position = "none") - -#s<-ggplotly(simpsonplot) -#s <- s %>% layout(title = list(text="Simpson diversty",y=.99)) -#s - -s <- plot_ly(simpsondata5_2, x=~treatment, y=~index, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) -#s <- s %>% layout(title = list(text="Simpson diversty",y=.99)) -s <- s %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Index"), xaxis=list(title = "Treatment")) -s <- s %>% config(toImageButtonOptions=list(format='svg',filename='SimpsonDiv', height= 500, width= 800, scale= 1)) -s - -if (params$stats == "true" ) { - simpsonaov <- aov(index ~ treatment, data= simpsondata5_2) - st <- shapiro.test(resid(simpsonaov)) - bt <- bartlett.test(index ~ treatment, data= simpsondata5_2) - - if (st$p.value > .05 && bt$p.value > .05) { - print("Shapiro Test of normality - data is normal p-value > 0.05") - print(shapiro.test(resid(simpsonaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05") - print(bartlett.test(index ~ treatment, data= simpsondata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA Results") - print(summary(simpsonaov)) - writeLines("\n--------------------------------------------------------------\n") - #Tukey Honest Significant Differences (pairwise comparison) - significant p <.05 - print("Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05") - print(TukeyHSD(simpsonaov)) - writeLines("\n--------------------------------------------------------------\n") - } else { - print("Shapiro Test of normality - data is normal if p-value > 0.05") - print(shapiro.test(resid(simpsonaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous if p-value > 0.05") - print(bartlett.test(index ~ treatment, data= simpsondata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("Data either not normal or variance not homogenous") - print("Kruskal-Wallis Test - test significant if p <.05") - #Kruskal-Wallis test - significant p <.05 - mykt <- kruskal.test(index ~ treatment, data= simpsondata5_2) - print(mykt) - writeLines("\n--------------------------------------------------------------\n") - if (mykt$p.value < .05) { - #Pairwise comparison - print("Wilcox.test - pairwise comparison") - print(pairwise.wilcox.test(simpsondata5_2$index, simpsondata5_2$treatment, p.adjust.method = "BH")) - } else { - print("Data not significant. Skipping pairwise comparison") - } - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA - one or more of the assumptions not met, take with a grain of salt.") - print(summary(simpsonaov)) - writeLines("\n--------------------------------------------------------------\n") - } -} else { - print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") -} -``` -
-
-
-
- -### Species Richness - -
-```{r diversity_analysis3, echo=FALSE} -mind5<-min(data5$sum) -index <- rarefy(data5[,2:cols], sample=mind5) -rarerichnessdata5 <- as.data.frame(index) -rarerichnessdata5$sample <-data5$sample -richdata5_2 <- merge(rarerichnessdata5, metadata, by="sample") - -#richnessplot <- ggplot(richdata5_2, aes(x=treatment,color=treatment,y=index))+ -# geom_boxplot()+ -# geom_point()+ -# theme_classic()+ -# labs(y="Richness",x="Treatment")+ -# theme(axis.text=element_text(size=12))+ -# theme(legend.position = "none") - -ri <- plot_ly(richdata5_2, x=~treatment, y=~index, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) -#ri <- ri %>% layout(title = list(text="ASV Richness",y=.99)) -ri <- ri %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Index"), xaxis=list(title = "Treatment")) -ri <- ri %>% config(toImageButtonOptions=list(format='svg',filename='SpeciesRich', height= 500, width= 800, scale= 1)) -ri - -if (params$stats == "true" ) { - richaov <- aov(index ~ treatment, data= richdata5_2) - st <- shapiro.test(resid(richaov)) - bt <- bartlett.test(index ~ treatment, data= richdata5_2) - - if (st$p.value > .05 && bt$p.value > .05) { - print("Shapiro Test of normality - data is normal p-value > 0.05") - print(shapiro.test(resid(richaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05") - print(bartlett.test(index ~ treatment, data= richdata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA Results") - print(summary(richaov)) - writeLines("\n--------------------------------------------------------------\n") - #Tukey Honest Significant Differences (pairwise comparison) - significant p <.05 - print("Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05") - print(TukeyHSD(richaov)) - writeLines("\n--------------------------------------------------------------\n") - } else { - print("Shapiro Test of normality - data is normal if p-value > 0.05") - print(shapiro.test(resid(richaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous if p-value > 0.05") - print(bartlett.test(index ~ treatment, data= richdata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("Data either not normal or variance not homogenous") - print("Kruskal-Wallis Test - test significant if p <.05") - #Kruskal-Wallis test - significant p <.05 - mykt <- kruskal.test(index ~ treatment, data= richdata5_2) - print(mykt) - writeLines("\n--------------------------------------------------------------\n") - if (mykt$p.value < .05) { - #Pairwise comparison - print("Wilcox.test - pairwise comparison") - print(pairwise.wilcox.test(richdata5_2$index, richdata5_2$treatment, p.adjust.method = "BH")) - } else { - print("Data not significant. Skipping pairwise comparison") - } - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA - one or more of the assumptions not met, take with a grain of salt.") - print(summary(richaov)) - writeLines("\n--------------------------------------------------------------\n") - } -} else { - print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") -} -``` -
-
-
-
-
- -

  Distance To Centroid

-
-```{r distance, echo=FALSE} -##Distance -intermediate <- raredata -bray.distance <- vegdist(intermediate, method="bray",autotransform=TRUE) - -##Dispersion -disper <- betadisper(bray.distance, group = metadata$treatment, type="centroid") -#anova(disper) -df <- data.frame(Distance_to_centroid=disper$distances,Group=disper$group) -df$sample <- data5$sample -df2 <- merge(df, metadata, by="sample") - -#p<- ggplot(data=df2,aes(x=treatment,y=Distance_to_centroid,colour=treatment))+ -# geom_boxplot(outlier.alpha = 0)+ -# theme_classic()+ -# geom_point(position=position_dodge(width=0.75))+ -# labs(y="Distance",x="Treatment")+ -# theme(axis.text=element_text(size=12))+ -# theme(legend.position = "none") - -#cen <- ggplotly(p) -#cen <- cen %>% layout(title = list(text="Distance to centroid",y=.99)) -#cen - -cen <- plot_ly(df2, x=~treatment, y=~Distance_to_centroid, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) -#cen <- cen %>% layout(title = list(text="Distance to centroid",y=.99)) -cen <- cen %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Distance"), xaxis=list(title = "Treatment")) -cen <- cen %>% config(toImageButtonOptions=list(format='svg',filename='Dispersion', height= 500, width= 800, scale= 1)) -cen - -if (params$stats == "true" ) { - adn <- adonis(bray.distance~data5$treatment) - adn -} else { - print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") -} -``` -
-
-
-
-
- -

  NMDS Plots

- -
- -### 2D NMDS - -
-```{r nmds2d, echo=FALSE} -##NMDS -datax <- decostand(raredata,method="total") #method 'total' normalizes data to sum up to 1 --data5[,2:cols] - -MDS <- metaMDS(sqrt(datax), - distance = "bray",autotransform = FALSE, - k = 2, - maxit = 999, - trymax = params$try, - wascores = TRUE) - -if (MDS$converged == "TRUE") { - -data.scores <- as.data.frame(scores(MDS)) -data.scores$sample <- data5$sample -data.scores.2 <- merge(data.scores, metadata, by="sample") - -p <- ggplot(data.scores.2, aes(x=NMDS1, y=NMDS2,color=treatment))+ - geom_point(size=2)+ - theme_classic()+ - theme(legend.title = element_blank()) - - -#fff <- ggplotly(p) -#fff <- fff %>% layout(legend=list(y=.5)) -#fff - -fff <-plot_ly(data.scores.2, x=~NMDS1, y=~NMDS2, color=~treatment, colors=mycol, text = ~paste("Sample: ", sample)) -fff <- fff %>% layout(legend=list(y=.5)) -fff <- fff %>% config(toImageButtonOptions=list(format='svg',filename='2Dnmds', height= 500, width= 800, scale= 1)) -fff - -} else { - print("No Convergence") -} -``` - -
-
-
-
- -### 3D NMDS - -
- -```{r nmds3d, echo=FALSE} -MDS3 <- metaMDS(sqrt(datax), - distance = "bray",autotransform = FALSE, - k = 3, - maxit = 999, - trymax = params$try, - wascores = TRUE) - -if (MDS3$converged == "TRUE") { - -data.scores3 <- as.data.frame(scores(MDS3)) -data.scores3$sample <- data5$sample -data.scores.3 <- merge(data.scores3, metadata, by="sample") -p3d <- plot_ly(data.scores.3, x= ~ NMDS1, y = ~ NMDS2, z = ~ NMDS3, text = ~paste("Sample: ", sample), - color = ~treatment, colors = mycol, - mode = 'markers', symbol = ~treatment, symbols = c('square','circle'), - marker = list(opacity = .8,line=list(color = 'darkblue',width = 1)) - ) -p3d <- p3d %>% layout(legend=list(y=.5)) -p3d <- p3d %>% config(toImageButtonOptions=list(format='svg',filename='3Dnmds', height= 500, width= 800, scale= 1)) -p3d - -} else { - print("No Convergence") -} -``` -
-
-
-
-
- -

  OTU Abundance Per Sample

- -```{r long, echo=FALSE} -dataz <- decostand(data5[,2:cols],method="total") #method 'total' normalizes data to sum up to 1 -dataz$sample <- data5$sample -datay <- merge(dataz, metadata, by="sample") -datalong <- datay %>% - tidyr::gather(first:last, key=hit, value=reads) - -##Barplot -## add better colors -#spec_bar <- ggplot(datalong, aes(x=forcats::fct_reorder(timepoint, as.numeric(as.character(timepoint))), -# y=reads, fill=hit))+ #Consider sqrt-transforming data -# geom_bar(aes(), stat="identity", position="fill")+ -# #coord_polar("y", start=0)+ -# theme_classic()+ -# facet_wrap(colony~treatment, nrow=2)+ -# #coord_flip()+ -# labs(x="Timepoint") #+ theme(legend.position = "none") -#spec_bar <- ggplot(datalong, aes(x=sample,y=reads,fill=hit))+geom_bar(aes(), stat="identity", position="fill")+ -# theme(axis.text.x=element_text(angle=90)) -#ggplotly(spec_bar) -#,'#00b300','#00b3b3','#0059b3','#6600ff','#b800e6','#ff3333','#ff8000','#ffff00','#bf8040','#42bcf5','#b428f5','#2e8d7e','#664e7e','#a4c700','#1aa3ff' - -ddd <- plot_ly(datalong, x=~sample, y=~reads, color=~hit, colors=mycol) -ddd <- ddd %>% layout(type='bar', barmode = 'stack') -ddd <- ddd %>% layout(legend = list(x=10,y=.5), xaxis=list(title = "Sample"), yaxis=list(title = "Relative abundance")) -ddd <- ddd %>% config(toImageButtonOptions=list(format='svg',filename='Relative_abundance', height= 500, width= 800, scale= 1)) -ddd -``` -
-
-
-
-
- -

  OTU Abundance Per Treatment

- -```{r asv_barplot, echo=FALSE} -datalong <- datalong %>% - filter(reads>0) - -#asv_bar <- ggplot(datalong, aes(x=reorder(hit,reads), y=reads, fill=treatment))+ -# geom_bar(stat="identity")+ -# scale_fill_manual(values=c('#088da5','#e19336'))+ #colors not working -# coord_flip()+ -# theme_classic()+ -# theme(axis.title.y = element_blank())+ -# theme(legend.title = element_blank()) - -asp2 <- plot_ly(datalong, y=~hit, x=~reads, color=~treatment, colors=mycol,text = ~paste("Sample: ", sample), opacity=.9) -asp2 <- asp2 %>% layout(type='bar', barmode = 'group') -asp2 <- asp2 %>% layout(yaxis = list(title = '', categoryorder = "total ascending"), legend = list(x=10,y=.5)) -asp2 <- asp2 %>% config(toImageButtonOptions=list(format='svg',filename='Most_abundant_hits_per_sample', height= 500, width= 800, scale= 1)) -asp2 -``` -
-
-
-
-
- -

  Pairwise Percent-ID Heatmap

- -
-
-```{r heatmap, echo=FALSE} -heatdata=params$heatmap -#heatdata="a.csv" -#heatdata="PVID_vAMPtest1_otu.85_PercentID.matrix" -simmatrix<- read.csv(heatdata, header=FALSE) -rownames(simmatrix) <- simmatrix[,1] -simmatrix <- simmatrix[,-1] -colnames(simmatrix) <-rownames(simmatrix) -cols <- dim(simmatrix)[2] -simmatrix$AA <- rownames(simmatrix) -rval=nrow(simmatrix) -simmatrix2 <- simmatrix %>% - gather(1:rval, key=sequence, value=similarity) -x=reorder(simmatrix2$AA,simmatrix2$similarity) -y=reorder(simmatrix2$sequence,simmatrix2$similarity) -similaritymatrix <- ggplot(simmatrix2, aes(x=x, y=y,fill=similarity))+ - geom_raster()+ - scale_fill_distiller(palette="Spectral")+ - theme(axis.text.x = element_text(angle = 90))+ - theme(axis.title.x=element_blank())+ - theme(axis.title.y=element_blank()) - - -heat <- ggplotly(similaritymatrix) -heat <- heat %>% config(toImageButtonOptions=list(format='svg',filename='heatmap', height= 500, width= 800, scale= 1)) -heat -``` -
-
-
-
-
- - -

  Taxonomy Result Visualization

- -
-
- -```{r taxonomy, echo=FALSE} -tax=read.csv(params$tax,header=F) -#tax=read.csv("tax.csv",header=F) -#tax=read.csv("PVID_vAMPtest1_otu.85_summary_for_plot.csv", header=F) -tp <- plot_ly(tax, labels = ~V1, values = ~V2) -tp <- tp %>% add_pie(marker=list(colors=mycol, line=list(color='#000000', width=.5)), hole = 0.6) -tp <- tp %>% layout(title = "Taxonomy distribution", showlegend = F, - xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), - yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE) - ) -tp <- tp %>% config(toImageButtonOptions=list(format='svg',filename='TaxDonut', height= 500, width= 800, scale= 1)) -tp -``` -
-
-
-
-
-
-
-
-
-
diff --git a/bin/vAMPirus_ReportB.Rmd b/bin/vAMPirus_ReportB.Rmd deleted file mode 100644 index 29b0385..0000000 --- a/bin/vAMPirus_ReportB.Rmd +++ /dev/null @@ -1,725 +0,0 @@ ---- -title: "vAMPirus Analyze Report `r commandArgs(trailingOnly=T)[1]`" -date: "Generated on: `r Sys.time()`" -output: html_document -params: - interactive: TRUE - reads: !r commandArgs(trailingOnly=T)[2] # reads - counts: !r commandArgs(trailingOnly=T)[3] # csv - metadata: !r commandArgs(trailingOnly=T)[4] # metadata - filter: !r commandArgs(trailingOnly=T)[5] # filter min counts - heatmap: !r commandArgs(trailingOnly=T)[6] # heatmap - tax: !r commandArgs(trailingOnly=T)[7] # tax - tree: !r commandArgs(trailingOnly=T)[8] # tree - try: !r commandArgs(trailingOnly=T)[9] # trymax - stats: !r commandArgs(trailingOnly=T)[10] # stats - ---- - - -```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE, - message = FALSE, - warning = FALSE, - out.width="100%") -``` - -```{r pathways, echo=FALSE} -knitr::include_graphics("vamplogo.png") -``` - -```{r load_libraries, include=FALSE} - -library(vegan) -#library(rstatix) -library(tidyverse) -library(scales) -library(cowplot) -library(dplyr) -library(ggtree) -library(plotly) -#library(BiocParallel) -library(knitr) -library(kableExtra) #install.packages("kableExtra") -library(rmarkdown) -library(processx) #install.packages("processx") -#register(MulticoreParam(4)) -``` - -```{r colors, include=FALSE} -mycol=c('#088da5','#73cdc8','#ff6f61','#7cb8df','#88b04b','#00a199','#6B5B95','#92A8D1','#b0e0e6','#ff7f50','#088d9b','#E15D44','#e19336') -``` -
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -NOTE: Most plots are interactive and you can use the legend to specify samples/treatment of interest. You can also download an .svg version of each figure within this report. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -
-

  Pre- and Post-Adapter Removal Read Stats

-
-```{r readstats, echo=FALSE} -reads_stats=read.csv(params$reads) -#reads_stats=read.csv("PVID_final_reads_stats.csv") -paged_table(reads_stats,options = list(rows.print = 20)) - -#test plotly table -fig <- plot_ly( - type = 'table', - header = list(values=names(reads_stats), - align = c('left'), - line = list(width = 1, color = 'black'), - fill = list(color = 'rgb(45, 100, 230)')), - cells = list(values=unname(reads_stats), - line = list(width = 1, color = 'black'), - fill = list(color = 'white'), - align = c('center'), - font = list(color = '#506784', size = 10)) - ) - -#fig -``` -
-
- - -### Total number of reads before and after adapter removal - -```{r readstats_plot, echo=FALSE} -# Plot of reads before and after -ptotal <- plot_ly(type="box",marker=list(colors=mycol)) -ptotal <- ptotal %>% add_boxplot(y=reads_stats$Total_before, name="Reads before filtering") -ptotal <- ptotal %>% add_boxplot(y=reads_stats$Total_after, name="Reads after filtering") -#ptotal <- ptotal %>% layout(title=list(text="Number of reads before and after filtering")) -ptotal <- ptotal %>% layout(legend = list(x=10,y=.5)) -ptotal <- ptotal %>% config(toImageButtonOptions=list(format='svg',filename='TotReads_b4_af_adaptrem', height= 500, width= 800, scale= 1)) -ptotal -``` -
- -### Forward (R1) and reverse (R2) read length before and after adapter removal - -```{r readstats_plot2, echo=FALSE} -# Plot of R1 and R2 before and after -pr <- plot_ly(y=reads_stats$R1_before_length, type="box", name="R1 length before") -pr <- pr %>% add_boxplot(y=reads_stats$R1_after_length, name="R1 length after") -pr <- pr %>% add_boxplot(y=reads_stats$R2_before_length, name="R2 length before") -pr <- pr %>% add_boxplot(y=reads_stats$R2_after_length, name="R2 length after") -#pr <- pr %>% layout(title = "R1 and R2 Length") -pr <- pr %>% layout(legend = list(x=10,y=.5)) -pr <- pr %>% config(toImageButtonOptions=list(format='svg',filename='readlen_b4_af_adaptrem', height= 500, width= 800, scale= 1)) -pr -``` -
-
-
-```{r load_datasets, include=FALSE} -sample_name=params$counts -sample_metadata=params$metadata -#sample_name="PVID_vAMPtest1_otu.85_counts.csv" -#sample_metadata="PVID_fiscesTestmeta.csv" -#sample_name="vAMPrun_otu.55_counts.csv" -#sample_metadata="pvid_samples.csv" -data<- read.csv(sample_name, check.names=FALSE) -data2 <-as.data.frame(t(data)) -data2$sample <- row.names(data2) -colnames(data2)<- as.matrix(data2[1,]) -as.data.frame(data2) -data2 <- data2[-1,] - -#X.OTU.ID for X.Sequence. -data2 <- data2 %>% - rename(sample=OTU_ID) -data2dim <- dim(data2) - -##Loading metadata -samples <- read.csv(sample_metadata) - -##Combining data and metadata -data3 <- merge(data2, samples, by="sample") - -dim_data3 <- dim(data3) -dim_samples <- dim(samples) -cols <- dim_data3[2]-dim_samples[2]+1 -first <-colnames(data3)[2] -last <- colnames(data3)[cols] -data3[,2:cols] <- lapply(data3[,2:cols], as.character) -data3[,2:cols] <- lapply(data3[,2:cols], as.numeric) - -#Calculate total reads per sample -data4 <- data3%>% - mutate(sum=select(.,2:cols)%>% - apply(1, sum, na.rm=TRUE)) - -``` - - -

  Number of Reads Per Sample

- -```{r plot, echo=FALSE} -# sample and count -con <- plot_ly(data4, x = ~sum, y = ~sample, name = "Sample", type = 'scatter', - mode = "markers", marker = list(color = "#088da5"), hovertemplate = paste('Sample: %{y}','
Total reads: %{x}','')) -con <- con %>% layout(xaxis = list(title = "Total reads"),yaxis = list(title = "Sample")) -con <- con %>% config(toImageButtonOptions=list(format='svg',filename='Counts_per_sample', height= 500, width= 800, scale= 1)) -con -``` -
-
-
-```{r filter_data, include=FALSE} -##Filter samples with low reads -nfil=params$filter -data5 <- data4 %>% - filter(sum>nfil) - #can cause errors -data5dim <-dim(data5) -minreads<-min(data5$sum) -``` -
-
-
-
-
- -

  Rarefaction

-```{r rarefaction, echo=FALSE, cache=FALSE} -##Rarefaction curves -rarefaction <- rarecurve(data5[,2:cols]) - -##rarefied dataset -raredata <- as.data.frame(rrarefy(data5[,2:cols], sample=minreads)) -``` -
-
-
-
-
- - -

  Diversity Analyses Plots

- -
-
- -### Shannon diversty - -
-```{r diversity_analysis, echo=FALSE} -metadata <- data5[,(cols+1):data5dim[2]] -metadata$sample <- data5$sample -index <-diversity(raredata, index= "shannon") -shannondata5 <- as.data.frame(index) -shannondata5$sample<- data5$sample -shannondata5_2 <- merge(shannondata5, metadata, by="sample") - -#shannonplot <- ggplot(shannondata5_2, aes(x=treatment,color=treatment,y=index))+ -# geom_boxplot()+ -# geom_point()+ -# theme_classic()+ -# labs(y="Index",x="Treatment")+ -# theme(axis.text=element_text(size=12))+ -# theme(legend.position = "none") - -#sh<-ggplotly(shannonplot) -#sh <- sh %>% layout(title = list(text="Shannon diversty",y=.99)) -#sh - -sh <- plot_ly(shannondata5_2, x=~treatment, y=~index, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) -#sh <- sh %>% layout(title = list(text="Shannon diversty",y=.99)) -sh <- sh %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Index"), xaxis=list(title = "Treatment")) -sh <- sh %>% config(toImageButtonOptions=list(format='svg',filename='ShannonDiv', height= 500, width= 800, scale= 1)) -sh - -if (params$stats == "true" ) { - shannonaov <- aov(index ~ treatment, data= shannondata5_2) - st <- shapiro.test(resid(shannonaov)) - bt <- bartlett.test(index ~ treatment, data= shannondata5_2) - - if (st$p.value > .05 && bt$p.value > .05) { - print("Shapiro Test of normality - data is normal p-value > 0.05") - print(shapiro.test(resid(shannonaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05") - print(bartlett.test(index ~ treatment, data= shannondata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA Results") - print(summary(shannonaov)) - writeLines("\n--------------------------------------------------------------\n") - #Tukey Honest Significant Differences (pairwise comparison) - significant p <.05 - print("Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05") - print(TukeyHSD(shannonaov)) - writeLines("\n--------------------------------------------------------------\n") - } else { - print("Shapiro Test of normality - data is normal if p-value > 0.05") - print(shapiro.test(resid(shannonaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous if p-value > 0.05") - print(bartlett.test(index ~ treatment, data= shannondata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("Data either not normal or variance not homogenous") - print("Kruskal-Wallis Test - test significant if p <.05") - #Kruskal-Wallis test - significant p <.05 - mykt <- kruskal.test(index ~ treatment, data= shannondata5_2) - print(mykt) - writeLines("\n--------------------------------------------------------------\n") - if (mykt$p.value < .05) { - #Pairwise comparison - print("Wilcox.test - pairwise comparison") - print(pairwise.wilcox.test(shannondata5_2$index, shannondata5_2$treatment, p.adjust.method = "BH")) - } else { - print("Data not significant. Skipping pairwise comparison") - } - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA - one or more of the assumptions not met, take with a grain of salt.") - print(summary(shannonaov)) - writeLines("\n--------------------------------------------------------------\n") - } -} else { - print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") -} -``` -
-
-
-
- -### Simpson diversty - -
-```{r diversity_analysis2, echo=FALSE} -index <- diversity(raredata, index= "simpson") -simpsondata5 <- as.data.frame(index) -simpsondata5$sample<- data5$sample -simpsondata5_2 <- merge(simpsondata5, metadata, by="sample") - -#simpsonplot <- ggplot(simpsondata5_2, aes(x=treatment,color=treatment,y=index))+ -# geom_boxplot()+ -# geom_point()+ -# theme_classic()+ -# labs(y="Index",x="Treatment")+ -# theme(axis.text=element_text(size=12))+ -# theme(legend.position = "none") - -#s<-ggplotly(simpsonplot) -#s <- s %>% layout(title = list(text="Simpson diversty",y=.99)) -#s - -s <- plot_ly(simpsondata5_2, x=~treatment, y=~index, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) -#s <- s %>% layout(title = list(text="Simpson diversty",y=.99)) -s <- s %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Index"), xaxis=list(title = "Treatment")) -s <- s %>% config(toImageButtonOptions=list(format='svg',filename='SimpsonDiv', height= 500, width= 800, scale= 1)) -s - -if (params$stats == "true" ) { - simpsonaov <- aov(index ~ treatment, data= simpsondata5_2) - st <- shapiro.test(resid(simpsonaov)) - bt <- bartlett.test(index ~ treatment, data= simpsondata5_2) - - if (st$p.value > .05 && bt$p.value > .05) { - print("Shapiro Test of normality - data is normal p-value > 0.05") - print(shapiro.test(resid(simpsonaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05") - print(bartlett.test(index ~ treatment, data= simpsondata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA Results") - print(summary(simpsonaov)) - writeLines("\n--------------------------------------------------------------\n") - #Tukey Honest Significant Differences (pairwise comparison) - significant p <.05 - print("Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05") - print(TukeyHSD(simpsonaov)) - writeLines("\n--------------------------------------------------------------\n") - } else { - print("Shapiro Test of normality - data is normal if p-value > 0.05") - print(shapiro.test(resid(simpsonaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous if p-value > 0.05") - print(bartlett.test(index ~ treatment, data= simpsondata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("Data either not normal or variance not homogenous") - print("Kruskal-Wallis Test - test significant if p <.05") - #Kruskal-Wallis test - significant p <.05 - mykt <- kruskal.test(index ~ treatment, data= simpsondata5_2) - print(mykt) - writeLines("\n--------------------------------------------------------------\n") - if (mykt$p.value < .05) { - #Pairwise comparison - print("Wilcox.test - pairwise comparison") - print(pairwise.wilcox.test(simpsondata5_2$index, simpsondata5_2$treatment, p.adjust.method = "BH")) - } else { - print("Data not significant. Skipping pairwise comparison") - } - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA - one or more of the assumptions not met, take with a grain of salt.") - print(summary(simpsonaov)) - writeLines("\n--------------------------------------------------------------\n") - } -} else { - print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") -} -``` -
-
-
-
- -### Species Richness - -
-```{r diversity_analysis3, echo=FALSE} -mind5<-min(data5$sum) -index <- rarefy(data5[,2:cols], sample=mind5) -rarerichnessdata5 <- as.data.frame(index) -rarerichnessdata5$sample <-data5$sample -richdata5_2 <- merge(rarerichnessdata5, metadata, by="sample") - -#richnessplot <- ggplot(richdata5_2, aes(x=treatment,color=treatment,y=index))+ -# geom_boxplot()+ -# geom_point()+ -# theme_classic()+ -# labs(y="Richness",x="Treatment")+ -# theme(axis.text=element_text(size=12))+ -# theme(legend.position = "none") - -ri <- plot_ly(richdata5_2, x=~treatment, y=~index, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) -#ri <- ri %>% layout(title = list(text="ASV Richness",y=.99)) -ri <- ri %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Index"), xaxis=list(title = "Treatment")) -ri <- ri %>% config(toImageButtonOptions=list(format='svg',filename='SpeciesRich', height= 500, width= 800, scale= 1)) -ri - -if (params$stats == "true" ) { - richaov <- aov(index ~ treatment, data= richdata5_2) - st <- shapiro.test(resid(richaov)) - bt <- bartlett.test(index ~ treatment, data= richdata5_2) - - if (st$p.value > .05 && bt$p.value > .05) { - print("Shapiro Test of normality - data is normal p-value > 0.05") - print(shapiro.test(resid(richaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05") - print(bartlett.test(index ~ treatment, data= richdata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA Results") - print(summary(richaov)) - #Tukey Honest Significant Differences (pairwise comparison) - significant p <.05 - writeLines("\n--------------------------------------------------------------\n") - print("Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05") - print(TukeyHSD(richaov)) - writeLines("\n--------------------------------------------------------------\n") - } else { - print("Shapiro Test of normality - data is normal if p-value > 0.05") - print(shapiro.test(resid(richaov))) - writeLines("\n--------------------------------------------------------------\n") - print("Bartlett Test variance homogeneity - variance is homogeneous if p-value > 0.05") - print(bartlett.test(index ~ treatment, data= richdata5_2)) - writeLines("\n--------------------------------------------------------------\n") - print("Data either not normal or variance not homogenous") - print("Kruskal-Wallis Test - test significant if p <.05") - #Kruskal-Wallis test - significant p <.05 - mykt <- kruskal.test(index ~ treatment, data= richdata5_2) - print(mykt) - writeLines("\n--------------------------------------------------------------\n") - if (mykt$p.value < .05) { - #Pairwise comparison - print("Wilcox.test - pairwise comparison") - print(pairwise.wilcox.test(richdata5_2$index, richdata5_2$treatment, p.adjust.method = "BH")) - } else { - print("Data not significant. Skipping pairwise comparison") - } - writeLines("\n--------------------------------------------------------------\n") - print("ANOVA - one or more of the assumptions not met, take with a grain of salt.") - print(summary(richaov)) - writeLines("\n--------------------------------------------------------------\n") - } -} else { - print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") -} -``` -
-
-
-
-
- -

  Distance To Centroid

-
-```{r distance, echo=FALSE} -##Distance -intermediate <- raredata -bray.distance <- vegdist(sqrt(intermediate), method="bray") - -##Dispersion -disper <- betadisper(bray.distance, group = metadata$treatment, type="centroid") -df <- data.frame(Distance_to_centroid=disper$distances,Group=disper$group) -df$sample <- data5$sample -df2 <- merge(df, metadata, by="sample") - -#p<- ggplot(data=df2,aes(x=treatment,y=Distance_to_centroid,colour=treatment))+ -# geom_boxplot(outlier.alpha = 0)+ -# theme_classic()+ -# geom_point(position=position_dodge(width=0.75))+ -# labs(y="Distance",x="Treatment")+ -# theme(axis.text=element_text(size=12))+ -# theme(legend.position = "none") - -#cen <- ggplotly(p) -#cen <- cen %>% layout(title = list(text="Distance to centroid",y=.99)) -#cen - -cen <- plot_ly(df2, x=~treatment, y=~Distance_to_centroid, color=~treatment, colors=mycol, type="box", boxpoints = "all", pointpos = 0, jitter = 0.5) -#cen <- cen %>% layout(title = list(text="Distance to centroid",y=.99)) -cen <- cen %>% layout(legend = list(x=10,y=.5), yaxis=list(title = "Distance"), xaxis=list(title = "Treatment")) -cen <- cen %>% config(toImageButtonOptions=list(format='svg',filename='Dispersion', height= 500, width= 800, scale= 1)) -cen - -if (params$stats == "true" ) { - adn <- adonis(bray.distance~data5$treatment) - adn -} else { - print("Stats skipped. To toggle on use \"--stats run\" in vAMPirus launch command") -} -``` -
-
-
-
-
- -

  NMDS Plots

- -
- -### 2D NMDS - -
-```{r nmds2d, echo=FALSE} -##NMDS -datax <- decostand(raredata,method="total") #method 'total' normalizes data to sum up to 1 --data5[,2:cols] - -MDS <- metaMDS(sqrt(datax), - distance = "bray",autotransform = FALSE, - k = 2, - maxit = 999, - trymax = params$try, - wascores = TRUE) - -if (MDS$converged == "TRUE") { - -data.scores <- as.data.frame(scores(MDS)) -data.scores$sample <- data5$sample -data.scores.2 <- merge(data.scores, metadata, by="sample") - -p <- ggplot(data.scores.2, aes(x=NMDS1, y=NMDS2,color=treatment))+ - geom_point(size=2)+ - theme_classic()+ - theme(legend.title = element_blank()) - -#fff <- ggplotly(p) -#fff <- fff %>% layout(legend=list(y=.5)) -#fff - -fff <-plot_ly(data.scores.2, x=~NMDS1, y=~NMDS2, color=~treatment, colors=mycol, text = ~paste("Sample: ", sample)) -fff <- fff %>% layout(legend=list(y=.5)) -fff <- fff %>% config(toImageButtonOptions=list(format='svg',filename='2Dnmds', height= 500, width= 800, scale= 1)) -fff - -} else { - print("No Convergence") -} -``` - -
-
-
-
- -### 3D NMDS - -
- -```{r nmds3d, echo=FALSE} -MDS3 <- metaMDS(sqrt(datax), - distance = "bray",autotransform = FALSE, - k = 3, - maxit = 999, - trymax = params$try, - wascores = TRUE) - -if (MDS3$converged == "TRUE") { - -data.scores3 <- as.data.frame(scores(MDS3)) -data.scores3$sample <- data5$sample -data.scores.3 <- merge(data.scores3, metadata, by="sample") -p3d <- plot_ly(data.scores.3, x=~NMDS1, y=~NMDS2, z=~NMDS3, text=~paste("Sample: ", sample), - color=~treatment, colors=mycol, - mode = 'markers', symbol = ~treatment, symbols = c('square','circle'), - marker = list(opacity = .8,line=list(color = 'darkblue',width = 1)) - ) -p3d <- p3d %>% layout(legend=list(y=.5)) -p3d <- p3d %>% config(toImageButtonOptions=list(format='svg',filename='3Dnmds', height= 500, width= 800, scale= 1)) -p3d - -} else { - print("No Convergence") -} -``` -
-
-
-
-
- -

  OTU Abundance Per Sample

- -```{r long, echo=FALSE} -dataz <- decostand(data5[,2:cols],method="total") #method 'total' normalizes data to sum up to 1 -dataz$sample <- data5$sample -datay <- merge(dataz, metadata, by="sample") -datalong <- datay %>% - tidyr::gather(first:last, key=hit, value=reads) - -##Barplot -## add better colors -#spec_bar <- ggplot(datalong, aes(x=forcats::fct_reorder(timepoint, as.numeric(as.character(timepoint))), -# y=reads, fill=hit))+ #Consider sqrt-transforming data -# geom_bar(aes(), stat="identity", position="fill")+ -# #coord_polar("y", start=0)+ -# theme_classic()+ -# facet_wrap(colony~treatment, nrow=2)+ -# #coord_flip()+ -# labs(x="Timepoint") #+ theme(legend.position = "none") -#spec_bar <- ggplot(datalong, aes(x=sample,y=reads,fill=hit))+geom_bar(aes(), stat="identity", position="fill")+ -# theme(axis.text.x=element_text(angle=90)) -#ggplotly(spec_bar) -#,'#00b300','#00b3b3','#0059b3','#6600ff','#b800e6','#ff3333','#ff8000','#ffff00','#bf8040','#42bcf5','#b428f5','#2e8d7e','#664e7e','#a4c700','#1aa3ff' - -ddd <- plot_ly(datalong, x=~sample, y=~reads, color=~hit, colors=mycol) -ddd <- ddd %>% layout(type='bar',barmode = 'stack') -ddd <- ddd %>% layout(legend = list(x=10,y=.5), xaxis=list(title = "Sample"), yaxis=list(title = "Relative abundance")) -ddd <- ddd %>% config(toImageButtonOptions=list(format='svg',filename='Relative_abundance', height= 500, width= 800, scale= 1)) -ddd -``` -
-
-
-
-
- -

  OTU Abundance Per Treatment

- -```{r asv_barplot, echo=FALSE} -datalong <- datalong %>% - filter(reads>0) - -#asv_bar <- ggplot(datalong, aes(x=reorder(hit,reads), y=reads, fill=treatment))+ -# geom_bar(stat="identity")+ -# scale_fill_manual(values=c('#088da5','#e19336'))+ #colors not working -# coord_flip()+ -# theme_classic()+ -# theme(axis.title.y = element_blank())+ -# theme(legend.title = element_blank()) - -asp2 <- plot_ly(datalong, y=~hit, x=~reads, color=~treatment, colors=mycol,text = ~paste("Sample: ", sample), opacity=.9) -asp2 <- asp2 %>% layout(type='bar', barmode = 'group') -asp2 <- asp2 %>% layout(yaxis = list(title = '', categoryorder = "total ascending"), legend = list(x=10,y=.5)) -asp2 <- asp2 %>% config(toImageButtonOptions=list(format='svg',filename='Most_abundant_hits_per_sample', height= 500, width= 800, scale= 1)) -asp2 -``` -
-
-
-
-
- -

  Pairwise Percent-ID Heatmap

- -
-
-```{r heatmap, echo=FALSE} -heatdata=params$heatmap -#heatdata="a.csv" -#heatdata="PVID_vAMPtest1_otu.85_PercentID.matrix" -simmatrix<- read.csv(heatdata, header=FALSE) -rownames(simmatrix) <- simmatrix[,1] -simmatrix <- simmatrix[,-1] -colnames(simmatrix) <-rownames(simmatrix) -cols <- dim(simmatrix)[2] -simmatrix$AA <- rownames(simmatrix) -rval=nrow(simmatrix) -simmatrix2 <- simmatrix %>% - gather(1:rval, key=sequence, value=similarity) -x=reorder(simmatrix2$AA,simmatrix2$similarity) -y=reorder(simmatrix2$sequence,simmatrix2$similarity) -similaritymatrix <- ggplot(simmatrix2, aes(x=x, y=y,fill=similarity))+ - geom_raster()+ - scale_fill_distiller(palette="Spectral")+ - theme(axis.text.x = element_text(angle = 90))+ - theme(axis.title.x=element_blank())+ - theme(axis.title.y=element_blank()) - -heat <- ggplotly(similaritymatrix) -heat <- heat %>% config(toImageButtonOptions=list(format='svg',filename='heatmap', height= 500, width= 800, scale= 1)) -heat -``` -
-
-
-
-
- - -

  Taxonomy Result Visualization

- -
-
- -```{r taxonomy, echo=FALSE} -tax=read.csv(params$tax,header=F) -#tax=read.csv("tax.csv",header=F) -#tax=read.csv("PVID_vAMPtest1_otu.85_summary_for_plot.csv", header=F) -tp <- plot_ly(tax, labels = ~V1, values = ~V2) -tp <- tp %>% add_pie(marker=list(colors=mycol, line=list(color='#000000', width=.5)), hole = 0.6) -tp <- tp %>% layout(title = "Taxonomy distribution", showlegend = F, - xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), - yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE) - ) -tp <- tp %>% config(toImageButtonOptions=list(format='svg',filename='TaxDonut', height= 500, width= 800, scale= 1)) -tp -``` - -
-
-
-
-
- -

  Phylogenetic Tree

- -
-
- -```{r tree, echo=FALSE} -#tree=read.newick("vAMPrun_otu.55.raxml.support") -tree=read.tree(params$tree) -p1 <- ggtree(tree) -id <- tree$tip.label -dat <- tibble::tibble(id = id) -metat <- p1$data %>% dplyr::inner_join(dat, c('label' = 'id')) -p2 <- p1 + geom_point(data = metat, aes(x = x, y = y, label = id)) -ggplotly(p2, tooltip = "label") -``` -This tree is a maximum likelihood tree made with IQTREE2 and the parameters you specified in the vampirus.config file. Also, this is an interactive tree, you can zoom in and hover on nodes to know the sequence ID. For a better visualization of this tree, you can find the *.treefile with bootstrap support values within the results directory and visualize using programs like FigTree or ITOL. -
-
-
-
-
-
-
-
-
diff --git a/vAMPirus.nf b/vAMPirus.nf index 7e339ee..2f6035e 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1916,8 +1916,8 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASV/${params.projtag}_asvMED_${params.asvC}", mode: "copy", overwrite: true - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASV/${params.projtag}_asvMED_${params.asvC}/OLIGO-REPRESENTATIVES", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASV/MED", mode: "copy", overwrite: true + input: file(asvs) from asv_for_med @@ -1925,9 +1925,10 @@ if (params.DataCheck || params.Analyze) { output: file("*_ASV_Grouping.csv") into asvgroupscsv file("${params.projtag}_ASV_group_reps_aligned.fasta") into groupreps + file("${params.projtag}_asvMED_${params.asvC}") script: - """ + """ #alignment mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_mafftAlign.fasta #trimming @@ -1941,7 +1942,7 @@ if (params.DataCheck || params.Analyze) { oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.asvC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html #generatemaps cd ./${params.projtag}_asvMED_${params.asvC}/OLIGO-REPRESENTATIVES/ - echo "ASV,Group,IDPattern" + echo "ASV,GroupID,IDPattern" j=1 for x in *_unique; do gid=$(echo \$x | awk -F "_" '{print \$1}') @@ -1965,7 +1966,7 @@ if (params.DataCheck || params.Analyze) { mv ${params.projtag}_ASV_Grouping.csv ../../ mv ${params.projtag}_ASV_group_reps_aligned.fasta ../../ cd .. - """ + """ } process ASV_MED_Reps_phylogeny { @@ -1983,32 +1984,32 @@ if (params.DataCheck || params.Analyze) { file("*iq.treefile") into asv_group_rep_tree script: - """ - # Protein_ModelTest - modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.protag}_ASV_Group_Reps_mt -d aa -s 203 --disable-checkpoint + """ + # Protein_ModelTest + modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.protag}_ASV_Group_Reps_mt -d aa -s 203 --disable-checkpoint - # Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq --redo -T auto ${params.iqCustomaa} + # Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq --redo -T auto ${params.iqCustomaa} - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.parametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ + else + iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ } process Adding_ASV_MED_Info { @@ -2021,14 +2022,20 @@ if (params.DataCheck || params.Analyze) { file(counts) from asvcount_med file(tree) from asvphy_med file(map) from asvgroupscsv - output: + output: + file("${params.projtag}_ASV_Grouping_counts.csv") into asvgroupcounts script: - """ - - - """ + """ + awk -F "," '{print \$1}' ${counts} | sed '1d' > asv.list + echo "GroupID" >> group.list + for x in $(cat asv.list); + do group=$(grep -w \$x ${map} | awk -F "," '{print \$2}') + echo "\$group" >> group.list + done + paste -d',' group.list ${counts} > ${params.projtag}_ASV_Grouping_counts.csv + """ } } @@ -2534,6 +2541,40 @@ if (params.DataCheck || params.Analyze) { """ } + process Adding_AminoType_MED_Info { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny", mode: "copy", overwrite: true + + input: + file(counts) from asvcount_med + file(tree) from asvphy_med + file(map) from asvgroupscsv + + output: + file("${params.projtag}_AminoType_Grouping_counts.csv") into asvgroupcounts + + script: + #map + ASV1,GroupA,TAGCGAT + + #count + #ASvs, Sample1,sample2 + asv1,1,2 + + + + """ + awk -F "," '{print \$1}' ${counts} | sed '1d' > amino.list + echo "GroupID" >> group.list + for x in $(cat amino.list); + do group=$(grep -w \$x ${map} | awk -F "," '{print \$2}') + echo "\$group" >> group.list + done + paste -d',' group.list ${counts} > ${params.projtag}_AminoType_Grouping_counts.csv + """ + } } if (params.pcASV) { // ASV_nucl -> ASV_aa -> clusteraa by %id with ch-hit -> extract representative nucl sequences to generate new OTU file From 152b3fd0d35b97c73106fbaae5285e349debf42f Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 17:50:26 -0500 Subject: [PATCH 062/223] fixed --- vAMPirus.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 2f6035e..d89887b 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1945,8 +1945,8 @@ if (params.DataCheck || params.Analyze) { echo "ASV,GroupID,IDPattern" j=1 for x in *_unique; - do gid=$(echo \$x | awk -F "_" '{print \$1}') - uni=$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') + do gid=\$(echo \$x | awk -F "_" '{print \$1}') + uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list seqtk subseq ${asvs} asv.list > Group"\${j}"_sequences.fasta for z in $( cat asv.list) From f738e93fe1fbac00c2cb0e6186f3708f9f4d2560 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 17:51:37 -0500 Subject: [PATCH 063/223] edits --- vAMPirus.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index d89887b..42bbeac 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1949,7 +1949,7 @@ if (params.DataCheck || params.Analyze) { uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list seqtk subseq ${asvs} asv.list > Group"\${j}"_sequences.fasta - for z in $( cat asv.list) + for z in \$( cat asv.list) do echo ""\$z",Group"\$gid","\$uni"" >> ${params.projtag}_ASV_Grouping.csv done @@ -2030,8 +2030,8 @@ if (params.DataCheck || params.Analyze) { """ awk -F "," '{print \$1}' ${counts} | sed '1d' > asv.list echo "GroupID" >> group.list - for x in $(cat asv.list); - do group=$(grep -w \$x ${map} | awk -F "," '{print \$2}') + for x in \$(cat asv.list); + do group=\$(grep -w \$x ${map} | awk -F "," '{print \$2}') echo "\$group" >> group.list done paste -d',' group.list ${counts} > ${params.projtag}_ASV_Grouping_counts.csv From ec6ea3c95a60a3cdb5c9407c23d0e772cc37c3df Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 17:55:12 -0500 Subject: [PATCH 064/223] pushing --- vAMPirus.nf | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 42bbeac..5a78ed1 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2357,7 +2357,7 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*_aln.fasta"), file("*_aln.html"), file("*.log"), file("*iq*"), file("*mt*") into alignprot_results - file("*iq.treefile") into amino_rax_plot + file("*iq.treefile") into (amino_rax_plot, amino_repphy) script: """ @@ -2407,7 +2407,7 @@ if (params.DataCheck || params.Analyze) { output: tuple file("*_AminoType_counts.csv"), file("*dmd.out") into counts_summary - file("*_AminoType_counts.csv") into aminocounts_plot + file("*_AminoType_counts.csv") into (aminocounts_plot, aminocountmed) script: """ @@ -2473,8 +2473,8 @@ if (params.DataCheck || params.Analyze) { echo "AminoType,Group,IDPattern" j=1 for x in *_unique; - do gid=$(echo \$x | awk -F "_" '{print \$1}') - uni=$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') + do gid=\$(echo \$x | awk -F "_" '{print \$1}') + uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list seqtk subseq ${aminos} asv.list > Group"\${j}"_sequences.fasta for z in $( cat asv.list) @@ -2548,28 +2548,19 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny", mode: "copy", overwrite: true input: - file(counts) from asvcount_med - file(tree) from asvphy_med - file(map) from asvgroupscsv + file(counts) from aminocountmed + file(tree) from amino_repphy + file(map) from atygroupscsv output: file("${params.projtag}_AminoType_Grouping_counts.csv") into asvgroupcounts script: - #map - ASV1,GroupA,TAGCGAT - - #count - #ASvs, Sample1,sample2 - asv1,1,2 - - - """ awk -F "," '{print \$1}' ${counts} | sed '1d' > amino.list echo "GroupID" >> group.list - for x in $(cat amino.list); - do group=$(grep -w \$x ${map} | awk -F "," '{print \$2}') + for x in \$(cat amino.list); + do group=\$(grep -w \$x ${map} | awk -F "," '{print \$2}') echo "\$group" >> group.list done paste -d',' group.list ${counts} > ${params.projtag}_AminoType_Grouping_counts.csv From dda3e248439e8ec625a00b8c1e10f71375e7b402 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 17:56:42 -0500 Subject: [PATCH 065/223] edit --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 5a78ed1..0579b4a 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2477,7 +2477,7 @@ if (params.DataCheck || params.Analyze) { uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list seqtk subseq ${aminos} asv.list > Group"\${j}"_sequences.fasta - for z in $( cat asv.list) + for z in \$( cat asv.list) do echo ""\$z",Group"\$gid","\$uni"" >> ${params.projtag}_AminoType_Grouping.csv done From 7147feb820a14efdd9aa05be132ad2d7f7d6159b Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 18:01:13 -0500 Subject: [PATCH 066/223] try --- vAMPirus.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 0579b4a..25f254f 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2016,7 +2016,7 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/", mode: "copy", overwrite: true input: file(counts) from asvcount_med @@ -2545,7 +2545,7 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/", mode: "copy", overwrite: true input: file(counts) from aminocountmed @@ -2553,7 +2553,7 @@ if (params.DataCheck || params.Analyze) { file(map) from atygroupscsv output: - file("${params.projtag}_AminoType_Grouping_counts.csv") into asvgroupcounts + file("${params.projtag}_AminoType_Grouping_counts.csv") into amino_groupcounts script: """ From c2c91cec716a2314dd3137592ec76dfaf1343d5f Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 18:03:17 -0500 Subject: [PATCH 067/223] yaya --- vAMPirus.nf | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 25f254f..04b7a09 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1980,7 +1980,7 @@ if (params.DataCheck || params.Analyze) { file(reps) from groupreps output: - tuple file("*_Aminotype_Group_Reps") into align_results_asvmed + file("*_Aminotype_Group_Reps") into align_results_asvmed file("*iq.treefile") into asv_group_rep_tree script: @@ -2509,36 +2509,36 @@ if (params.DataCheck || params.Analyze) { file(reps) from atygroupreps output: - tuple file("*_Aminotype_Group_Reps") into align_results_aminmed - file("*iq.treefile") into amino_group_rep_tree + file("*_Aminotype_Group_Reps") into align_results_aminmed + file("*iq.treefile") into amino_group_rep_tree script: - """ - # Protein_ModelTest - modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.protag}_AminoType_Group_Reps_mt -d aa -s 203 --disable-checkpoint + """ + # Protein_ModelTest + modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.protag}_AminoType_Group_Reps_mt -d aa -s 203 --disable-checkpoint - # Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq --redo -T auto ${params.iqCustomaa} + # Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq --redo -T auto ${params.iqCustomaa} - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.parametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ + else + iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ } process Adding_AminoType_MED_Info { From 041d4777f1b31055eb35c4f0daeec79cf6982df4 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 18:06:11 -0500 Subject: [PATCH 068/223] yayay --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 04b7a09..e4d96b6 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2460,7 +2460,7 @@ if (params.DataCheck || params.Analyze) { #alignment mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta #trimming - trimal -in ${params.projtag}_AmminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 + trimal -in ${params.projtag}_AminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 rm ${params.projtag}_AminoTypes_mafftAlign.fasta o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_mafftAligned.fasta mv ${params.projtag}_AminoTypes_mafftAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta From fbd47899a7221a45852feda7d68419cebf45e089 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 18:12:18 -0500 Subject: [PATCH 069/223] fixed seqtk --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index e4d96b6..244ed75 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2476,7 +2476,7 @@ if (params.DataCheck || params.Analyze) { do gid=\$(echo \$x | awk -F "_" '{print \$1}') uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list - seqtk subseq ${aminos} asv.list > Group"\${j}"_sequences.fasta + seqtk subseq ../../${aminos} asv.list > Group"\${j}"_sequences.fasta for z in \$( cat asv.list) do echo ""\$z",Group"\$gid","\$uni"" >> ${params.projtag}_AminoType_Grouping.csv From c735ed1fb33dc6fb15493acab955239f86352d39 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 18:16:24 -0500 Subject: [PATCH 070/223] aminoadded --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 244ed75..3867f72 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2482,7 +2482,7 @@ if (params.DataCheck || params.Analyze) { done rm asv.list - echo "Group\${j}" >> ${params.projtag}_group_reps_aligned.fasta + echo "Group\${j}" >> ${params.projtag}_AminoType_group_reps_aligned.fasta echo "\$uni" > group.list seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta tail -1 group.fasta >> ${params.projtag}_group_reps_aligned.fasta From dcccd0c77660201d38b4ddc66cbc9887fdaa1e68 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 18:22:59 -0500 Subject: [PATCH 071/223] fix --- vAMPirus.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 3867f72..fd550d8 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2482,10 +2482,10 @@ if (params.DataCheck || params.Analyze) { done rm asv.list - echo "Group\${j}" >> ${params.projtag}_AminoType_group_reps_aligned.fasta + echo ">Group\${j}" >> ${params.projtag}_AminoType_group_reps_aligned.fasta echo "\$uni" > group.list seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta - tail -1 group.fasta >> ${params.projtag}_group_reps_aligned.fasta + tail -1 group.fasta >> ${params.projtag}_AminoType_group_reps_aligned.fasta mv "\$gid"_"\$uni" ./Group"\$j"_"\$uni"_aligned.fasta mv "\$gid"_"\$uni"_unique ./Group"\$j"_"\$uni"_unqiues_aligned.fasta rm "\$gid"*.cPickle From bf891d0ef48948aff5f63a72ed69a568b4b3e909 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 18:26:02 -0500 Subject: [PATCH 072/223] fixed asv med --- vAMPirus.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index fd550d8..a03986b 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1948,16 +1948,16 @@ if (params.DataCheck || params.Analyze) { do gid=\$(echo \$x | awk -F "_" '{print \$1}') uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list - seqtk subseq ${asvs} asv.list > Group"\${j}"_sequences.fasta + seqtk subseq ../../${asvs} asv.list > Group"\${j}"_sequences.fasta for z in \$( cat asv.list) do echo ""\$z",Group"\$gid","\$uni"" >> ${params.projtag}_ASV_Grouping.csv done rm asv.list - echo "Group\${j}" >> ${params.projtag}_group_reps_aligned.fasta + echo "Group\${j}" >> ${params.projtag}_ASV_group_reps_aligned.fasta echo "\$uni" > group.list seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta - tail -1 group.fasta >> ${params.projtag}_group_reps_aligned.fasta + tail -1 group.fasta >> ${params.projtag}_ASV_group_reps_aligned.fasta mv "\$gid"_"\$uni" ./Group"\$j"_"\$uni"_aligned.fasta mv "\$gid"_"\$uni"_unique ./Group"\$j"_"\$uni"_unqiues_aligned.fasta rm "\$gid"*.cPickle From 48e3e67c6639bba0d98635438f494880787bdda4 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 18:30:43 -0500 Subject: [PATCH 073/223] fix --- vAMPirus.nf | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index a03986b..e4d244c 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1980,34 +1980,34 @@ if (params.DataCheck || params.Analyze) { file(reps) from groupreps output: - file("*_Aminotype_Group_Reps") into align_results_asvmed + file("*_Aminotype_Group_Reps*") into align_results_asvmed file("*iq.treefile") into asv_group_rep_tree script: """ # Protein_ModelTest - modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.protag}_ASV_Group_Reps_mt -d aa -s 203 --disable-checkpoint + modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.projtag}_ASV_Group_Reps_mt -d aa -s 203 --disable-checkpoint # Protein_Phylogeny if [ "${params.iqCustomaa}" != "" ];then - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq --redo -T auto ${params.iqCustomaa} + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq --redo -T auto ${params.iqCustomaa} elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni elif [ "${params.nonparametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} elif [ "${params.parametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni else - iqtree -s ${reps} --prefix ${params.protag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni fi """ } @@ -2509,34 +2509,34 @@ if (params.DataCheck || params.Analyze) { file(reps) from atygroupreps output: - file("*_Aminotype_Group_Reps") into align_results_aminmed + file("*_Aminotype_Group_Reps*") into align_results_aminmed file("*iq.treefile") into amino_group_rep_tree script: """ # Protein_ModelTest - modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.protag}_AminoType_Group_Reps_mt -d aa -s 203 --disable-checkpoint + modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.projtag}_AminoType_Group_Reps_mt -d aa -s 203 --disable-checkpoint # Protein_Phylogeny if [ "${params.iqCustomaa}" != "" ];then - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq --redo -T auto ${params.iqCustomaa} + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq --redo -T auto ${params.iqCustomaa} elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni elif [ "${params.nonparametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} elif [ "${params.parametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni else - iqtree -s ${reps} --prefix ${params.protag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni fi """ } From 94aa5cebd5db16562629d4af16c138001377a01d Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 18:32:11 -0500 Subject: [PATCH 074/223] fit --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index e4d244c..4a13427 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1954,7 +1954,7 @@ if (params.DataCheck || params.Analyze) { done rm asv.list - echo "Group\${j}" >> ${params.projtag}_ASV_group_reps_aligned.fasta + echo ">Group\${j}" >> ${params.projtag}_ASV_group_reps_aligned.fasta echo "\$uni" > group.list seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta tail -1 group.fasta >> ${params.projtag}_ASV_group_reps_aligned.fasta From 01982f93d3faf5458dd3f53a62a3e1f51c4333ac Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 18:35:55 -0500 Subject: [PATCH 075/223] push --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 4a13427..03e5935 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2509,7 +2509,7 @@ if (params.DataCheck || params.Analyze) { file(reps) from atygroupreps output: - file("*_Aminotype_Group_Reps*") into align_results_aminmed + file("*_AminoType_Group_Reps*") into align_results_aminmed file("*iq.treefile") into amino_group_rep_tree script: From 21c667827f9fb7d3a36823b8970cc786471efa6d Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 26 Mar 2021 18:38:07 -0500 Subject: [PATCH 076/223] fixed out --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 03e5935..8429faa 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1980,7 +1980,7 @@ if (params.DataCheck || params.Analyze) { file(reps) from groupreps output: - file("*_Aminotype_Group_Reps*") into align_results_asvmed + file("*_ASV_Group_Reps*") into align_results_asvmed file("*iq.treefile") into asv_group_rep_tree script: From 237f1cda83eaa4fc550b3c8ae4e36db1cbb5598c Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Sun, 28 Mar 2021 19:02:48 -0500 Subject: [PATCH 077/223] revamped taxonomy processes and added classification --- vAMPirus.nf | 1431 ++++++++++++++++++++++++++----------------- vampirus_startup.sh | 16 +- 2 files changed, 870 insertions(+), 577 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 8429faa..d0956ea 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1295,7 +1295,9 @@ if (params.DataCheck || params.Analyze) { if (!params.skipTaxonomy) { - process Nucleotide_Taxonomy_Inference { /////// editttt + if (params.headers == "RefSeq") { + + process ncASV_Taxonomy_Inference { /////// editttt label 'high_cpus' @@ -1309,7 +1311,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.fasta") into tax_labeled_fasta_ncasv - tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_ncasv + tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_ncasv tuple nid, file("*ncASV*summary_for_plot.csv") into taxplot_ncasv script: @@ -1328,18 +1330,14 @@ if (params.DataCheck || params.Analyze) { echo "[Percent ID (aa)]" > pid.list echo "[Organism ID]" > "\$name"_virus.list echo "[Gene]" > "\$name"_genes.list + echo "[ncASV#]" > otu.list + echo "[Sequence length]" > length.list grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst echo "extracting genes and names" touch new_"\$name"_asvnames.txt - j=1 - if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then - for s in \$(cat seqids.lst);do - echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then echo "Yep, there was a hit for \$s" echo "Extracting the information now:" acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') @@ -1355,48 +1353,9 @@ if (params.DataCheck || params.Analyze) { echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) + echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else + else echo "Ugh, there was no hit for \$s .." echo "We still love \$s though and we will add it to the final fasta file" echo "\$s" >> otu.list @@ -1409,14 +1368,10 @@ if (params.DataCheck || params.Analyze) { echo "NO_HIT" >> length.list virus="NO" gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - fi - fi - echo "Done with \$s" - done - fi + fi + done echo "Now editing "\$name" fasta headers" ###### rename_seq.py ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta @@ -1427,9 +1382,9 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do + for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; @@ -1437,17 +1392,134 @@ if (params.DataCheck || params.Analyze) { cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; rm tmpcol.list tmp2col.list done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: ${asvs}" - rm headers.list + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list """ - } + } + } else if (params.headers == "RVDB") { + + process ncASV_Taxonomy_Inference { /////// editttt + + label 'high_cpus' + + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy", mode: "copy", overwrite: true, pattern: '*ncASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*ncASV*dmd.out' + + input: + tuple nid, file(asvs) from nuclFastas_forDiamond_ncasv_ch + + output: + file("*.fasta") into tax_labeled_fasta_ncasv + tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_ncasv + tuple nid, file("*ncASV*summary_for_plot.csv") into taxplot_ncasv + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_ncasv + + script: + mtag="ID=" + nid + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[ncASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lsa} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Classification]" > classfication.list + else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + fi + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ ${params.lca} == "T" ]] + then group=$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + lcla=$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> classfication.list + fi + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ ${params.lca} == "T" ]] + then echo "N/A" >> classfication.list + fi + echo "\$s done." + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + if [[ ${params.lca} == "T" ]] + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + fi + if [[ ${params.lca} == "T" ]] + then paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + fi + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ + } } + } + process Generate_ncASV_Counts_Table { @@ -1535,17 +1607,17 @@ if (params.DataCheck || params.Analyze) { if [ "${params.iqCustomnt}" != "" ];then iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni fi """ } @@ -1557,240 +1629,225 @@ if (params.DataCheck || params.Analyze) { .into{ nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch; asv_for_med } } - process ASV_Taxonomy_Inference { /////// editttt + if (!params.skipTaxonomy) { - label 'high_cpus' + if (params.headers == "RefSeq") { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' + process ASV_Taxonomy_Inference { /////// editttt - input: - file(reads) from nuclFastas_forDiamond_asv_ch + label 'high_cpus' - output: - file("*.fasta") into tax_labeled_fasta_asv - tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv - file("*_ASV*_summary_for_plot.csv") into taxplot_asv + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' - script: - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - for filename in ${reads};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - j=1 - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + input: + file(asvs) from nuclFastas_forDiamond_asv_ch + + output: + file("*.fasta") into tax_labeled_fasta_asv + tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv + file("*_ASV*_summary_for_plot.csv") into taxplot_asv + + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - else + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt for s in \$(cat seqids.lst);do - echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo "\$s done." else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo "\$s done." + fi done - fi - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " - done - rm headers.list - """ + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ + } + } else if (params.headers == "RVDB") { + + process ASV_Taxonomy_Inference { /////// editttt + + label 'high_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' + + input: + file(asvs) from nuclFastas_forDiamond_asv_ch + + output: + file("*.fasta") into tax_labeled_fasta_asv + tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv + file("*_ASV*_summary_for_plot.csv") into taxplot_asv + file("*_quick_Taxbreakdown.csv") into tax_table_asv + + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[ASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lsa} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Classification]" > classfication.list + else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + fi + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ ${params.lca} == "T" ]] + then group=$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + lcla=$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> classfication.list + fi + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ ${params.lca} == "T" ]] + then echo "N/A" >> classfication.list + fi + echo "\$s done." + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + if [[ ${params.lca} == "T" ]] + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + fi + if [[ ${params.lca} == "T" ]] + then paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + fi + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ + } + } } process Generate_ASV_Counts_Tables { @@ -1888,23 +1945,25 @@ if (params.DataCheck || params.Analyze) { pre=\$(echo ${asvs} | awk -F ".fasta" '{print \$1}' ) mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta + mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint # Nucleotide_Phylogeny if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni fi """ } @@ -1916,7 +1975,7 @@ if (params.DataCheck || params.Analyze) { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASV/MED", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASVs/MED", mode: "copy", overwrite: true input: @@ -2194,6 +2253,8 @@ if (params.DataCheck || params.Analyze) { if (!params.skipTaxonomy) { + if (params.headers == "RefSeq") { + process AminoType_Taxonomy_Inference { label 'high_cpus' @@ -2202,7 +2263,7 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*TaxonomyLabels.fasta' input: - file(reads) from aminotypesBlast + file(asvs) from aminotypesBlast output: tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond @@ -2213,117 +2274,72 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} >> headers.list + grep ">" \${virdb} > headers.list headers="headers.list" - name=\$(ls ${reads} | awk -F "_noTaxonomy" '{print \$1}') - diamond blastp -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" >access.list - echo "[AminoType sequence length]" >length.list - echo "[e-value]" >evalue.list - echo "[Bitscore]" >bit.list - echo "[Percent ID (aa)]" >pid.list - echo "[AminoType#]" >otu.list - echo "[Virus ID]" >"\$name"_virus.list - echo "[Gene]" >"\$name"_genes.list - grep ">" ${reads} | awk -F ">" '{print \$2}' > seqids.lst + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[AminoType#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst echo "extracting genes and names" touch new_"\$name"_asvnames.txt - j=1 for s in \$(cat seqids.lst);do echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then echo "Yep, there was a hit for \$s" echo "Extracting the information now:" acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') echo "\$s" >> otu.list echo "\$acc" >> access.list line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">AminoType\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) + echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - else + else echo "Ugh, there was no hit for \$s .." echo "We still love \$s though and we will add it to the final fasta file" echo "\$s" >> otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">AminoType\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$\$1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >>otu.list - echo "\$acc" >>access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') - echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list - echo ">AminoType\${j}_"\$virus"_"\$gene"" >>new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >>otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list virus="NO" gene="HIT" - echo ">AminoType\${j}_"\$virus"_"\$gene"" >>new_"\$name"_asvnames.txt - j=\$((\$j+1)) + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - fi - fi - echo "Done with \$s" + fi done echo "Now editing "\$name" fasta headers" ###### rename_seq.py - ./rename_seq.py ${reads} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta echo "[Sequence header]" > newnames.list cat new_"\$name"_asvnames.txt >> newnames.list touch sequence.list echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do + for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; @@ -2331,16 +2347,130 @@ if (params.DataCheck || params.Analyze) { cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; rm tmpcol.list tmp2col.list done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst headers.list otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: ${reads} " + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list """ + } + } else if (params.headers == "RVDB") { + + process AminoType_Taxonomy_Inference { + + label 'high_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*TaxonomyLabels.fasta' + + input: + file(asvs) from aminotypesBlast + + output: + tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond + file("*_summary_for_plot.csv") into taxplot2 + file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 + file("*_quick_Taxbreakdown.csv") into tax_table_amino + + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[AminoType#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lsa} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Classification]" > classfication.list + else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + fi + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ ${params.lca} == "T" ]] + then group=$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + lcla=$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> classfication.list + fi + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ ${params.lca} == "T" ]] + then echo "N/A" >> classfication.list + fi + echo "\$s done." + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + if [[ ${params.lca} == "T" ]] + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + fi + if [[ ${params.lca} == "T" ]] + then paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + fi + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ } } + } if (!params.skipPhylogeny) { @@ -2691,6 +2821,8 @@ if (params.DataCheck || params.Analyze) { if (!params.skipTaxonomy) { + if (params.headers == "RefSeq") { + process pcASV_Nucleotide_Taxonomy_Inference { label 'high_cpus' @@ -2702,7 +2834,7 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' input: - tuple nid, file(reads) from pcASV_ntDiamond_ch + tuple nid, file(asvs) from pcASV_ntDiamond_ch output: file("*.fasta") into ( pcASV_labeled ) @@ -2715,134 +2847,209 @@ if (params.DataCheck || params.Analyze) { set +e cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} >> headers.list + grep ">" \${virdb} > headers.list headers="headers.list" - name=\$(ls ${reads} | awk -F "_noTax" '{print \$1}') - diamond blastx -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" >access.list - echo "[pcASV sequence length]" >length.list - echo "[e-value]" >evalue.list - echo "[Bitscore]" >bit.list - echo "[Percent ID (aa)]" >pid.list - echo "[pcASV#]" >otu.list - echo "[Virus ID]" >"\$name"_virus.list - echo "[Gene]" >"\$name"_genes.list - grep ">" ${reads} | awk -F ">" '{print \$2}' > seqids.lst + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[pcASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst echo "extracting genes and names" - touch new_"\$name"_headers.txt - j=1 + touch new_"\$name"_asvnames.txt for s in \$(cat seqids.lst);do echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then echo "Yep, there was a hit for \$s" echo "Extracting the information now:" acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') echo "\$s" >> otu.list echo "\$acc" >> access.list line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list echo "Extracting virus and gene ID for \$s now" gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) + echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - else + else echo "Ugh, there was no hit for \$s .." echo "We still love \$s though and we will add it to the final fasta file" echo "\$s" >> otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >>otu.list - echo "\$acc" >>access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list - echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >>otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list virus="NO" gene="HIT" - echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - fi - fi - echo "Done with \$s" + fi done echo "Now editing "\$name" fasta headers" ###### rename_seq.py - ./rename_seq.py ${reads} new_"\$name"_headers.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta echo "[Sequence header]" > newnames.list - cat new_"\$name"_headers.txt >> newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list touch sequence.list echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do + for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_noTaxonomy_summary_for_plot.csv; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; rm tmpcol.list tmp2col.list done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: ${reads} " - rm *headers.list + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list """ + } + } else if (params.headers == "RVDB") { + + process pcASV_Nucleotide_Taxonomy_Inference { + + label 'high_cpus' + + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' + + input: + tuple nid, file(asvs) from pcASV_ntDiamond_ch + + output: + file("*.fasta") into ( pcASV_labeled ) + tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond + tuple nid, file("*_summary_for_plot.csv") into taxplot3 + file("*_quick_Taxbreakdown.csv") into tax_table_pcasvnt + + script: + mtag="ID=" + nid + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[pcASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lsa} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Classification]" > classfication.list + else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + fi + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ ${params.lca} == "T" ]] + then group=$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + lcla=$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> classfication.list + fi + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ ${params.lca} == "T" ]] + then echo "N/A" >> classfication.list + fi + echo "\$s done." + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + if [[ ${params.lca} == "T" ]] + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + fi + if [[ ${params.lca} == "T" ]] + then paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + fi + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ } } + } + process Generate_Nucleotide_pcASV_Counts { @@ -3032,6 +3239,8 @@ if (params.DataCheck || params.Analyze) { if (!params.skipTaxonomy) { + if (params.headers == "RefSeq") { + process pcASV_AminoAcid_Taxonomy_Inference { label 'high_cpus' @@ -3043,7 +3252,7 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' input: - tuple nid, file(reads) from pcASV_aaDiamond_ch + tuple nid, file(asvs) from pcASV_aaDiamond_ch output: file("*.fasta") into ( pcASV_labeledAA ) @@ -3055,116 +3264,72 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} >> headers.list + grep ">" \${virdb} > headers.list headers="headers.list" - name=\$(ls ${reads} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" >access.list - echo "[pcASV sequence length]" >length.list - echo "[e-value]" >evalue.list - echo "[Bitscore]" >bit.list - echo "[Percent ID (aa)]" >pid.list - echo "[pcASVaa#]" >otu.list - echo "[Virus ID]" >"\$name"_virus.list - echo "[Gene]" >"\$name"_genes.list - grep ">" ${reads} | awk -F ">" '{print \$2}' > seqids.lst + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[pcASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst echo "extracting genes and names" - touch new_"\$name"_headers.txt - j=1 + touch new_"\$name"_asvnames.txt for s in \$(cat seqids.lst);do echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then echo "Yep, there was a hit for \$s" echo "Extracting the information now:" acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') echo "\$s" >> otu.list echo "\$acc" >> access.list line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list echo "Extracting virus and gene ID for \$s now" gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) + echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - else + else echo "Ugh, there was no hit for \$s .." echo "We still love \$s though and we will add it to the final fasta file" echo "\$s" >> otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >>otu.list - echo "\$acc" >>access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >>otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list virus="NO" gene="HIT" - echo ">pcASVaa\${j}_\${virus}_\${gene}" >>new_"\$name"_headers.txt - j=\$((\$j+1)) + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - fi - fi - echo "Done with \$s" + fi done echo "Now editing "\$name" fasta headers" ###### rename_seq.py - ./rename_seq.py ${reads} new_"\$name"_headers.txt "\$name"_wTax.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_wTax.fasta > "\$name"_tmpssasv.fasta + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta echo "[Sequence header]" > newnames.list - cat new_"\$name"_headers.txt >> newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list touch sequence.list - awk 'BEGIN{RS=">";ORS=""}{print \$2"\\n"}' \${name}_tmpssasv.fasta >>sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_summary_phyloseqObject.csv - paste -d"\\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; @@ -3172,16 +3337,134 @@ if (params.DataCheck || params.Analyze) { cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; rm tmpcol.list tmp2col.list done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: ${reads} " - rm *headers.list + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list """ } + } else if (params.headers == "RVDB") { + + process pcASV_AminoAcid_Taxonomy_Inference { + + label 'high_cpus' + + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' + + input: + tuple nid, file(asvs) from pcASV_aaDiamond_ch + + output: + file("*.fasta") into ( pcASV_labeledAA ) + tuple file("*phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond + tuple nid, file("*_summary_for_plot.csv") into taxplot4 + file("*_quick_Taxbreakdown.csv") into tax_table_pcasvaa + + script: + mtag="ID=" + nid + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[pcASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lsa} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Classification]" > classfication.list + else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + fi + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ ${params.lca} == "T" ]] + then group=$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + lcla=$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> classfication.list + fi + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ ${params.lca} == "T" ]] + then echo "N/A" >> classfication.list + fi + echo "\$s done." + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + if [[ ${params.lca} == "T" ]] + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + fi + if [[ ${params.lca} == "T" ]] + then paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + fi + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ } + } + } if (!params.skipPhylogeny) { diff --git a/vampirus_startup.sh b/vampirus_startup.sh index 5df8e89..02edcf1 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -197,10 +197,12 @@ then mkdir "$mypwd"/Databases curl -o U-RVDBv21.0-prot.fasta.bz2 https://rvdb-prot.pasteur.fr/files/U-RVDBv21.0-prot.fasta.bz2 bunzip2 U-RVDBv21.0-prot.fasta.bz2 curl -o U-RVDBv21.0-prot-hmm-txt.zip https://rvdb-prot.pasteur.fr/files/U-RVDBv21.0-prot-hmm-txt.zip + unzip U-RVDBv21.0-prot-hmm-txt.zip + mv annot ./RVDBannot echo "Editing confiration file for you now..." - sed 's/DATABASENAME/U-RVDBv19.0-prot.fasta/g' "$mypwd"/vampirus.config > tmp1.config + sed 's/DATABASENAME/U-RVDBv21.0-prot.fasta/g' "$mypwd"/vampirus.config > tmp1.config sed "s|DATABASEDIR|${dir}|g" tmp1.config > tmp2.config - sed "s|DATABASEANNOT|${dir}/U-RVDBv21.0-prot-hmm-txt.zip|g" tmp2.config > tmp3.config + sed "s|DATABASEANNOT|${dir}/RVDBannot|g" tmp2.config > tmp3.config rm tmp1.config rm tmp2.config cat tmp3.config > "$mypwd"/vampirus.config @@ -212,9 +214,17 @@ then mkdir "$mypwd"/Databases dir="$(pwd)" echo "Database installation: Viral RefSeq database version 2.0 (latest as of 2020-07)" curl -o viral.2.protein.faa.gz https://ftp.ncbi.nlm.nih.gov/refseq/release/viral/viral.2.protein.faa.gz + curl -o viral.1.protein.faa.gz https://ftp.ncbi.nlm.nih.gov/refseq/release/viral/viral.1.protein.faa.gz + curl -o viral.3.protein.faa.gz https://ftp.ncbi.nlm.nih.gov/refseq/release/viral/viral.3.protein.faa.gz + gunzip viral.1.protein.faa.gz + cat viral.1.protein.faa >> complete_virus_refseq_prot.fasta gunzip viral.2.protein.faa.gz + cat viral.2.protein.faa >> complete_virus_refseq_prot.fasta + gunzip viral.3.protein.faa.gz + cat viral.3.protein.faa >> complete_virus_refseq_prot.fasta + rm viral.*.protein.faa echo "Editing confiration file for you now..." - sed 's/DATABASENAME/viral.2.protein.faa/g' "$mypwd"/vampirus.config > tmp1.config + sed 's/DATABASENAME/complete_virus_refseq_prot.fasta/g' "$mypwd"/vampirus.config > tmp1.config sed "s|DATABASEDIR|${dir}|g" tmp1.config > tmp2.config rm tmp1.config cat tmp2.config > "$mypwd"/vampirus.config From 167a530eaab6a10ad6c2b938a1a96a42b1f9099c Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Sun, 28 Mar 2021 19:12:52 -0500 Subject: [PATCH 078/223] updated with annotation info download --- vampirus_startup.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vampirus_startup.sh b/vampirus_startup.sh index 02edcf1..447a90c 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -202,7 +202,7 @@ then mkdir "$mypwd"/Databases echo "Editing confiration file for you now..." sed 's/DATABASENAME/U-RVDBv21.0-prot.fasta/g' "$mypwd"/vampirus.config > tmp1.config sed "s|DATABASEDIR|${dir}|g" tmp1.config > tmp2.config - sed "s|DATABASEANNOT|${dir}/RVDBannot|g" tmp2.config > tmp3.config + sed "s|DATABASEANNOT|${dir}/RVDBannot|g" tmp2.config | sed "s|LCAT|T|g" > tmp3.config rm tmp1.config rm tmp2.config cat tmp3.config > "$mypwd"/vampirus.config @@ -251,6 +251,8 @@ then mkdir "$mypwd"/Databases echo "Database installation: We want 'em all! Might take a little while....'" curl -o NCBI_nr_proteindb.faa.gz https://ftp.ncbi.nlm.nih.gov/blast/db/FASTA/nr.gz curl -o viral.2.protein.faa.gz https://ftp.ncbi.nlm.nih.gov/refseq/release/viral/viral.2.protein.faa.gz + curl -o viral.1.protein.faa.gz https://ftp.ncbi.nlm.nih.gov/refseq/release/viral/viral.1.protein.faa.gz + curl -o viral.3.protein.faa.gz https://ftp.ncbi.nlm.nih.gov/refseq/release/viral/viral.3.protein.faa.gz curl -o U-RVDBv19.0-prot.fasta.bz2 https://rvdb-prot.pasteur.fr/files/U-RVDBv19.0-prot.fasta.bz2 sed "s|DATABASEDIR|${dir}|g" "$mypwd"/vampirus.config > tmp1.config cat tmp1.config > "$mypwd"/vampirus.config From 120cbdb5a27dac1fbe305b64de11a3dc1ad2d2d5 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Sun, 28 Mar 2021 19:22:12 -0500 Subject: [PATCH 079/223] added the removal of uniformative gaps in phylogeny processes --- vAMPirus.nf | 63 ++++++++++++++++++++++++++----------------------- vampirus.config | 8 ++++--- 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index d0956ea..60a0d01 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2495,30 +2495,31 @@ if (params.DataCheck || params.Analyze) { pre=\$(echo ${prot} | awk -F "_noTax" '{print \$1}' ) mafft --thread ${task.cpus} --maxiterate 15000 --auto ${prot} >\${pre}_ALN.fasta trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - + o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta + mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta # Protein_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint + modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint # Protein_Phylogeny if [ "${params.iqCustomaa}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + iqtree -s \${pre}_Aligned_informativeonly.fasta.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s\${pre}_Aligned_informativeonly.fasta.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_Aligned_informativeonly.fasta.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni fi """ } @@ -3130,30 +3131,31 @@ if (params.DataCheck || params.Analyze) { pre=\$( echo ${reads} | awk -F "_noTax" '{print \$1}' ) mafft --maxiterate 5000 --auto ${reads} >\${pre}_ALN.fasta trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - + o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta + mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta # pcASV_Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_noTaxonomy_mt -d nt -s 203 --disable-checkpoint + modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_noTaxonomy_mt -d nt -s 203 --disable-checkpoint # pcASV_Nucleotide_Phylogeny if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq --redo -T auto ${params.iqCustomnt} + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq --redo -T auto ${params.iqCustomnt} elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo-nt auto -b ${params.boots} + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo-nt auto -b ${params.boots} elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -b ${params.boots} + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -b ${params.boots} elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni fi """ } @@ -3491,30 +3493,31 @@ if (params.DataCheck || params.Analyze) { pre=\$( echo ${prot} | awk -F ".fasta" '{print \$1}' ) mafft --maxiterate 5000 --auto ${prot} >\${pre}_ALN.fasta trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - + o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta + mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta # pcASV_Protein_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint + modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint # pcASV_Protein_Phylogeny if [ "${params.iqCustomaa}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni fi """ } diff --git a/vampirus.config b/vampirus.config index aef6beb..3fdc778 100644 --- a/vampirus.config +++ b/vampirus.config @@ -93,10 +93,12 @@ params { dbname="DATABASENAME" // Path to Directory where database is being stored dbdir="DATABASEDIR" - // Path to hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. + // Set taxonomy database header format -> headers= "RefSeq" to toggle use of RefSeq header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers + headers="HEAD" + // Path to directory hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. dbanno="DATABASEANNOT" - // Toggle use of RefSeq header format; default is Reverence Viral DataBase (RVDB) - refseq="F" + // Set lca="T" if you would like to add taxonomic classification to taxonomy results - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" + lca="LCAT" // Set minimum bitscore for best hit in taxonomy assignment bitscore="50" // Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment From 4699ae8b02aee5017a573e186de3012800267134 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Sun, 28 Mar 2021 19:45:59 -0500 Subject: [PATCH 080/223] updated options in help --- vAMPirus.nf | 225 ++++++++++++++++++++++++++------------------ vampirus.config | 4 +- vampirus_startup.sh | 14 +-- 3 files changed, 145 insertions(+), 98 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 60a0d01..cde16b1 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -57,6 +57,12 @@ def helpMessage() { --pcASV Set this option to have vAMPirus cluster nucleotide and translated ASVs into protein-based operational taxonomic units (pcASVs) - See options below to define a single percent similarity or a list + --Minimum Entropy Decomposition arguments-- + + --asvMED Set this option to perform Minimum Entropy Decomposition on ASV sequences, see manual for more information. You will need to set a value for --asvC to perform this analysis + + --amino_med Set this option to perform Minimum Entropy Decomposition on AminoType sequences, see manual for more information. You will need to set a value for --aminoC to perform this analysis + --Skip options-- --skipReadProcessing Set this option to skip all read processing steps in the pipeline @@ -65,7 +71,9 @@ def helpMessage() { --skipAdapterRemoval Set this option to skip adapter removal in the pipeline - --skipPrimerRemoval Set this option to skup Skip primer removal process + --skipPrimerRemoval Set this option to skip primer removal process + + --skipMerging Set this option to skip read merging --skipAminoTyping Set this option to skip AminoTyping processes @@ -73,6 +81,10 @@ def helpMessage() { --skipPhylogeny Set this option to skip phylogeny processes + --skipEMBOSS Set this option to skip EMBOSS processes + + --skipReport Set this option to skip html report generation + **NOTE** Most opitons below can be set using the configuration file (vampirus.config) to avoid a lengthy launch command. --Project/analysis information-- @@ -140,6 +152,11 @@ def helpMessage() { --minAA With --pcASV set, use this option to set the expected or minimum amino acid sequence length of open reading frames within your amplicon sequences + --Minimum Entropy Decomposition-- + + --asvC Number of high entropy positions to use for ASV MED analysis and generate "Groups" + + --aminoC Number of high entropy positions to use for AminoType MED analysis and generate "Groups" --Counts table generation-- @@ -158,7 +175,11 @@ def helpMessage() { --dbdir Path to Directory where database is being stored - --refseq Set "--refseq T" to toggle use of RefSeq header format; default is "F" to use Reverence Viral DataBase (RVDB) header + --headers Set taxonomy database header format -> headers= "RefSeq" to toggle use of RefSeq header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers + + --dbanno Path to directory hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. + + --lca Set --lca T if you would like to add taxonomic classification to taxonomy results - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" --bitscore Set minimum bitscore to allow for best hit in taxonomy assignment @@ -205,186 +226,208 @@ def fullHelpMessage() { THIS IS A LONGER HELP WITH USAGE EXAMPLES vAMPirus v${workflow.manifest.version} ============================================================================================================================================================================================== - Steps: - 1- Before launching the vAMPirus.nf, be sure to run the vampirus_startup.sh script to install dependencies and/or databases + Steps: + 1- Before launching the vAMPirus.nf, be sure to run the vampirus_startup.sh script to install dependencies and/or databases + + 2- Test the vAMPirus installation with the provided test dataset (if you have ran the start up script, you can see STARTUP_HELP.txt for test commands and other examples) + + 3. Edit parameters in vampirus.config file - 2- Test the vAMPirus installation with the provided test dataset (if you have ran the start up script, you can see STARTUP_HELP.txt for test commands and other examples) + 4. Launch the DataCheck pipeline to get summary information about your dataset - 3. Edit parameters in vampirus.config file + 5. Change any parameters in vampirus.config file that might aid your analysis (e.g. clustering ID, maximum merged read length) - 4. Launch the DataCheck pipeline to get summary information about your dataset + 6. Launch the Analyze pipeline to perform a comprehensive analysis with your dataset - 5. Change any parameters in vampirus.config file that might aid your analysis (e.g. clustering ID, maximum merged read length) + 7. Explore results directories and produced final reports - 6. Launch the Analyze pipeline to perform a comprehensive analysis with your dataset - 7. Explore results directories and produced final reports + Usage: + nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] - Usage: - nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] + --Help options-- + --help Print help information - --Help options-- + --fullHelp Print even more help information - --help Print help information - --fullHelp Print even more help information + --Mandatory arguments (choose one)-- + --Analyze Run absolutely everything - --Mandatory arguments (choose one)-- + --DataCheck Assess how data performs with during processing and clustering - --Analyze Run absolutely everything - --DataCheck Assess how data performs with during processing and clustering + --ASV clustering arguments-- + --ncASV Set this option to have vAMPirus cluster nucleotide amplicon sequence variants (ASVs) into nucleotide-based operational taxonomic units (ncASVs) - See options below to define a single percent similarity or a list - --ASV clustering arguments-- + --pcASV Set this option to have vAMPirus cluster nucleotide and translated ASVs into protein-based operational taxonomic units (pcASVs) - See options below to define a single percent similarity or a list - --ncASV Set this option to have vAMPirus cluster nucleotide amplicon sequence variants (ASVs) into nucleotide-based operational taxonomic units (ncASVs) - See options below to define a single percent similarity or a list - --pcASV Set this option to have vAMPirus cluster nucleotide and translated ASVs into protein-based operational taxonomic units (pcASVs) - See options below to define a single percent similarity or a list + --Minimum Entropy Decomposition arguments-- + --asvMED Set this option to perform Minimum Entropy Decomposition on ASV sequences, see manual for more information. You will need to set a value for --asvC to perform this analysis - --Skip options-- + --amino_med Set this option to perform Minimum Entropy Decomposition on AminoType sequences, see manual for more information. You will need to set a value for --aminoC to perform this analysis - --skipReadProcessing Set this option to skip all read processing steps in the pipeline + --Skip options-- - --skipFastQC Set this option to skiip FastQC steps in the pipeline + --skipReadProcessing Set this option to skip all read processing steps in the pipeline - --skipAdapterRemoval Set this option to skip adapter removal in the pipeline + --skipFastQC Set this option to skiip FastQC steps in the pipeline - --skipPrimerRemoval Set this option to skup Skip primer removal process + --skipAdapterRemoval Set this option to skip adapter removal in the pipeline - --skipAminoTyping Set this option to skip AminoTyping processes + --skipPrimerRemoval Set this option to skip primer removal process - --skipTaxonomy Set this option to skip taxonomy assignment processes + --skipMerging Set this option to skip read merging - --skipPhylogeny Set this option to skip phylogeny processes + --skipAminoTyping Set this option to skip AminoTyping processes - **NOTE** Most opitons below can be set using the configuration file (vampirus.config) to avoid a lengthy launch command. + --skipTaxonomy Set this option to skip taxonomy assignment processes - --Project/analysis information-- + --skipPhylogeny Set this option to skip phylogeny processes - --projtag Set project name to be used as a prefix for output files + --skipEMBOSS Set this option to skip EMBOSS processes - --metadata Set path to metadata spreadsheet file to be used for report generation (must be defined if generating report) + --skipReport Set this option to skip html report generation - --reads Path to directory containing read libraries, must have *R{1,2}* in the library names - --workingdir Path to working directory where Nextflow will put all Nextflow and vAMPirus generated output files + **NOTE** Most opitons below can be set using the configuration file (vampirus.config) to avoid a lengthy launch command. - --outdir Name of results directory containing all output from the chosen pipeline (will be made within the working directory) + --Project/analysis information-- + --projtag Set project name to be used as a prefix for output files - --Merged read length filtering-- + --metadata Set path to metadata spreadsheet file to be used for report generation (must be defined if generating report) - --minLen Minimum merged read length - reads below the specified maximum read length will be used for counts only + --reads Path to directory containing read libraries, must have *R{1,2}* in the library names - --maxLen Maximum merged read length - reads with length equal to the specified max read length will be used to identifying unique sequences and subsequent Amplicon Sequence Variant (ASV) analysis + --workingdir Path to working directory where Nextflow will put all Nextflow and vAMPirus generated output files - --maxEE Use this option to set the maximum expected error rate for vsearch merging. Default is 1. + --outdir Name of results directory containing all output from the chosen pipeline (will be made within the working directory) - --Primer removal-- + --Merged read length filtering-- - General primer removal parameters + --minLen Minimum merged read length - reads below the specified maximum read length will be used for counts only - --primerLength Use this option to set the max primer length to restrict bbduk.sh primer trimming to the first x number of bases + --maxLen Maximum merged read length - reads with length equal to the specified max read length will be used to identifying unique sequences and subsequent Amplicon Sequence Variant (ASV) analysis - --maxkmer Maximum kmer length for bbduk.sh to use for primer detection and removal (must be shorter than your primer length; default = 13) + --maxEE Use this option to set the maximum expected error rate for vsearch merging. Default is 1. - --minkmer Minimum kmer length for primer removal (default = 3) - --minilen Minimum read length after adapter and primer removal (default = 200) + --Primer removal-- - Single primer set removal- + General primer removal parameters - --GlobTrim Set this option to perform global trimming to reads to remove primer sequences. Example usage "--GlobTrim #basesfromforward,#basesfromreverse" + --primerLength Use this option to set the max primer length to restrict bbduk.sh primer trimming to the first x number of bases - --fwd Forward primer sequence for reads to be detected and removed from reads (must specify reverse sequence if providing forward) + --maxkmer Maximum kmer length for bbduk.sh to use for primer detection and removal (must be shorter than your primer length; default = 13) - --rev Reverse primer sequence for reads to be detected and removed from reads (must specify forward sequence if providing reverse) + --minkmer Minimum kmer length for primer removal (default = 3) - Multiple primer set removal- + --minilen Minimum read length after adapter and primer removal (default = 200) - --multi Use this option to signal multiple primer sequence removal within the specified pipeline + Single primer set removal- - --primers Use this option to set the path to a fasta file with all of the primer sequences to be detected and removed from reads + --GlobTrim Set this option to perform global trimming to reads to remove primer sequences. Example usage "--GlobTrim #basesfromforward,#basesfromreverse" + --fwd Forward primer sequence for reads to be detected and removed from reads (must specify reverse sequence if providing forward) - --Amplicon Sequence Variant (ASV) genration and clustering-- + --rev Reverse primer sequence for reads to be detected and removed from reads (must specify forward sequence if providing reverse) - --alpha Alpha value for denoising - the higher the alpha the higher the chance of false positives in ASV generation (1 or 2) + Multiple primer set removal- - --minSize Minimum size or representation for sequence to be considered in ASV generation + --multi Use this option to signal multiple primer sequence removal within the specified pipeline - --clusterNuclID With --ncASV set, use this option to set a single percent similarity to cluster nucleotide ASV sequences into ncASVs by [ Example: --clusterNuclID .97 ] + --primers Use this option to set the path to a fasta file with all of the primer sequences to be detected and removed from reads - --clusterNuclIDlist With --ncASV set, use this option to perform nucleotide-based clustering of ASVs with a comma separated list of percent similarities [ Example: --clusterNuclIDlist .95,.96,.97,.98 ] - --clusterAAID With --pcASV set, use this option to set a single percent similarity for protein-based ASV clustering to generate pcASVs[ Example: --clusterAAID .97 ] + --Amplicon Sequence Variant (ASV) genration and clustering-- - --clusterAAIDlist With --pcASV set, use this option to perform protein-based ASV clustering to generate pcASVs with a comma separated list of percent similarities [ Example: --clusterAAIDlist .95,.96,.97,.98 ] + --alpha Alpha value for denoising - the higher the alpha the higher the chance of false positives in ASV generation (1 or 2) - --minAA With --pcASV set, use this option to set the expected or minimum amino acid sequence length of open reading frames within your amplicon sequences + --minSize Minimum size or representation for sequence to be considered in ASV generation + --clusterNuclID With --ncASV set, use this option to set a single percent similarity to cluster nucleotide ASV sequences into ncASVs by [ Example: --clusterNuclID .97 ] - --Counts table generation-- + --clusterNuclIDlist With --ncASV set, use this option to perform nucleotide clustering with a comma separated list of percent similarities [ Example: --clusterNuclIDlist .95,.96,.97,.98 ] - --asvcountID Similarity ID to use for ASV counts + --clusterAAID With --pcASV set, use this option to set a single percent similarity for protein-based ASV clustering to generation pcASVs [ Example: --clusterAAID .97 ] - --ProtCountID Minimum amino acid sequence similarity for hit to count + --clusterAAIDlist With --pcASV set, use this option to perform protein-based ASV clustering to generate pcASVs with a comma separated list of percent similarities [ Example: --clusterAAIDlist .95,.96,.97,.98 ] - --ProtCountsLength Minimum alignment length for hit to count + --minAA With --pcASV set, use this option to set the expected or minimum amino acid sequence length of open reading frames within your amplicon sequences - --ProtCountsBit Minimum bitscore for hit to be counted + --Minimum Entropy Decomposition-- + --asvC Number of high entropy positions to use for ASV MED analysis and generate "Groups" - --Taxonomy inference parameters-- + --aminoC Number of high entropy positions to use for AminoType MED analysis and generate "Groups" - --dbname Specify name of database to use for analysis + --Counts table generation-- - --dbdir Path to Directory where database is being stored + --asvcountID Similarity ID to use for ASV counts - --refseq Set "--refseq T" to toggle use of RefSeq header format; default is "F" to use Reverence Viral DataBase (RVDB) header + --ProtCountID Minimum amino acid sequence similarity for hit to count - --bitscore Set minimum bitscore to allow for best hit in taxonomy assignment + --ProtCountsLength Minimum alignment length for hit to count - --minID Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment + --ProtCountsBit Minimum bitscore for hit to be counted - --minaln Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment + --Taxonomy inference parameters-- - --Phylogeny analysis parameters-- + --dbname Specify name of database to use for analysis - Setting customs options for IQ-TREE (Example: "-option1 A -option2 B -option3 C -option4 D") - might be easier to set in the vampirus.config file at lines 108/109 + --dbdir Path to Directory where database is being stored - --iqCustomnt Use option to set custom options to use in all IQTREE analyses with nuceoltide sequences + --headers Set taxonomy database header format -> headers= "RefSeq" to toggle use of RefSeq header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers - --iqCustomaa Use option to set custom options to use in all IQTREE analyses with amino acid sequences + --dbanno Path to directory hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. - These options below you can set at the command, for example, to set to use model from ModelTest-NG with parametric bootstrapping --ModelTnt --ModelTaa --parametric + --lca Set --lca T if you would like to add taxonomic classification to taxonomy results - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" - --ModelTnt=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with nuceoltide sequences (Default is IQ-TREE will do automatic model testing with ModelFinder Plus) + --bitscore Set minimum bitscore to allow for best hit in taxonomy assignment - --ModelTaa=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with amino acid sequences + --minID Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment - --parametric Set to use parametric bootstrapping in IQTREE analyses + --minaln Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment - --nonparametric Set to use parametric bootstrapping in IQTREE analyses - --boots Number of bootstraps (recommended 1000 for parametric and 100 for non-parametric) + --Phylogeny analysis parameters-- + Setting customs options for IQ-TREE (Example: "-option1 A -option2 B -option3 C -option4 D") - might be easier to set in the vampirus.config file at lines 108/109 - --Statistics options-- + --iqCustomnt Use option to set custom options to use in all IQTREE analyses with nuceoltide sequences - --stats Set "--stats run" to signal statstical tests to be performed and included in the final report + --iqCustomaa Use option to set custom options to use in all IQTREE analyses with amino acid sequences - --minimumCounts Minimum number of hit counts for a sample to have to be included in the downstream statistical analyses and report generation + These options below you can set at the command, for example, to set to use model from ModelTest-NG with parametric bootstrapping --ModelTnt --ModelTaa --parametric - --trymax Maximum number of iterations performed by metaMDS + --ModelTnt=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with nuceoltide sequences (Default is IQ-TREE will do automatic model testing with ModelFinder Plus) + + --ModelTaa=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with amino acid sequences + + --parametric Set to use parametric bootstrapping in IQTREE analyses + + --nonparametric Set to use parametric bootstrapping in IQTREE analyses + + --boots Number of bootstraps (recommended 1000 for parametric and 100 for non-parametric) + + + --Statistics options-- + + --stats Set "--stats run" to signal statstical tests to be performed and included in the final report + + --minimumCounts Minimum number of hit counts for a sample to have to be included in the downstream statistical analyses and report generation + + --trymax Maximum number of iterations performed by metaMDS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| @@ -414,7 +457,7 @@ def fullHelpMessage() { Example 4. Launching the vAMPirus Analyze pipeline with singularity with ASV and AminoType generation with all accesory analyses (taxonomy assignment, EMBOSS, IQTREE, statistics) - nextflow run vAMPirus.nf -c vampirus.config -profile singularity --Analyze --stats run + nextflow run vAMPirus.nf -c vampirus.config -profile singularity --Analyze --stats Example 5. Launching the vAMPirus Analyze pipeline with conda to perform multiple primer removal and protein-based clustering of ASVs, but skip most of the extra analyses @@ -422,7 +465,11 @@ def fullHelpMessage() { Example 6. Launching vAMPirus Analyze pipeline with conda to produce only ASV-related results - nextflow run vAMPirus.nf -c vampirus.config -profile conda --Analyze --skipAminoTyping --stats run + nextflow run vAMPirus.nf -c vampirus.config -profile conda --Analyze --skipAminoTyping --stats + + Example 7. Launching vAMPirus Analyze pipeline with conda to perform ASV analyses with Minimum Entropy Decomposition to form "Groups" + + nextflow run vAMPirus.nf -c vampirus.config -profile conda --Analyze --skipAminoTyping --stats --asvMED --asvC 24 Resuming analyses => diff --git a/vampirus.config b/vampirus.config index 3fdc778..05db904 100644 --- a/vampirus.config +++ b/vampirus.config @@ -125,8 +125,8 @@ params { boots="1000" // Stats options - // Tell vAMPirus to perform statistical analyses by setting "stats="run"" below or in the launch command by adding "--stats run" to it - stats=false + // Tell vAMPirus to perform statistical analyses by setting "stats = true" below or in the launch command by adding "--stats" to it + stats = false // Minimum number of hit counts for a sample to have to be included in the downstream statistical analyses and report generation minimumCounts="1000" // Maximum number of iteration performed by metaMDS diff --git a/vampirus_startup.sh b/vampirus_startup.sh index 447a90c..7b1f980 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -202,7 +202,7 @@ then mkdir "$mypwd"/Databases echo "Editing confiration file for you now..." sed 's/DATABASENAME/U-RVDBv21.0-prot.fasta/g' "$mypwd"/vampirus.config > tmp1.config sed "s|DATABASEDIR|${dir}|g" tmp1.config > tmp2.config - sed "s|DATABASEANNOT|${dir}/RVDBannot|g" tmp2.config | sed "s|LCAT|T|g" > tmp3.config + sed "s|DATABASEANNOT|${dir}/RVDBannot|g" tmp2.config | sed "s|LCAT|T|g" | sed 's/HEAD/RVDB/g' > tmp3.config rm tmp1.config rm tmp2.config cat tmp3.config > "$mypwd"/vampirus.config @@ -225,7 +225,7 @@ then mkdir "$mypwd"/Databases rm viral.*.protein.faa echo "Editing confiration file for you now..." sed 's/DATABASENAME/complete_virus_refseq_prot.fasta/g' "$mypwd"/vampirus.config > tmp1.config - sed "s|DATABASEDIR|${dir}|g" tmp1.config > tmp2.config + sed "s|DATABASEDIR|${dir}|g" tmp1.config | sed 's/HEAD/RefSeq/g' > tmp2.config rm tmp1.config cat tmp2.config > "$mypwd"/vampirus.config rm tmp2.config @@ -239,7 +239,7 @@ then mkdir "$mypwd"/Databases gunzip NCBI_nr_proteindb.faa.gz echo "Editing confiration file for you now..." sed 's/DATABASENAME/NCBI_nr_proteindb.faa/g' "$mypwd"/vampirus.config > tmp1.config - sed "s|DATABASEDIR|${dir}|g" tmp1.config > tmp2.config + sed "s|DATABASEDIR|${dir}|g" tmp1.config | sed 's/HEAD/RefSeq/g' > tmp2.config rm tmp1.config cat tmp2.config > "$mypwd"/vampirus.config rm tmp2.config @@ -284,11 +284,11 @@ then echo ""$mypwd"/nextflow run "$mypwd"/vAMPirus.nf -c "$mypwd"/vampirus.config -profile singularity,test --DataCheck" >> STARTUP_HELP.txt echo " " >> STARTUP_HELP.txt echo "Next, test the analysis pipeline:" >> STARTUP_HELP.txt - echo ""$mypwd"/nextflow run "$mypwd"/vAMPirus.nf -c "$mypwd"/vampirus.config -profile conda,test --Analyze --ncASV --pcASV --stats run" >> STARTUP_HELP.txt + echo ""$mypwd"/nextflow run "$mypwd"/vAMPirus.nf -c "$mypwd"/vampirus.config -profile conda,test --Analyze --ncASV --pcASV --stats" >> STARTUP_HELP.txt echo " " >> STARTUP_HELP.txt echo "Or if you plan to run vAMPirus using Singularity, use this test command:" >> STARTUP_HELP.txt echo " " >> STARTUP_HELP.txt - echo ""$mypwd"/nextflow run "$mypwd"/vAMPirus.nf -c "$mypwd"/vampirus.config -profile singularity,test --Analyze --ncASV --pcASV --stats run" >> STARTUP_HELP.txt + echo ""$mypwd"/nextflow run "$mypwd"/vAMPirus.nf -c "$mypwd"/vampirus.config -profile singularity,test --Analyze --ncASV --pcASV --stats" >> STARTUP_HELP.txt echo "--------------------------------------------------------------------------------------------------------------------------------" >> STARTUP_HELP.txt echo " " >> STARTUP_HELP.txt echo "Ok, if everything went well (green text was spit out by Nextflow), now you can move on to the fun. First, you should review the help docs and the vampirus.config in the vAMPirus directory." >> STARTUP_HELP.txt @@ -308,11 +308,11 @@ then echo "-------------------------------------------------------------------------------------------------------------------------------- RUNNING Analyze PIPELINE WITH YOUR DATA" >> STARTUP_HELP.txt echo "Then you can run the analysis using the -with-conda Nextflow option, here is a launch command to run the complete analysis and statistical tests:" >> STARTUP_HELP.txt echo " " >> STARTUP_HELP.txt - echo ""$mypwd"/nextflow run "$mypwd"/vAMPirus.nf -c "$mypwd"/vampirus.config -with-conda "$environment" --Analyze --ncASV --pcASV --stats run" >> STARTUP_HELP.txt + echo ""$mypwd"/nextflow run "$mypwd"/vAMPirus.nf -c "$mypwd"/vampirus.config -with-conda "$environment" --Analyze --ncASV --pcASV --stats" >> STARTUP_HELP.txt echo " " >> STARTUP_HELP.txt echo "OR same command using -profile option of Nextflow ..." >> STARTUP_HELP.txt echo " " >> STARTUP_HELP.txt - echo ""$mypwd"/nextflow run "$mypwd"/vAMPirus.nf -c "$mypwd"/vampirus.config -profile [conda|singularity] --Analyze --ncASV --pcASV --stats run" >> STARTUP_HELP.txt + echo ""$mypwd"/nextflow run "$mypwd"/vAMPirus.nf -c "$mypwd"/vampirus.config -profile [conda|singularity] --Analyze --ncASV --pcASV --stats" >> STARTUP_HELP.txt echo " " >> STARTUP_HELP.txt echo "--------------------------------------------------------------------------------------------------------------------------------" >> STARTUP_HELP.txt fi From 463553cbe53e1fbd390dd6bc5bf2651fd575c38c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Mon, 29 Mar 2021 14:19:10 -0700 Subject: [PATCH 081/223] Fix typo --- bin/vAMPirus_Report.Rmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/vAMPirus_Report.Rmd b/bin/vAMPirus_Report.Rmd index 300f310..af10a49 100644 --- a/bin/vAMPirus_Report.Rmd +++ b/bin/vAMPirus_Report.Rmd @@ -225,7 +225,7 @@ raredata <- as.data.frame(rrarefy(data5[,2:cols], sample=minreads))

-### Shannon diversty +### Shannon diversity
```{r diversity_analysis, echo=FALSE} @@ -307,7 +307,7 @@ if (params$stats == "true" ) {

-### Simpson diversty +### Simpson diversity
```{r diversity_analysis2, echo=FALSE} From 9034ec7b016dd1c46009b39eaef9edcf0907f4f5 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 30 Mar 2021 13:41:18 -0500 Subject: [PATCH 082/223] update --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index cde16b1..f5e3aca 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -33,7 +33,7 @@ def helpMessage() { Usage: - nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] + nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] [--asvMED] [--aminoMED] [--stats] --Help options-- From 5643f065b9ac9d5a7425563b1673ad3af33cb973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 11:52:45 -0700 Subject: [PATCH 083/223] Add pip install command --- vampirus_env.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vampirus_env.yml b/vampirus_env.yml index df49583..7ecc2be 100644 --- a/vampirus_env.yml +++ b/vampirus_env.yml @@ -37,3 +37,5 @@ dependencies: - bioconductor-biocparallel=1.24.0 - pigz=2.4 - r-biocmanager=1.30.10 + - pip: + - oligotyping From 41c29e60855d498e7f85a585da8ea3550ae1e63b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 11:53:07 -0700 Subject: [PATCH 084/223] Remove pip install code --- vampirus_startup.sh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/vampirus_startup.sh b/vampirus_startup.sh index 7b1f980..0c3f1f3 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -177,11 +177,6 @@ else rm tmp1.config fi -echo "Downloading oligotyping program" -conda init && conda activate vAMPirus -pip install oligotyping -conda deactivate - echo "-------------------------------------------------------------------------------- Conda check/install done" echo "Now lets check the status of Nextflow on your system..." From d16c3341dba9d470bf61e4b21f419a75374d5c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 12:06:01 -0700 Subject: [PATCH 085/223] Remove extra code --- vAMPirus.nf | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index f5e3aca..0487021 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1547,12 +1547,10 @@ if (params.DataCheck || params.Analyze) { if [[ ${params.lca} == "T" ]] then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv fi - if [[ ${params.lca} == "T" ]] - then paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv - fi for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) @@ -1877,12 +1875,10 @@ if (params.DataCheck || params.Analyze) { if [[ ${params.lca} == "T" ]] then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv fi - if [[ ${params.lca} == "T" ]] - then paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv - fi for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) @@ -2499,12 +2495,10 @@ if (params.DataCheck || params.Analyze) { if [[ ${params.lca} == "T" ]] then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv fi - if [[ ${params.lca} == "T" ]] - then paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv - fi for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) @@ -3078,12 +3072,10 @@ if (params.DataCheck || params.Analyze) { if [[ ${params.lca} == "T" ]] then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv fi - if [[ ${params.lca} == "T" ]] - then paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv - fi for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) @@ -3495,12 +3487,10 @@ if (params.DataCheck || params.Analyze) { if [[ ${params.lca} == "T" ]] then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv fi - if [[ ${params.lca} == "T" ]] - then paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv - fi for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) From 336159e4cac45af0ffd8dfa031e3023bfc10a01a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 12:09:13 -0700 Subject: [PATCH 086/223] Add missing "\" --- vAMPirus.nf | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 0487021..228b5c3 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1508,8 +1508,8 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ ${params.lca} == "T" ]] - then group=$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' - lcla=$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list fi echo "\$s done." @@ -1836,8 +1836,8 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ ${params.lca} == "T" ]] - then group=$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' - lcla=$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list fi echo "\$s done." @@ -2456,8 +2456,8 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ ${params.lca} == "T" ]] - then group=$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' - lcla=$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list fi echo "\$s done." @@ -3033,8 +3033,8 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ ${params.lca} == "T" ]] - then group=$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' - lcla=$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list fi echo "\$s done." @@ -3448,8 +3448,8 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ ${params.lca} == "T" ]] - then group=$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' - lcla=$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list fi echo "\$s done." From 596f4d32de8c61b0f53209eca8f410b80c39ff4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 12:13:19 -0700 Subject: [PATCH 087/223] Add process names --- vAMPirus.nf | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 228b5c3..4434f5c 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1344,7 +1344,7 @@ if (params.DataCheck || params.Analyze) { if (params.headers == "RefSeq") { - process ncASV_Taxonomy_Inference { /////// editttt + process ncASV_Taxonomy_Inference_RefSeq { /////// editttt label 'high_cpus' @@ -1444,7 +1444,7 @@ if (params.DataCheck || params.Analyze) { } } else if (params.headers == "RVDB") { - process ncASV_Taxonomy_Inference { /////// editttt + process ncASV_Taxonomy_Inference_RVDB { /////// editttt label 'high_cpus' @@ -1678,7 +1678,7 @@ if (params.DataCheck || params.Analyze) { if (params.headers == "RefSeq") { - process ASV_Taxonomy_Inference { /////// editttt + process ASV_Taxonomy_Inference_RefSeq { /////// editttt label 'high_cpus' @@ -1775,7 +1775,7 @@ if (params.DataCheck || params.Analyze) { } } else if (params.headers == "RVDB") { - process ASV_Taxonomy_Inference { /////// editttt + process ASV_Taxonomy_Inference_RVDB { /////// editttt label 'high_cpus' @@ -2298,7 +2298,7 @@ if (params.DataCheck || params.Analyze) { if (params.headers == "RefSeq") { - process AminoType_Taxonomy_Inference { + process AminoType_Taxonomy_Inference_RefSeq { label 'high_cpus' @@ -2395,7 +2395,7 @@ if (params.DataCheck || params.Analyze) { } } else if (params.headers == "RVDB") { - process AminoType_Taxonomy_Inference { + process AminoType_Taxonomy_Inference_RVDB { label 'high_cpus' @@ -2865,7 +2865,7 @@ if (params.DataCheck || params.Analyze) { if (params.headers == "RefSeq") { - process pcASV_Nucleotide_Taxonomy_Inference { + process pcASV_Nucleotide_Taxonomy_Inference_RefSeq { label 'high_cpus' @@ -2967,7 +2967,7 @@ if (params.DataCheck || params.Analyze) { } } else if (params.headers == "RVDB") { - process pcASV_Nucleotide_Taxonomy_Inference { + process pcASV_Nucleotide_Taxonomy_Inference_RVDB { label 'high_cpus' @@ -3282,7 +3282,7 @@ if (params.DataCheck || params.Analyze) { if (params.headers == "RefSeq") { - process pcASV_AminoAcid_Taxonomy_Inference { + process pcASV_AminoAcid_Taxonomy_Inference_RefSeq { label 'high_cpus' @@ -3383,7 +3383,7 @@ if (params.DataCheck || params.Analyze) { } } else if (params.headers == "RVDB") { - process pcASV_AminoAcid_Taxonomy_Inference { + process pcASV_AminoAcid_Taxonomy_Inference_RVDB { label 'high_cpus' From e8224307ed2f71e26a090d0188523e1c791b3ce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 12:21:49 -0700 Subject: [PATCH 088/223] Add " --- vAMPirus.nf | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 4434f5c..16c0f37 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1507,7 +1507,7 @@ if (params.DataCheck || params.Analyze) { virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list @@ -1527,7 +1527,7 @@ if (params.DataCheck || params.Analyze) { virus="NO" gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then echo "N/A" >> classfication.list fi echo "\$s done." @@ -1544,7 +1544,7 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv @@ -1835,7 +1835,7 @@ if (params.DataCheck || params.Analyze) { virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list @@ -1855,7 +1855,7 @@ if (params.DataCheck || params.Analyze) { virus="NO" gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then echo "N/A" >> classfication.list fi echo "\$s done." @@ -1872,7 +1872,7 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv @@ -2418,7 +2418,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -2455,7 +2455,7 @@ if (params.DataCheck || params.Analyze) { virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list @@ -2475,7 +2475,7 @@ if (params.DataCheck || params.Analyze) { virus="NO" gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then echo "N/A" >> classfication.list fi echo "\$s done." @@ -2492,7 +2492,7 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv @@ -3032,7 +3032,7 @@ if (params.DataCheck || params.Analyze) { virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list @@ -3052,7 +3052,7 @@ if (params.DataCheck || params.Analyze) { virus="NO" gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then echo "N/A" >> classfication.list fi echo "\$s done." @@ -3069,7 +3069,7 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv @@ -3447,7 +3447,7 @@ if (params.DataCheck || params.Analyze) { virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list @@ -3467,7 +3467,7 @@ if (params.DataCheck || params.Analyze) { virus="NO" gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then echo "N/A" >> classfication.list fi echo "\$s done." @@ -3484,7 +3484,7 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - if [[ ${params.lca} == "T" ]] + if [[ "${params.lca}" == "T" ]] then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv From d13c8fbbdf4240fa155d16b3f4554063827e26bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 12:24:40 -0700 Subject: [PATCH 089/223] Add missing ) --- vAMPirus.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 16c0f37..87dadb1 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1508,7 +1508,7 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list fi @@ -1836,7 +1836,7 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list fi @@ -2456,7 +2456,7 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list fi @@ -3033,7 +3033,7 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list fi @@ -3448,7 +3448,7 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}' + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') echo "\$lcla" >> classfication.list fi From f43d786aa5328a272bd9e69ba5529cfb769fd979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 12:32:19 -0700 Subject: [PATCH 090/223] Fix output filename --- vAMPirus.nf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 87dadb1..a0fd3b8 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1690,7 +1690,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.fasta") into tax_labeled_fasta_asv - tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv + tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv file("*_ASV*_summary_for_plot.csv") into taxplot_asv script: @@ -1787,7 +1787,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.fasta") into tax_labeled_fasta_asv - tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv + tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv file("*_ASV*_summary_for_plot.csv") into taxplot_asv file("*_quick_Taxbreakdown.csv") into tax_table_asv @@ -2309,7 +2309,7 @@ if (params.DataCheck || params.Analyze) { file(asvs) from aminotypesBlast output: - tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond + tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond file("*_summary_for_plot.csv") into taxplot2 file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 @@ -2406,7 +2406,7 @@ if (params.DataCheck || params.Analyze) { file(asvs) from aminotypesBlast output: - tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond + tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond file("*_summary_for_plot.csv") into taxplot2 file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 file("*_quick_Taxbreakdown.csv") into tax_table_amino @@ -2880,7 +2880,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.fasta") into ( pcASV_labeled ) - tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond + tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond tuple nid, file("*_summary_for_plot.csv") into taxplot3 script: @@ -2982,7 +2982,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.fasta") into ( pcASV_labeled ) - tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond + tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond tuple nid, file("*_summary_for_plot.csv") into taxplot3 file("*_quick_Taxbreakdown.csv") into tax_table_pcasvnt @@ -3297,7 +3297,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.fasta") into ( pcASV_labeledAA ) - tuple file("*phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond + tuple file("*phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond tuple nid, file("*_summary_for_plot.csv") into taxplot4 script: @@ -3398,7 +3398,7 @@ if (params.DataCheck || params.Analyze) { output: file("*.fasta") into ( pcASV_labeledAA ) - tuple file("*phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond + tuple file("*phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond tuple nid, file("*_summary_for_plot.csv") into taxplot4 file("*_quick_Taxbreakdown.csv") into tax_table_pcasvaa From 8f632573453269991f85c6e0fc06fa820a1b6d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 12:35:45 -0700 Subject: [PATCH 091/223] Fix process error. --- vAMPirus.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index a0fd3b8..e55fe8c 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2550,17 +2550,17 @@ if (params.DataCheck || params.Analyze) { iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.fasta.log | head -1 | awk '{print \$6}') + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} elif [ "${params.parametric}" != "false" ];then - iqtree -s\${pre}_Aligned_informativeonly.fasta.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s\${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni else - iqtree -s \${pre}_Aligned_informativeonly.fasta.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni fi """ } From 467e0aa398202969d25bf54372a19cefe61ba432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 12:42:16 -0700 Subject: [PATCH 092/223] Fix file issue --- vAMPirus.nf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index e55fe8c..c8e3dab 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1485,6 +1485,7 @@ if (params.DataCheck || params.Analyze) { then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list echo "[Classification]" > classfication.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + echo "[Classification]" > classfication.list fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt @@ -1813,6 +1814,7 @@ if (params.DataCheck || params.Analyze) { then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list echo "[Classification]" > classfication.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + echo "[Classification]" > classfication.list fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt @@ -2122,7 +2124,6 @@ if (params.DataCheck || params.Analyze) { input: file(counts) from asvcount_med - file(tree) from asvphy_med file(map) from asvgroupscsv output: @@ -2433,6 +2434,7 @@ if (params.DataCheck || params.Analyze) { then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list echo "[Classification]" > classfication.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + echo "[Classification]" > classfication.list fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt @@ -3010,6 +3012,7 @@ if (params.DataCheck || params.Analyze) { then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list echo "[Classification]" > classfication.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + echo "[Classification]" > classfication.list fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt @@ -3425,6 +3428,7 @@ if (params.DataCheck || params.Analyze) { then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list echo "[Classification]" > classfication.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + echo "[Classification]" > classfication.list fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt From 54594979d1a5885aa721f7dc3a4e95452c04c1b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 12:49:46 -0700 Subject: [PATCH 093/223] Fix group labeling --- vAMPirus.nf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index c8e3dab..1999c60 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2123,11 +2123,11 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/", mode: "copy", overwrite: true input: - file(counts) from asvcount_med - file(map) from asvgroupscsv + file(counts) from asvcount_med + file(map) from asvgroupscsv output: - file("${params.projtag}_ASV_Grouping_counts.csv") into asvgroupcounts + file("${params.projtag}_ASV_Grouping_counts.csv") into asvgroupcounts script: """ @@ -2652,7 +2652,7 @@ if (params.DataCheck || params.Analyze) { grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list seqtk subseq ../../${aminos} asv.list > Group"\${j}"_sequences.fasta for z in \$( cat asv.list) - do echo ""\$z",Group"\$gid","\$uni"" >> ${params.projtag}_AminoType_Grouping.csv + do echo ""\$z",Group"\$j","\$uni"" >> ${params.projtag}_AminoType_Grouping.csv done rm asv.list @@ -2722,12 +2722,12 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/", mode: "copy", overwrite: true input: - file(counts) from aminocountmed - file(tree) from amino_repphy - file(map) from atygroupscsv + file(counts) from aminocountmed + file(tree) from amino_repphy + file(map) from atygroupscsv output: - file("${params.projtag}_AminoType_Grouping_counts.csv") into amino_groupcounts + file("${params.projtag}_AminoType_Grouping_counts.csv") into amino_groupcounts script: """ From 2f011fb0e489a3cd8d3b7079a04b1eaa5f72f822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 12:50:36 -0700 Subject: [PATCH 094/223] Fix typo --- vAMPirus.nf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 1999c60..8df4db3 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1481,7 +1481,7 @@ if (params.DataCheck || params.Analyze) { echo "[ncASV#]" > otu.list echo "[Sequence length]" > length.list grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - if [[ ${params.lsa} == "T" ]] + if [[ ${params.lca} == "T" ]] then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list echo "[Classification]" > classfication.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv @@ -1810,7 +1810,7 @@ if (params.DataCheck || params.Analyze) { echo "[ASV#]" > otu.list echo "[Sequence length]" > length.list grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - if [[ ${params.lsa} == "T" ]] + if [[ ${params.lca} == "T" ]] then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list echo "[Classification]" > classfication.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv @@ -2054,7 +2054,7 @@ if (params.DataCheck || params.Analyze) { grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list seqtk subseq ../../${asvs} asv.list > Group"\${j}"_sequences.fasta for z in \$( cat asv.list) - do echo ""\$z",Group"\$gid","\$uni"" >> ${params.projtag}_ASV_Grouping.csv + do echo ""\$z",Group"\$j","\$uni"" >> ${params.projtag}_ASV_Grouping.csv done rm asv.list @@ -2430,7 +2430,7 @@ if (params.DataCheck || params.Analyze) { echo "[AminoType#]" > otu.list echo "[Sequence length]" > length.list grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - if [[ ${params.lsa} == "T" ]] + if [[ ${params.lca} == "T" ]] then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list echo "[Classification]" > classfication.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv @@ -3008,7 +3008,7 @@ if (params.DataCheck || params.Analyze) { echo "[pcASV#]" > otu.list echo "[Sequence length]" > length.list grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - if [[ ${params.lsa} == "T" ]] + if [[ ${params.lca} == "T" ]] then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list echo "[Classification]" > classfication.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv @@ -3424,7 +3424,7 @@ if (params.DataCheck || params.Analyze) { echo "[pcASV#]" > otu.list echo "[Sequence length]" > length.list grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - if [[ ${params.lsa} == "T" ]] + if [[ ${params.lca} == "T" ]] then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list echo "[Classification]" > classfication.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv From 00ff0eb2b3564780bc0732f5d83cf2f366356fef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 13:13:08 -0700 Subject: [PATCH 095/223] WIP - Fix report channels --- vAMPirus.nf | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 8df4db3..4887746 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -3658,18 +3658,24 @@ if (params.DataCheck || params.Analyze) { taxplot1 -> ${params.projtag}_ASV_summary_for_plot.csv asv_heatmap -> ${params.projtag}_ASV_PercentID.matrix nucl_phyl_plot -> ${params.projtag}_ASV_iq.treefile + file("*_ASV_Grouping.csv") into asvgroupscsv + "${params.projtag}_ASV_Grouping_counts.csv") into asvgroupcounts + *_quick_Taxbreakdown.csv") into tax_table_asv + \\${params.projtag}_ASV_Group_Reps_iq.treefile */ + report_asv = Channel.create() - asv_counts_plots.mix(taxplot_asv, asv_heatmap, nucl_phyl_plot_asv).flatten().buffer(size:4).into(report_asv) + asv_counts_plots.mix(taxplot_asv, asv_heatmap, nucl_phyl_plot_asv, asvgroups, asvgroupcounts, asv_group_rep_tree, tax_table_asv).flatten().buffer(size:8).dump(tag:'asv').into(report_asv) if (params.ncASV) { report_ncasv = Channel.create() - notu_counts_plots.mix(taxplot_ncasv, notu_heatmap, nucl_phyl_plot_ncasv).groupTuple(by:0, size:4).into(report_ncasv) + notu_counts_plots.mix(taxplot_ncasv, notu_heatmap, nucl_phyl_plot_ncasv, tax_table_ncasv).groupTuple(by:0, size:5).dump(tag:'ncasv').into(report_ncasv) /* notu_counts_plots -> ${params.projtag}_ncASV${id}_counts.csv taxplot1a -> ${params.projtag}_ncASV${id}_summary_for_plot.csv notu_heatmap -> ${params.projtag}_ncASV${id}_PercentID.matrix nucl_phyl_plot -> ${params.projtag}_ncASV${id}_iq.treefile + ${params.projtag}_ncASV${id}_quick_Taxbreakdown.csv */ } else { report_ncasv = Channel.empty() @@ -3677,20 +3683,22 @@ if (params.DataCheck || params.Analyze) { if (params.pcASV) { report_pcasv_aa = Channel.create() - potu_Acounts.mix(taxplot4, potu_aa_heatmap, potu_Atree_plot).groupTuple(by:0, size:4).into(report_pcasv_aa) + potu_Acounts.mix(taxplot4, potu_aa_heatmap, potu_Atree_plot, tax_table_pcasvaa).groupTuple(by:0, size:5).dump(tag:'pcasv1').into(report_pcasv_aa) /*Report_pcASV_AminoAcid potu_Acounts -> ${params.projtag}_pcASV${id}_noTaxonomy_counts.csv taxplot4 -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_summary_for_plot.csv potu_aa_heatmap -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_PercentID.matrix potu_Atree_plot -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_iq.treefile + tax_table_pcasvaa -> ${params.projtag}_aminoacid_pcASV${id}_quick_Taxbreakdown.csv */ report_pcasv_nucl = Channel.create() - potu_Ncounts_for_report.mix(taxplot3, potu_nucl_heatmap, potu_Ntree_plot).groupTuple(by:0, size:4).into(report_pcasv_nucl) + potu_Ncounts_for_report.mix(taxplot3, potu_nucl_heatmap, potu_Ntree_plot, tax_table_pcasvnt).groupTuple(by:0, size:5).dump(tag:'pcasv2').into(report_pcasv_nucl) /*Report_pcASV_Nucleotide potu_Ncounts_for_report -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_counts.csv taxplot3 -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_summary_for_plot.csv potu_nucl_heatmap -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_PercentID.matrix potu_Ntree_plot -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_iq.treefile + tax_table_pcasvnt -> ${params.projtag}_nucleotide_pcASV${id}_quick_Taxbreakdown.csv */ } else { report_pcasv_aa = Channel.empty() @@ -3699,20 +3707,24 @@ if (params.DataCheck || params.Analyze) { if (!params.skipAminoTyping) { report_aminotypes = Channel.create() - aminocounts_plot.mix(taxplot2, aminotype_heatmap, amino_rax_plot).flatten().buffer(size:4).into(report_aminotypes) + aminocounts_plot.mix(taxplot2, aminotype_heatmap, amino_rax_plot, atygroupscsv, amino_group_rep_tree, amino_groupcounts, tax_table_amino).flatten().buffer(size:8).dump(tag:'amino').into(report_aminotypes) /* Report_AminoTypes aminocounts_plot -> ${params.projtag}_AminoType_counts.csv taxplot2 -> ${params.projtag}_AminoTypes_summary_for_plot.csv aminotype_heatmap -> ${params.projtag}_AminoTypes_PercentID.matrix amino_rax_plot -> ${params.projtag}_AminoTypes_iq.treefile + atygroupscsv -> *_AminoType_Grouping.csv + amino_group_rep_tree -> ${params.projtag}_AminoType_Group_Reps_iq.treefile + params.projtag}_AminoType_Grouping_counts.csv") into amino_groupcounts + *_quick_Taxbreakdown.csv") into tax_table_amino */ } else { report_aminotypes = Channel.empty() } report_all_ch = Channel.create() - report_asv.mix(report_ncasv, report_pcasv_aa, report_pcasv_nucl, report_aminotypes).map{it.flatten()}.into(report_all_ch) + report_asv.mix(report_ncasv, report_pcasv_aa, report_pcasv_nucl, report_aminotypes).map{it.flatten()}.dump(tag:'report').into(report_all_ch) process Report { From 4e339ec8483ead07d2c3a1fd361f103d6d5780b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 13:15:36 -0700 Subject: [PATCH 096/223] WIP - Fix missing name --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 4887746..3baa0f3 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -3665,7 +3665,7 @@ if (params.DataCheck || params.Analyze) { */ report_asv = Channel.create() - asv_counts_plots.mix(taxplot_asv, asv_heatmap, nucl_phyl_plot_asv, asvgroups, asvgroupcounts, asv_group_rep_tree, tax_table_asv).flatten().buffer(size:8).dump(tag:'asv').into(report_asv) + asv_counts_plots.mix(taxplot_asv, asv_heatmap, nucl_phyl_plot_asv, asvgroupscsv, asvgroupcounts, asv_group_rep_tree, tax_table_asv).flatten().buffer(size:8).dump(tag:'asv').into(report_asv) if (params.ncASV) { report_ncasv = Channel.create() From 991e5ce1482c8ff485eae044ac10b75ee5d67cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 13:25:05 -0700 Subject: [PATCH 097/223] WIP - Fix missing channel --- vAMPirus.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 3baa0f3..79fc583 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1315,7 +1315,7 @@ if (params.DataCheck || params.Analyze) { if (params.ncASV) { reads_vsearch5_ch - .into{ asv_file_for_ncasvs; nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch } + .into{ asv_file_for_ncasvs; nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch; asv_for_med } process NucleotideBased_ASV_clustering { @@ -2023,7 +2023,6 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASVs/MED", mode: "copy", overwrite: true input: - file(asvs) from asv_for_med output: From 421581f00c189056c0555767c566a39b7cd6c5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 13:27:23 -0700 Subject: [PATCH 098/223] WIP - Fix diamond databse --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 79fc583..12171a4 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -3412,7 +3412,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list From 956660165fac86c66c50475b4bab131433dd466e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Tue, 30 Mar 2021 13:46:26 -0700 Subject: [PATCH 099/223] Fix space --- vAMPirus.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 12171a4..d03a85f 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1297,7 +1297,7 @@ if (params.DataCheck || params.Analyze) { .collect() output: - file("*.html") into datacheckreport + file("*.html") into datacheckreport script: """ @@ -3635,7 +3635,6 @@ if (params.DataCheck || params.Analyze) { cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv rm tmp.names.csv tmp.reads.stats.csv """ - } } else { From afc606397955925c9df9f4a77e95306ed0aa965d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 31 Mar 2021 11:03:06 -0700 Subject: [PATCH 100/223] Add info of change to pyhton3 --- bin/virtualribosomev2/dna2pep.py | 2 ++ bin/virtualribosomev2/mod_translate.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/bin/virtualribosomev2/dna2pep.py b/bin/virtualribosomev2/dna2pep.py index 1ab8eff..73196d6 100755 --- a/bin/virtualribosomev2/dna2pep.py +++ b/bin/virtualribosomev2/dna2pep.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 +# Script was modified form original to use python3 + # Copyright 2006 Rasmus Wernersson, Technical University of Denmark # # This file is part of VirtualRibosome. diff --git a/bin/virtualribosomev2/mod_translate.py b/bin/virtualribosomev2/mod_translate.py index a555603..af9af91 100755 --- a/bin/virtualribosomev2/mod_translate.py +++ b/bin/virtualribosomev2/mod_translate.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 +# Script was modified form original to use python3 + # Copyright 2002,2003,2004,2005 Rasmus Wernersson, Technical University of Denmark # # This file is part of VirtualRibosome. From 4e06fe9fdcf92a42db0dc70237b1deca779f86af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 31 Mar 2021 12:30:53 -0700 Subject: [PATCH 101/223] Fix tuple in output channels --- vAMPirus.nf | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index d03a85f..17a6b72 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1360,6 +1360,7 @@ if (params.DataCheck || params.Analyze) { file("*.fasta") into tax_labeled_fasta_ncasv tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_ncasv tuple nid, file("*ncASV*summary_for_plot.csv") into taxplot_ncasv + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_ncasv script: mtag="ID=" + nid @@ -1693,6 +1694,7 @@ if (params.DataCheck || params.Analyze) { file("*.fasta") into tax_labeled_fasta_asv tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv file("*_ASV*_summary_for_plot.csv") into taxplot_asv + file("*_quick_Taxbreakdown.csv") into tax_table_asv script: """ @@ -2312,6 +2314,7 @@ if (params.DataCheck || params.Analyze) { tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond file("*_summary_for_plot.csv") into taxplot2 file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 + file("*_quick_Taxbreakdown.csv") into tax_table_amino script: """ @@ -2883,6 +2886,7 @@ if (params.DataCheck || params.Analyze) { file("*.fasta") into ( pcASV_labeled ) tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond tuple nid, file("*_summary_for_plot.csv") into taxplot3 + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvnt script: mtag="ID=" + nid @@ -2985,7 +2989,7 @@ if (params.DataCheck || params.Analyze) { file("*.fasta") into ( pcASV_labeled ) tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond tuple nid, file("*_summary_for_plot.csv") into taxplot3 - file("*_quick_Taxbreakdown.csv") into tax_table_pcasvnt + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvnt script: mtag="ID=" + nid @@ -3301,6 +3305,7 @@ if (params.DataCheck || params.Analyze) { file("*.fasta") into ( pcASV_labeledAA ) tuple file("*phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond tuple nid, file("*_summary_for_plot.csv") into taxplot4 + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvaa script: mtag="ID=" + nid @@ -3402,7 +3407,7 @@ if (params.DataCheck || params.Analyze) { file("*.fasta") into ( pcASV_labeledAA ) tuple file("*phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond tuple nid, file("*_summary_for_plot.csv") into taxplot4 - file("*_quick_Taxbreakdown.csv") into tax_table_pcasvaa + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvaa script: mtag="ID=" + nid From bdb3dcc3f397abf54f30a6ed5453fe272e69b2c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20Rivera-Vic=C3=A9ns?= Date: Wed, 31 Mar 2021 14:01:05 -0700 Subject: [PATCH 102/223] Fix paste issue --- vAMPirus.nf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 17a6b72..a16c0bf 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2128,7 +2128,7 @@ if (params.DataCheck || params.Analyze) { file(map) from asvgroupscsv output: - file("${params.projtag}_ASV_Grouping_counts.csv") into asvgroupcounts + file("${params.projtag}_ASV_Groupingcounts.csv") into asvgroupcounts script: """ @@ -2138,7 +2138,7 @@ if (params.DataCheck || params.Analyze) { do group=\$(grep -w \$x ${map} | awk -F "," '{print \$2}') echo "\$group" >> group.list done - paste -d',' group.list ${counts} > ${params.projtag}_ASV_Grouping_counts.csv + paste -d',' group.list ${counts} > ${params.projtag}_ASV_Groupingcounts.csv """ } } @@ -2729,7 +2729,7 @@ if (params.DataCheck || params.Analyze) { file(map) from atygroupscsv output: - file("${params.projtag}_AminoType_Grouping_counts.csv") into amino_groupcounts + file("${params.projtag}_AminoType_Groupingcounts.csv") into amino_groupcounts script: """ @@ -2739,7 +2739,7 @@ if (params.DataCheck || params.Analyze) { do group=\$(grep -w \$x ${map} | awk -F "," '{print \$2}') echo "\$group" >> group.list done - paste -d',' group.list ${counts} > ${params.projtag}_AminoType_Grouping_counts.csv + paste -d',' group.list ${counts} > ${params.projtag}_AminoType_Groupingcounts.csv """ } } @@ -3662,7 +3662,7 @@ if (params.DataCheck || params.Analyze) { asv_heatmap -> ${params.projtag}_ASV_PercentID.matrix nucl_phyl_plot -> ${params.projtag}_ASV_iq.treefile file("*_ASV_Grouping.csv") into asvgroupscsv - "${params.projtag}_ASV_Grouping_counts.csv") into asvgroupcounts + "${params.projtag}_ASV_Groupingcounts.csv") into asvgroupcounts *_quick_Taxbreakdown.csv") into tax_table_asv \\${params.projtag}_ASV_Group_Reps_iq.treefile */ @@ -3719,7 +3719,7 @@ if (params.DataCheck || params.Analyze) { amino_rax_plot -> ${params.projtag}_AminoTypes_iq.treefile atygroupscsv -> *_AminoType_Grouping.csv amino_group_rep_tree -> ${params.projtag}_AminoType_Group_Reps_iq.treefile - params.projtag}_AminoType_Grouping_counts.csv") into amino_groupcounts + params.projtag}_AminoType_Groupingcounts.csv") into amino_groupcounts *_quick_Taxbreakdown.csv") into tax_table_amino */ } else { From f3318f42322533273730a1696e2467be6492a520 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 6 Apr 2021 08:55:48 -0500 Subject: [PATCH 103/223] Added max n, merge staggere and max differences options in merging command --- vAMPirus.nf | 2 +- vampirus.config | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index a16c0bf..5534e34 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -755,7 +755,7 @@ if (params.DataCheck || params.Analyze) { script: """ - vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxee ${params.maxEE} --relabel ${sample_id}. + vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxdiffs ${params.diffs} --fastq_maxns ${params.maxn} --fastq_allowmergestagger --fastq_maxee ${params.maxEE} --relabel ${sample_id}. echo ${sample_id} > ${sample_id}.name """ diff --git a/vampirus.config b/vampirus.config index 05db904..a987467 100644 --- a/vampirus.config +++ b/vampirus.config @@ -29,8 +29,12 @@ params { minLen="400" // Maximum merged read length - reads with length equal to the specified max read length will be used to generate uniques and ASVs (safe to set at expected amplicon size to start) maxLen="420" - // Maximum expected error for vsearch merge command - maxEE="1" + // Maximum expected error for vsearch merge command - vsearch discard sequences with more than the specified number of expected errors + maxEE="3" + // Maximum number of non-matching nucleotides allowed in overlap region + diffs="20" + // Maximum number of "N"'s in a sequence - if above the specified value, sequence will be discarded + maxn="20" // Primer Removal parameters From df70d51b531f7fd7782b9a496a9f8cbbd76be274 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 6 Apr 2021 13:18:18 -0500 Subject: [PATCH 104/223] fixed aminoC --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 5534e34..0b04ac4 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2643,7 +2643,7 @@ if (params.DataCheck || params.Analyze) { #entopy analysis entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta #Decomposition - oligotype ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.asvC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + oligotype ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.aminoC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html #generatemaps cd ./${params.projtag}_asvMED_${params.asvC}/OLIGO-REPRESENTATIVES/ echo "AminoType,Group,IDPattern" From b992dd402ef59a07f5511759333af868d56619b5 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 6 Apr 2021 13:20:33 -0500 Subject: [PATCH 105/223] fixed aminomed proc --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 0b04ac4..6f08f3f 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2643,7 +2643,7 @@ if (params.DataCheck || params.Analyze) { #entopy analysis entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta #Decomposition - oligotype ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.aminoC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + oligotype ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_AminoTypeMED_${params.aminoC} -M 1 -c ${params.aminoC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html #generatemaps cd ./${params.projtag}_asvMED_${params.asvC}/OLIGO-REPRESENTATIVES/ echo "AminoType,Group,IDPattern" From bf9c3ccdc81df2b299af9bfd04026d29f2dd08c8 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 6 Apr 2021 13:25:03 -0500 Subject: [PATCH 106/223] fixed again --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 6f08f3f..3af44b5 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2645,7 +2645,7 @@ if (params.DataCheck || params.Analyze) { #Decomposition oligotype ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_AminoTypeMED_${params.aminoC} -M 1 -c ${params.aminoC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html #generatemaps - cd ./${params.projtag}_asvMED_${params.asvC}/OLIGO-REPRESENTATIVES/ + cd ./${params.projtag}_AminoTypeMED_${params.aminoC}/OLIGO-REPRESENTATIVES/ echo "AminoType,Group,IDPattern" j=1 for x in *_unique; From 3af23fa3e716ba34be2abbe1249a8af4edcdc33f Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Thu, 8 Apr 2021 15:16:12 -0500 Subject: [PATCH 107/223] bbtools updated version --- vampirus_env.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vampirus_env.yml b/vampirus_env.yml index 7ecc2be..fa80f48 100644 --- a/vampirus_env.yml +++ b/vampirus_env.yml @@ -19,7 +19,7 @@ dependencies: - mafft=7.464 - vsearch=2.14.2 - biopython=1.76 - - bbmap=38.79 + - bbmap=38.90 - trimal=1.4.1 - cd-hit=4.8.1 - emboss=6.5.7.0 From d300c0f91c4c78a2f59f749f77de23815bcc9b75 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 13 Apr 2021 10:37:52 -0500 Subject: [PATCH 108/223] edits --- README.md | 7 +- vAMPirus.nf | 5450 +++++++++++++++++++++++------------------------ vampirus.config | 2 +- 3 files changed, 2716 insertions(+), 2743 deletions(-) diff --git a/README.md b/README.md index c623462..aae8925 100644 --- a/README.md +++ b/README.md @@ -197,11 +197,11 @@ OR ### Analyze test => - `/path/to/nextflow run /path/to/vAMPirus.nf -c /path/to/vampirus.config -profile conda,test --Analyze --ncASV --pcASV --stats run` + `/path/to/nextflow run /path/to/vAMPirus.nf -c /path/to/vampirus.config -profile conda,test --Analyze --ncASV --pcASV --stats` OR - `nextflow run vAMPirus.nf -c vampirus.config -profile singularity,test --Analyze --ncASV --pcASV --stats run` + `nextflow run vAMPirus.nf -c vampirus.config -profile singularity,test --Analyze --ncASV --pcASV --stats` # Running vAMPirus @@ -209,6 +209,7 @@ OR If you done the setup and confirmed installation success with the test commands, you are good to get going with your own data. Before getting started edit the configuration file with the parameters and other options you plan to use. Here are some example vAMPirus launch commands: + ### DataCheck pipeline => Example 1. Launching the vAMPirus DataCheck pipeline using conda @@ -245,7 +246,7 @@ If an analysis is interrupted, you can use Nextflows "-resume" option that will For example if the analysis launched with the command from Example 6 above was interrupted, all you would need to do is add the "-resume" to the end of the command like so: - `nextflow run vAMPirus.nf -c vampirus.config -profile conda --Analyze --skipAminoTyping --stats run -resume` + `nextflow run vAMPirus.nf -c vampirus.config -profile conda --Analyze --skipAminoTyping --stats -resume` # Who to cite: diff --git a/vAMPirus.nf b/vAMPirus.nf index 3af44b5..4542133 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -33,7 +33,7 @@ def helpMessage() { Usage: - nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] [--asvMED] [--aminoMED] [--stats] + nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] --Help options-- @@ -57,12 +57,6 @@ def helpMessage() { --pcASV Set this option to have vAMPirus cluster nucleotide and translated ASVs into protein-based operational taxonomic units (pcASVs) - See options below to define a single percent similarity or a list - --Minimum Entropy Decomposition arguments-- - - --asvMED Set this option to perform Minimum Entropy Decomposition on ASV sequences, see manual for more information. You will need to set a value for --asvC to perform this analysis - - --amino_med Set this option to perform Minimum Entropy Decomposition on AminoType sequences, see manual for more information. You will need to set a value for --aminoC to perform this analysis - --Skip options-- --skipReadProcessing Set this option to skip all read processing steps in the pipeline @@ -71,9 +65,7 @@ def helpMessage() { --skipAdapterRemoval Set this option to skip adapter removal in the pipeline - --skipPrimerRemoval Set this option to skip primer removal process - - --skipMerging Set this option to skip read merging + --skipPrimerRemoval Set this option to skup Skip primer removal process --skipAminoTyping Set this option to skip AminoTyping processes @@ -81,10 +73,6 @@ def helpMessage() { --skipPhylogeny Set this option to skip phylogeny processes - --skipEMBOSS Set this option to skip EMBOSS processes - - --skipReport Set this option to skip html report generation - **NOTE** Most opitons below can be set using the configuration file (vampirus.config) to avoid a lengthy launch command. --Project/analysis information-- @@ -152,11 +140,6 @@ def helpMessage() { --minAA With --pcASV set, use this option to set the expected or minimum amino acid sequence length of open reading frames within your amplicon sequences - --Minimum Entropy Decomposition-- - - --asvC Number of high entropy positions to use for ASV MED analysis and generate "Groups" - - --aminoC Number of high entropy positions to use for AminoType MED analysis and generate "Groups" --Counts table generation-- @@ -175,11 +158,7 @@ def helpMessage() { --dbdir Path to Directory where database is being stored - --headers Set taxonomy database header format -> headers= "RefSeq" to toggle use of RefSeq header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers - - --dbanno Path to directory hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. - - --lca Set --lca T if you would like to add taxonomic classification to taxonomy results - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" + --refseq Set "--refseq T" to toggle use of RefSeq header format; default is "F" to use Reverence Viral DataBase (RVDB) header --bitscore Set minimum bitscore to allow for best hit in taxonomy assignment @@ -226,208 +205,186 @@ def fullHelpMessage() { THIS IS A LONGER HELP WITH USAGE EXAMPLES vAMPirus v${workflow.manifest.version} ============================================================================================================================================================================================== - Steps: - 1- Before launching the vAMPirus.nf, be sure to run the vampirus_startup.sh script to install dependencies and/or databases - - 2- Test the vAMPirus installation with the provided test dataset (if you have ran the start up script, you can see STARTUP_HELP.txt for test commands and other examples) - - 3. Edit parameters in vampirus.config file - - 4. Launch the DataCheck pipeline to get summary information about your dataset - - 5. Change any parameters in vampirus.config file that might aid your analysis (e.g. clustering ID, maximum merged read length) - - 6. Launch the Analyze pipeline to perform a comprehensive analysis with your dataset - - 7. Explore results directories and produced final reports + Steps: + 1- Before launching the vAMPirus.nf, be sure to run the vampirus_startup.sh script to install dependencies and/or databases + 2- Test the vAMPirus installation with the provided test dataset (if you have ran the start up script, you can see STARTUP_HELP.txt for test commands and other examples) - Usage: + 3. Edit parameters in vampirus.config file - nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] + 4. Launch the DataCheck pipeline to get summary information about your dataset + 5. Change any parameters in vampirus.config file that might aid your analysis (e.g. clustering ID, maximum merged read length) - --Help options-- + 6. Launch the Analyze pipeline to perform a comprehensive analysis with your dataset - --help Print help information + 7. Explore results directories and produced final reports - --fullHelp Print even more help information + Usage: - --Mandatory arguments (choose one)-- + nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] - --Analyze Run absolutely everything - --DataCheck Assess how data performs with during processing and clustering + --Help options-- + --help Print help information - --ASV clustering arguments-- + --fullHelp Print even more help information - --ncASV Set this option to have vAMPirus cluster nucleotide amplicon sequence variants (ASVs) into nucleotide-based operational taxonomic units (ncASVs) - See options below to define a single percent similarity or a list - --pcASV Set this option to have vAMPirus cluster nucleotide and translated ASVs into protein-based operational taxonomic units (pcASVs) - See options below to define a single percent similarity or a list + --Mandatory arguments (choose one)-- + --Analyze Run absolutely everything - --Minimum Entropy Decomposition arguments-- + --DataCheck Assess how data performs with during processing and clustering - --asvMED Set this option to perform Minimum Entropy Decomposition on ASV sequences, see manual for more information. You will need to set a value for --asvC to perform this analysis - --amino_med Set this option to perform Minimum Entropy Decomposition on AminoType sequences, see manual for more information. You will need to set a value for --aminoC to perform this analysis + --ASV clustering arguments-- - --Skip options-- + --ncASV Set this option to have vAMPirus cluster nucleotide amplicon sequence variants (ASVs) into nucleotide-based operational taxonomic units (ncASVs) - See options below to define a single percent similarity or a list - --skipReadProcessing Set this option to skip all read processing steps in the pipeline + --pcASV Set this option to have vAMPirus cluster nucleotide and translated ASVs into protein-based operational taxonomic units (pcASVs) - See options below to define a single percent similarity or a list - --skipFastQC Set this option to skiip FastQC steps in the pipeline - --skipAdapterRemoval Set this option to skip adapter removal in the pipeline + --Skip options-- - --skipPrimerRemoval Set this option to skip primer removal process + --skipReadProcessing Set this option to skip all read processing steps in the pipeline - --skipMerging Set this option to skip read merging + --skipFastQC Set this option to skiip FastQC steps in the pipeline - --skipAminoTyping Set this option to skip AminoTyping processes + --skipAdapterRemoval Set this option to skip adapter removal in the pipeline - --skipTaxonomy Set this option to skip taxonomy assignment processes + --skipPrimerRemoval Set this option to skup Skip primer removal process - --skipPhylogeny Set this option to skip phylogeny processes + --skipAminoTyping Set this option to skip AminoTyping processes - --skipEMBOSS Set this option to skip EMBOSS processes + --skipTaxonomy Set this option to skip taxonomy assignment processes - --skipReport Set this option to skip html report generation + --skipPhylogeny Set this option to skip phylogeny processes + **NOTE** Most opitons below can be set using the configuration file (vampirus.config) to avoid a lengthy launch command. - **NOTE** Most opitons below can be set using the configuration file (vampirus.config) to avoid a lengthy launch command. + --Project/analysis information-- - --Project/analysis information-- + --projtag Set project name to be used as a prefix for output files - --projtag Set project name to be used as a prefix for output files + --metadata Set path to metadata spreadsheet file to be used for report generation (must be defined if generating report) - --metadata Set path to metadata spreadsheet file to be used for report generation (must be defined if generating report) + --reads Path to directory containing read libraries, must have *R{1,2}* in the library names - --reads Path to directory containing read libraries, must have *R{1,2}* in the library names + --workingdir Path to working directory where Nextflow will put all Nextflow and vAMPirus generated output files - --workingdir Path to working directory where Nextflow will put all Nextflow and vAMPirus generated output files + --outdir Name of results directory containing all output from the chosen pipeline (will be made within the working directory) - --outdir Name of results directory containing all output from the chosen pipeline (will be made within the working directory) + --Merged read length filtering-- - --Merged read length filtering-- + --minLen Minimum merged read length - reads below the specified maximum read length will be used for counts only - --minLen Minimum merged read length - reads below the specified maximum read length will be used for counts only + --maxLen Maximum merged read length - reads with length equal to the specified max read length will be used to identifying unique sequences and subsequent Amplicon Sequence Variant (ASV) analysis - --maxLen Maximum merged read length - reads with length equal to the specified max read length will be used to identifying unique sequences and subsequent Amplicon Sequence Variant (ASV) analysis + --maxEE Use this option to set the maximum expected error rate for vsearch merging. Default is 1. - --maxEE Use this option to set the maximum expected error rate for vsearch merging. Default is 1. + --Primer removal-- - --Primer removal-- + General primer removal parameters - General primer removal parameters + --primerLength Use this option to set the max primer length to restrict bbduk.sh primer trimming to the first x number of bases - --primerLength Use this option to set the max primer length to restrict bbduk.sh primer trimming to the first x number of bases + --maxkmer Maximum kmer length for bbduk.sh to use for primer detection and removal (must be shorter than your primer length; default = 13) - --maxkmer Maximum kmer length for bbduk.sh to use for primer detection and removal (must be shorter than your primer length; default = 13) + --minkmer Minimum kmer length for primer removal (default = 3) - --minkmer Minimum kmer length for primer removal (default = 3) + --minilen Minimum read length after adapter and primer removal (default = 200) - --minilen Minimum read length after adapter and primer removal (default = 200) + Single primer set removal- - Single primer set removal- + --GlobTrim Set this option to perform global trimming to reads to remove primer sequences. Example usage "--GlobTrim #basesfromforward,#basesfromreverse" - --GlobTrim Set this option to perform global trimming to reads to remove primer sequences. Example usage "--GlobTrim #basesfromforward,#basesfromreverse" + --fwd Forward primer sequence for reads to be detected and removed from reads (must specify reverse sequence if providing forward) - --fwd Forward primer sequence for reads to be detected and removed from reads (must specify reverse sequence if providing forward) + --rev Reverse primer sequence for reads to be detected and removed from reads (must specify forward sequence if providing reverse) - --rev Reverse primer sequence for reads to be detected and removed from reads (must specify forward sequence if providing reverse) + Multiple primer set removal- - Multiple primer set removal- + --multi Use this option to signal multiple primer sequence removal within the specified pipeline - --multi Use this option to signal multiple primer sequence removal within the specified pipeline + --primers Use this option to set the path to a fasta file with all of the primer sequences to be detected and removed from reads - --primers Use this option to set the path to a fasta file with all of the primer sequences to be detected and removed from reads + --Amplicon Sequence Variant (ASV) genration and clustering-- - --Amplicon Sequence Variant (ASV) genration and clustering-- + --alpha Alpha value for denoising - the higher the alpha the higher the chance of false positives in ASV generation (1 or 2) - --alpha Alpha value for denoising - the higher the alpha the higher the chance of false positives in ASV generation (1 or 2) + --minSize Minimum size or representation for sequence to be considered in ASV generation - --minSize Minimum size or representation for sequence to be considered in ASV generation + --clusterNuclID With --ncASV set, use this option to set a single percent similarity to cluster nucleotide ASV sequences into ncASVs by [ Example: --clusterNuclID .97 ] - --clusterNuclID With --ncASV set, use this option to set a single percent similarity to cluster nucleotide ASV sequences into ncASVs by [ Example: --clusterNuclID .97 ] + --clusterNuclIDlist With --ncASV set, use this option to perform nucleotide-based clustering of ASVs with a comma separated list of percent similarities [ Example: --clusterNuclIDlist .95,.96,.97,.98 ] - --clusterNuclIDlist With --ncASV set, use this option to perform nucleotide clustering with a comma separated list of percent similarities [ Example: --clusterNuclIDlist .95,.96,.97,.98 ] + --clusterAAID With --pcASV set, use this option to set a single percent similarity for protein-based ASV clustering to generate pcASVs[ Example: --clusterAAID .97 ] - --clusterAAID With --pcASV set, use this option to set a single percent similarity for protein-based ASV clustering to generation pcASVs [ Example: --clusterAAID .97 ] + --clusterAAIDlist With --pcASV set, use this option to perform protein-based ASV clustering to generate pcASVs with a comma separated list of percent similarities [ Example: --clusterAAIDlist .95,.96,.97,.98 ] - --clusterAAIDlist With --pcASV set, use this option to perform protein-based ASV clustering to generate pcASVs with a comma separated list of percent similarities [ Example: --clusterAAIDlist .95,.96,.97,.98 ] + --minAA With --pcASV set, use this option to set the expected or minimum amino acid sequence length of open reading frames within your amplicon sequences - --minAA With --pcASV set, use this option to set the expected or minimum amino acid sequence length of open reading frames within your amplicon sequences - --Minimum Entropy Decomposition-- + --Counts table generation-- - --asvC Number of high entropy positions to use for ASV MED analysis and generate "Groups" + --asvcountID Similarity ID to use for ASV counts - --aminoC Number of high entropy positions to use for AminoType MED analysis and generate "Groups" + --ProtCountID Minimum amino acid sequence similarity for hit to count - --Counts table generation-- + --ProtCountsLength Minimum alignment length for hit to count - --asvcountID Similarity ID to use for ASV counts + --ProtCountsBit Minimum bitscore for hit to be counted - --ProtCountID Minimum amino acid sequence similarity for hit to count - --ProtCountsLength Minimum alignment length for hit to count + --Taxonomy inference parameters-- - --ProtCountsBit Minimum bitscore for hit to be counted + --dbname Specify name of database to use for analysis + --dbdir Path to Directory where database is being stored - --Taxonomy inference parameters-- + --refseq Set "--refseq T" to toggle use of RefSeq header format; default is "F" to use Reverence Viral DataBase (RVDB) header - --dbname Specify name of database to use for analysis + --bitscore Set minimum bitscore to allow for best hit in taxonomy assignment - --dbdir Path to Directory where database is being stored + --minID Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment - --headers Set taxonomy database header format -> headers= "RefSeq" to toggle use of RefSeq header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers + --minaln Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment - --dbanno Path to directory hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. - --lca Set --lca T if you would like to add taxonomic classification to taxonomy results - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" + --Phylogeny analysis parameters-- - --bitscore Set minimum bitscore to allow for best hit in taxonomy assignment + Setting customs options for IQ-TREE (Example: "-option1 A -option2 B -option3 C -option4 D") - might be easier to set in the vampirus.config file at lines 108/109 - --minID Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment + --iqCustomnt Use option to set custom options to use in all IQTREE analyses with nuceoltide sequences - --minaln Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment + --iqCustomaa Use option to set custom options to use in all IQTREE analyses with amino acid sequences + These options below you can set at the command, for example, to set to use model from ModelTest-NG with parametric bootstrapping --ModelTnt --ModelTaa --parametric - --Phylogeny analysis parameters-- + --ModelTnt=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with nuceoltide sequences (Default is IQ-TREE will do automatic model testing with ModelFinder Plus) - Setting customs options for IQ-TREE (Example: "-option1 A -option2 B -option3 C -option4 D") - might be easier to set in the vampirus.config file at lines 108/109 + --ModelTaa=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with amino acid sequences - --iqCustomnt Use option to set custom options to use in all IQTREE analyses with nuceoltide sequences + --parametric Set to use parametric bootstrapping in IQTREE analyses - --iqCustomaa Use option to set custom options to use in all IQTREE analyses with amino acid sequences + --nonparametric Set to use parametric bootstrapping in IQTREE analyses - These options below you can set at the command, for example, to set to use model from ModelTest-NG with parametric bootstrapping --ModelTnt --ModelTaa --parametric + --boots Number of bootstraps (recommended 1000 for parametric and 100 for non-parametric) - --ModelTnt=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with nuceoltide sequences (Default is IQ-TREE will do automatic model testing with ModelFinder Plus) - --ModelTaa=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with amino acid sequences + --Statistics options-- - --parametric Set to use parametric bootstrapping in IQTREE analyses + --stats Set "--stats run" to signal statstical tests to be performed and included in the final report - --nonparametric Set to use parametric bootstrapping in IQTREE analyses + --minimumCounts Minimum number of hit counts for a sample to have to be included in the downstream statistical analyses and report generation - --boots Number of bootstraps (recommended 1000 for parametric and 100 for non-parametric) - - - --Statistics options-- - - --stats Set "--stats run" to signal statstical tests to be performed and included in the final report - - --minimumCounts Minimum number of hit counts for a sample to have to be included in the downstream statistical analyses and report generation - - --trymax Maximum number of iterations performed by metaMDS + --trymax Maximum number of iterations performed by metaMDS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| @@ -457,7 +414,7 @@ def fullHelpMessage() { Example 4. Launching the vAMPirus Analyze pipeline with singularity with ASV and AminoType generation with all accesory analyses (taxonomy assignment, EMBOSS, IQTREE, statistics) - nextflow run vAMPirus.nf -c vampirus.config -profile singularity --Analyze --stats + nextflow run vAMPirus.nf -c vampirus.config -profile singularity --Analyze --stats run Example 5. Launching the vAMPirus Analyze pipeline with conda to perform multiple primer removal and protein-based clustering of ASVs, but skip most of the extra analyses @@ -465,11 +422,7 @@ def fullHelpMessage() { Example 6. Launching vAMPirus Analyze pipeline with conda to produce only ASV-related results - nextflow run vAMPirus.nf -c vampirus.config -profile conda --Analyze --skipAminoTyping --stats - - Example 7. Launching vAMPirus Analyze pipeline with conda to perform ASV analyses with Minimum Entropy Decomposition to form "Groups" - - nextflow run vAMPirus.nf -c vampirus.config -profile conda --Analyze --skipAminoTyping --stats --asvMED --asvC 24 + nextflow run vAMPirus.nf -c vampirus.config -profile conda --Analyze --skipAminoTyping --stats run Resuming analyses => @@ -492,6 +445,7 @@ if (params.help) { exit 0 } +// This will be printed to the user in each run. here thy can check if the values the selected are fine log.info """\ ================================================================================================================================================ vAMPirus v${workflow.manifest.version} - Virus Amplicon Sequencing Analysis Pipeline @@ -509,35 +463,15 @@ if (params.readsTest) { Channel .fromFilePairs(params.readsTest) .ifEmpty{ exit 1, "params.readTest was empty - no input files supplied" } - .into{ reads_ch; reads_qc_ch; reads_processing } + .into{ reads_ch; reads_qc_ch } } else { println("\n\tEverything ready for launch.\n") Channel .fromFilePairs("${params.reads}", checkIfExists: true) - .into{ reads_ch; reads_qc_ch; reads_processing } -} - -if (params.clusterNuclIDlist == "") { - a=params.clusterNuclID - slist=[a] - nnuc=slist.size() -} else { - msize=params.clusterNuclIDlist - slist=msize.split(',').collect{it as int} - nnuc=slist.size() -} - -if (params.clusterAAIDlist == "") { - b=params.clusterAAID - slist2=[b] - naa=slist2.size() -} else { - msize2=params.clusterAAIDlist - slist2=msize2.split(',').collect{it as int} - naa=slist2.size() + .into{ reads_ch; reads_qc_ch } } -if (params.DataCheck || params.Analyze) { +if (params.Analyze) { println("\n\tRunning vAMPirus Analyze pipeline - This might take a while, check out Nextflow tower (tower.nf) to remotely monitor the run.\n") @@ -596,7 +530,7 @@ if (params.DataCheck || params.Analyze) { } } - if (!params.skipReadProcessing || !params.skipMerging ) { + if (!params.skipReadProcessing) { if (!params.skipFastQC) { @@ -606,13 +540,13 @@ if (params.DataCheck || params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/FastQC/PreClean", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/FastQC/PreClean", mode: "copy", overwrite: true input: tuple sample_id, file(reads) from reads_qc_ch output: - tuple sample_id, file("*_fastqc.{zip,html}") into fastqc_results + tuple sample_id, file("*_fastqc.{zip,html}") into fastqc_results_OAS script: """ @@ -629,8 +563,8 @@ if (params.DataCheck || params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/AdapterRemoval", mode: "copy", overwrite: true, pattern: "*.filter.fq" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/AdapterRemoval/fastpOut", mode: "copy", overwrite: true, pattern: "*.fastp.{json,html}" + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/AdapterRemoval", mode: "copy", overwrite: true, pattern: "*.filter.fq" + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/AdapterRemoval/fastpOut", mode: "copy", overwrite: true, pattern: "*.fastp.{json,html}" input: tuple sample_id, file(reads) from reads_ch @@ -638,7 +572,7 @@ if (params.DataCheck || params.Analyze) { output: tuple sample_id, file("*.fastp.{json,html}") into fastp_results tuple sample_id, file("*.filter.fq") into reads_fastp_ch - file("*.csv") into ( fastp_csv_in1, fastp_csv_in2 ) + file("*.csv") into fastp_csv script: """ @@ -655,7 +589,6 @@ if (params.DataCheck || params.Analyze) { reads_ch .set{ reads_fastp_ch } fastp_results = Channel.empty() - } if (!params.skipPrimerRemoval) { @@ -666,7 +599,7 @@ if (params.DataCheck || params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/PrimerRemoval", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/PrimerRemoval", mode: "copy", overwrite: true input: tuple sample_id, file(reads) from reads_fastp_ch @@ -703,10 +636,9 @@ if (params.DataCheck || params.Analyze) { } else { reads_fastp_ch .set{ reads_bbduk_ch } - } - if (!params.skipFastQC && !params.skipPrimerRemoval) { + if (!params.skipFastQC) { process QualityCheck_2 { @@ -714,13 +646,13 @@ if (params.DataCheck || params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/FastQC/PostClean", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/FastQC/PostClean", mode: "copy", overwrite: true input: tuple sample_id, file(reads) from readsforqc2 output: - tuple sample_id, file("*_fastqc.{zip,html}") into fastqc2_results + tuple sample_id, file("*_fastqc.{zip,html}") into fastqc2_results_OAS script: """ @@ -728,50 +660,38 @@ if (params.DataCheck || params.Analyze) { """ } } - } else { - reads_ch - .set{ reads_bbduk_ch } - } - if (!params.skipMerging) { - - process Read_Merging { - - label 'norm_cpus' + process Read_Merging { - tag "${sample_id}" + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Individual", mode: "copy", overwrite: true, pattern: "*mergedclean.fastq" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Individual/notmerged", mode: "copy", overwrite: true, pattern: "*notmerged*.fastq" + tag "${sample_id}" - input: - tuple sample_id, file(reads) from reads_bbduk_ch + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Individual", mode: "copy", overwrite: true, pattern: "*mergedclean.fastq" + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Individual/notmerged", mode: "copy", overwrite: true, pattern: "*notmerged*.fastq" - output: - file("*_mergedclean.fastq") into reads_vsearch1_ch - file("*.name") into names - file("*notmerged*.fastq") into notmerged + input: + tuple sample_id, file(reads) from reads_bbduk_ch - script: - """ - vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxdiffs ${params.diffs} --fastq_maxns ${params.maxn} --fastq_allowmergestagger --fastq_maxee ${params.maxEE} --relabel ${sample_id}. - echo ${sample_id} > ${sample_id}.name - """ + output: + file("*_mergedclean.fastq") into reads_vsearch1_ch + file("*.name") into names + file("*notmerged*.fastq") into notmerged - } + script: + """ + vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxee ${params.maxEE} --relabel ${sample_id}. + echo ${sample_id} > ${sample_id}.name + """ - } else { - reads_bbduk_ch - .set{ reads_vsearch1_ch } } - - process Filtering_Prep1 { + process Compile_Reads { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true input: file(reads) from reads_vsearch1_ch @@ -786,11 +706,11 @@ if (params.DataCheck || params.Analyze) { """ } - process Filtering_Prep2 { + process Compile_Names { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging", mode: "copy", overwrite: true input: file(names) from names @@ -806,78 +726,39 @@ if (params.DataCheck || params.Analyze) { } - process Length_Filtering { + process Length_Filtering { //changed label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" input: file(reads) from collect_samples_ch output: - file("*_merged_preFilt_clean.fastq") into ( mergeforprotcounts, mergeforpcASVaacounts ) - - file("*_merged_preFilt_clean.fasta") into ( nuclCounts_mergedreads_asv_ch, nuclCounts_mergedreads_ncasv_ch, pcASV_mergedreads_ch ) + file("*_merged_preFilt_clean.fasta") into ( nuclCounts_mergedreads_ch, pcASV_mergedreads_ch ) file("*_merged_clean_Lengthfiltered.fastq") into reads_vsearch2_ch - - file("*preFilt_preClean_baseFrequency_hist.csv") into prefilt_basefreq - file("*preFilt_preClean_qualityScore_hist.csv") into prefilt_qualityscore - file("*preFilt_preClean_gcContent_hist.csv") into prefilt_gccontent - file("*preFilt_preClean_averageQuality_hist.csv") into prefilt_averagequality - file("*preFilt_preClean_length_hist.csv") into prefilt_length - - file("*postFilt_baseFrequency_hist.csv") into postFilt_basefreq - file("*postFilt_qualityScore_hist.csv") into postFilt_qualityscore - file("*postFilt_gcContent_hist.csv") into postFilt_gccontent - file("*postFilt_averageQuaulity_hist.csv") into postFilt_averagequality - file("*postFilt_length_hist.csv") into postFilt_length - - file("reads_per_sample_preFilt_preClean.csv") into reads_per_sample_preFilt - file("read_per_sample_postFilt_postClean.csv") into reads_per_sample_postFilt + file("*_merged_preFilt_clean.fastq") into ( mergeforprotcounts, mergeforpcASVaacounts ) + file("**hist.txt") into histos script: """ - #bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt__preClean_length_hist.txt gcbins=auto - #fastp -i ${reads} -o ${params.projtag}_merged_preFilt_clean.fastq -b ${params.maxLen} -l ${params.minLen} --thread ${task.cpus} -n 1 - #reformat.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_preFilt_clean.fasta t=${task.cpus} - #bbduk.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fastq minlength=${params.maxLen} maxlength=${params.maxLen} t=${task.cpus} - #bbduk.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq bhist=${params.projtag}_all_merged_postFilt_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_postFilt_qualityScore_hist.txt gchist=${params.projtag}_all_merged_postFilt_gcContent_hist.txt aqhist=${params.projtag}_all_merged_postFilt_averageQuaulity_hist.txt lhist=${params.projtag}_all_merged_postFilt_length_hist.txt gcbins=auto - - # from DC - bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt_preClean_length_hist.txt gcbins=auto - for x in *preFilt*hist.txt;do - pre=\$(echo \$x | awk -F ".txt" '{print \$1}') - cat \$x | tr "\t" "," > \${pre}.csv - rm \$x - done - reformat.sh in=${reads} out=${params.projtag}_preFilt_preclean.fasta t=${task.cpus} - echo "sample,reads" >> reads_per_sample_preFilt_preClean.csv - grep ">" ${params.projtag}_preFilt_preclean.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> reads_per_sample_preFilt_preClean.csv - rm ${params.projtag}_preFilt_preclean.fasta + bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt__preClean_length_hist.txt gcbins=auto fastp -i ${reads} -o ${params.projtag}_merged_preFilt_clean.fastq -b ${params.maxLen} -l ${params.minLen} --thread ${task.cpus} -n 1 reformat.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_preFilt_clean.fasta t=${task.cpus} bbduk.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fastq minlength=${params.maxLen} maxlength=${params.maxLen} t=${task.cpus} bbduk.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq bhist=${params.projtag}_all_merged_postFilt_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_postFilt_qualityScore_hist.txt gchist=${params.projtag}_all_merged_postFilt_gcContent_hist.txt aqhist=${params.projtag}_all_merged_postFilt_averageQuaulity_hist.txt lhist=${params.projtag}_all_merged_postFilt_length_hist.txt gcbins=auto - for x in *postFilt*hist.txt;do - pre=\$(echo \$x | awk -F ".txt" '{print \$1}') - cat \$x | tr "\t" "," > \${pre}.csv - rm \$x - done - reformat.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fasta t=${task.cpus} - echo "sample,reads" >> read_per_sample_postFilt_postClean.csv - grep ">" ${params.projtag}_merged_clean_Lengthfiltered.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> read_per_sample_postFilt_postClean.csv - """ + """ } - process Extracting_Uniques { + process Extract_Uniques { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Uniques", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Uniques", mode: "copy", overwrite: true input: file(reads) from reads_vsearch2_ch @@ -919,7 +800,7 @@ if (params.DataCheck || params.Analyze) { file(fasta) from reads_vsearch4_ch output: - file("*ASVs.fasta") into ( reads_vsearch5_ch, asv_med, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) + file("*ASVs.fasta") into ( reads_vsearch5_ch, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) script: """ @@ -929,448 +810,73 @@ if (params.DataCheck || params.Analyze) { // UNTIL HERE DEFAULT - if (params.DataCheck) { - - process NucleotideBased_ASV_clustering_DC { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Nucleotide", mode: "copy", overwrite: true, pattern: '*{.csv}' - - input: - file(fasta) from reads_vsearch5_ch - - output: - file("number_per_percentage_nucl.csv") into number_per_percent_nucl_plot - - script: - if (params.datacheckntIDlist) { - """ - for id in `echo ${params.datacheckntIDlist} | tr "," "\\n"`;do - vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel OTU --id \${id} - done - for x in *ncASV*.fasta;do - id=\$( echo \$x | awk -F "_ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - numb=\$( grep -c ">" \$x ) - echo "\${id},\${numb}" >> number_per_percentage_nucl.csv - done - yo=\$(grep -c ">" ${fasta}) - echo "1.0,\${yo}" >> number_per_percentage_nucl.csv - """ - } - } - - process Translation_For_ProteinBased_Clustering_DC { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true - - input: - file(fasta) from nucl2aa - - output: - file("*ASVprotforclust.fasta") into clustering_aa - file("*_translation_report") into reportaa_VR - file("*_ASV_all.fasta") into asvfastaforaaclust - - script: - """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report - cp ${fasta} ${params.projtag}_ASV_all.fasta - """ - } + if (params.ncASV) { - process Protein_clustering_DC { + process NucleotideBased_ASV_clustering { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid", mode: "copy", overwrite: true, pattern: '*{.csv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ncASV", mode: "copy", overwrite: true, pattern: '*ncASV*.fasta' input: - file(fasta) from clustering_aa - file(asvs) from asvfastaforaaclust + file(fasta) from reads_vsearch5_ch output: - file("number_per_percentage_prot.csv") into number_per_percent_prot_plot - file("*aminoacid_pcASV1.0_noTaxonomy.fasta") into amino_med + tuple file("*_ncASV*.fasta"), file("*ASV.fasta") into ( nuclFastas_forDiamond_ch, nuclFastas_forCounts_ch, nuclFastas_forMatrix_ch) + tuple file("*_ncASV*.fasta"), file("*ASV.fasta") into nuclFastas_forphylogeny + script: - // add awk script to count seqs + if (params.clusterNuclIDlist) { """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - for id in `echo ${params.datacheckaaIDlist} | tr "," "\\n"`;do - if [ \${id} == ".55" ];then - word=3 - elif [ \${id} == ".65" ];then - word=4 - else - word=5 - fi - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -n \${word} -c \${id} -o ${params.projtag}_pcASV\${id}.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr - grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list - y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) - echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr - t=1 - b=1 - for x in \$(cat temporaryclusters.list);do - echo "Extracting \$x" - name="\$( echo \$x | awk -F ">" '{print \$2}')" - clust="pcASV"\${t}"" - echo "\${name}" - awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list - t=\$(( \${t}+1 )) - b=\$(( \${b}+1 )) - done - ls *_tmp.list - u=1 - for x in *_tmp.list;do - name="\$(echo \$x | awk -F "_p" '{print \$1}')" - echo "\${name}" - cluster="\$(echo \$x | awk -F "_" '{print \$3}')" - echo "\${cluster}" - grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list - seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta - vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta - grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list - for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do - echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders - u=\$(( \${u}+1 )) - done - u=1 - ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta - done - cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv - ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta - stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true - stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta - else - rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta - fi - rm *.list - rm Cluster* - rm *types* - rm *tmp* - rm ${params.projtag}_pcASV\${id}.fast* + cp ${fasta} ./${params.projtag}_ASV.fasta + for id in `echo ${params.clusterNuclIDlist} | tr "," "\\n"`;do + vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id \${id} done - for x in *aminoacid*noTaxonomy.fasta;do - id=\$( echo \$x | awk -F "_noTax" '{print \$1}' | awk -F "pcASV" '{print \$2}') - numb=\$( grep -c ">" \$x) - echo "\${id},\${numb}" >> number_per_percentage_protz.csv - done - yesirr=\$( wc -l number_per_percentage_protz.csv | awk '{print \$1}') - tail -\$(( \${yesirr}-1 )) number_per_percentage_protz.csv > number_per_percentage_prot.csv - head -1 number_per_percentage_protz.csv >> number_per_percentage_prot.csv - rm number_per_percentage_protz.csv """ - } - - process ASV_Shannons_Entropy_Analysis { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Nucleotide/ShannonEntropy", mode: "copy", overwrite: true - - input: - file(asvs) from asv_med - - output: - - file("*_ASV_entropy_breakdown.csv") into asv_entro_csv - file("*Aligned_informativeonly.fasta-ENTROPY") into asv_entropy - file("*ASV*") into entrop - - script: - """ - set +e - #alignment - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_mafftAlign.fasta - #trimming - trimal -in ${params.projtag}_ASVs_mafftAlign.fasta -out ${params.projtag}_ASVs_mafftAligned.fasta -keepheader -fasta -automated1 - rm ${params.projtag}_ASVs_mafftAlign.fasta - o-trim-uninformative-columns-from-alignment ${params.projtag}_ASVs_mafftAligned.fasta - mv ${params.projtag}_ASVs_mafftAligned.fasta-TRIMMED ./${params.projtag}_ASVs_Aligned_informativeonly.fasta - #entopy analysis - entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta - #summarize entropy peaks - awk '{print \$2}' ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list - for x in \$(cat tmp_value.list) - do echo "\$x" - if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; - then echo dope >> above-0.0-.list - fi - if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; - then echo dope >> above-0.1-.list - fi - if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; - then echo dope >> above-0.2-.list - fi - if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; - then echo dope >> above-0.3-.list - fi - if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; - then echo dope >> above-0.4-.list - fi - if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; - then echo dope >> above-0.5-.list - fi - if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; - then echo dope >> above-0.6-.list - fi - if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; - then echo dope >> above-0.7-.list - fi - if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; - then echo dope >> above-0.8-.list - fi - if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; - then echo dope >> above-0.9-.list - fi - if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; - then echo dope >> above-1.0-.list - fi - if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; - then echo dope >> above-1.5-.list - fi - done - echo "Entropy,Peaks_above" >> ${params.projtag}_ASV_entropy_breakdown.csv - for z in above*.list; - do entrop=\$(echo \$z | awk -F "-" '{print \$2}') - echo ""\$entrop", "\$(wc -l \$z | awk '{print \$1}')"" >> ${params.projtag}_ASV_entropy_breakdown.csv - done - rm above* - mv ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY ./tmp.fasta - echo "Base_position Shannons_Entropy" >> ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY - cat tmp.fasta >> ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY - rm tmp.fasta - - """ - - } - - process AminoType_Shannons_Entropy_Analysis { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/ShannonEntropy", mode: "copy", overwrite: true, pattern: '*{.csv}' - - input: - file(aminos) from amino_med - - output: - file("*AminoType_entropy_breakdown.csv") into amino_entro_csv - file ("*Aligned_informativeonly.fasta-ENTROPY") into amino_entropy - file("*AminoTypes*") into aminos - - script: - """ - #alignment - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta - #trimming - trimal -in ${params.projtag}_AminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 - rm ${params.projtag}_AminoTypes_mafftAlign.fasta - o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_mafftAligned.fasta - mv ${params.projtag}_AminoTypes_mafftAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta - #entropy analysis - entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta --amino-acid-sequences - #summarize entropy peaks - awk '{print \$2}' ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list - for x in \$(cat tmp_value.list) - do echo "\$x" - if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; - then echo dope >> above-0.0-.list - fi - if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; - then echo dope >> above-0.1-.list - fi - if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; - then echo dope >> above-0.2-.list - fi - if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; - then echo dope >> above-0.3-.list - fi - if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; - then echo dope >> above-0.4-.list - fi - if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; - then echo dope >> above-0.5-.list - fi - if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; - then echo dope >> above-0.6-.list - fi - if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; - then echo dope >> above-0.7-.list - fi - if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; - then echo dope >> above-0.8-.list - fi - if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; - then echo dope >> above-0.9-.list - fi - if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; - then echo dope >> above-1.0-.list - fi - if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; - then echo dope >> above-1.5-.list - fi - done - echo "Entropy,Peaks_above" >> ${params.projtag}_AminoType_entropy_breakdown.csv - for z in above*.list; - do entrop=\$(echo \$z | awk -F "-" '{print \$2}') - echo ""\$entrop", "\$(wc -l \$z | awk '{print \$1}')"" >> ${params.projtag}_AminoType_entropy_breakdown.csv - done - rm above* - mv ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY ./tmp.fasta - echo "Base_position Shannons_Entropy" >> ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY - cat tmp.fasta >> ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY - rm tmp.fasta - """ - } - - if (!params.skipReadProcessing || !params.skipMerging ) { - - process combine_csv_DC { - - input: - file(csv) from fastp_csv_in1 - .collect() - - output: - file("final_reads_stats.csv") into fastp_csv_dc - - script: - """ - cat ${csv} >all_reads_stats.csv - head -n1 all_reads_stats.csv >tmp.names.csv - cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv - cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv - rm tmp.names.csv tmp.reads.stats.csv - """ - - } - } else { - - process skip_combine_csv_DC { - output: - file("filter_reads.txt") into fastp_csv_dc - - script: - """ - echo "Read processing steps skipped." >filter_reads.txt - """ - } - } - - report_dc_in = Channel.create() - fastp_csv_dc.mix( reads_per_sample_preFilt, reads_per_sample_postFilt, prefilt_basefreq, postFilt_basefreq, prefilt_qualityscore, postFilt_qualityscore, prefilt_gccontent, postFilt_gccontent, prefilt_averagequality, postFilt_averagequality, prefilt_length, postFilt_length, number_per_percent_nucl_plot, number_per_percent_prot_plot, amino_entro_csv, amino_entropy, asv_entro_csv, asv_entropy).into(report_dc_in) - - process Report_DataCheck { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Report", mode: "copy", overwrite: true, pattern: '*.{html}' - - input: - file(files) from report_dc_in - .collect() - - output: - file("*.html") into datacheckreport - - script: + } else if (params.clusterNuclID) { """ - cp ${params.vampdir}/bin/vAMPirus_DC_Report.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_DC_Report.Rmd',output_file='${params.projtag}_DataCheck_Report.html')" ${params.projtag} \ - ${params.skipReadProcessing} \ - ${params.skipMerging} \ - ${params.skipAdapterRemoval} + cp ${fasta} ./${params.projtag}_ASV.fasta + id=${params.clusterNuclID} + vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id \${id} """ + } } + } else { + reads_vsearch5_ch + .into{ nuclFastas_forDiamond_ch; nuclFastas_forCounts_ch; nuclFastas_forphylogeny; nuclFastas_forMatrix_ch } + } - } else if (params.Analyze) { + if (!params.skipTaxonomy) { if (params.ncASV) { - reads_vsearch5_ch - .into{ asv_file_for_ncasvs; nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch; asv_for_med } - - process NucleotideBased_ASV_clustering { - - label 'norm_cpus' + process Nucleotide_Taxonomy_Inference { - tag "${mtag}" + label 'high_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ncASV", mode: "copy", overwrite: true, pattern: '*ncASV*.fasta' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy", mode: "copy", overwrite: true, pattern: '*ncASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*ncASV*dmd.out' input: - each x from 1..nnuc - file(fasta) from asv_file_for_ncasvs + tuple file(notus), file(asvs) from nuclFastas_forDiamond_ch output: - tuple nid, file("*_ncASV*.fasta") into ( nuclFastas_forphylogeny_ncasv, nuclFastas_forDiamond_ncasv_ch, nuclFastas_forCounts_ncasv_ch, nuclFastas_forMatrix_ncasv_ch ) + file("*.fasta") into tax_labeled_fasta + tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond + file("*ncASV*summary_for_plot.csv") into taxplot1a + file("*_ASV*_summary_for_plot.csv") into taxplot1 script: - nid=slist.get(x-1) - mtag="ID=" + slist.get(x-1) - """ - vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV${nid}.fasta --threads ${task.cpus} --relabel ncASV --id .${nid} """ - } - - if (!params.skipTaxonomy) { - - if (params.headers == "RefSeq") { - - process ncASV_Taxonomy_Inference_RefSeq { /////// editttt - - label 'high_cpus' - - tag "${mtag}" - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy", mode: "copy", overwrite: true, pattern: '*ncASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*ncASV*dmd.out' - - input: - tuple nid, file(asvs) from nuclFastas_forDiamond_ncasv_ch - - output: - file("*.fasta") into tax_labeled_fasta_ncasv - tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_ncasv - tuple nid, file("*ncASV*summary_for_plot.csv") into taxplot_ncasv - tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_ncasv - - script: - mtag="ID=" + nid - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + for filename in ${notus};do + name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') + diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -1378,14 +884,18 @@ if (params.DataCheck || params.Analyze) { echo "[Percent ID (aa)]" > pid.list echo "[Organism ID]" > "\$name"_virus.list echo "[Gene]" > "\$name"_genes.list - echo "[ncASV#]" > otu.list - echo "[Sequence length]" > length.list - grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst echo "extracting genes and names" touch new_"\$name"_asvnames.txt - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + j=1 + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + echo "[ncASV#]" > otu.list + echo "[ncASV sequence length]" > length.list + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then echo "Yep, there was a hit for \$s" echo "Extracting the information now:" acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') @@ -1401,9 +911,10 @@ if (params.DataCheck || params.Analyze) { echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) echo "\$s done." - else + else echo "Ugh, there was no hit for \$s .." echo "We still love \$s though and we will add it to the final fasta file" echo "\$s" >> otu.list @@ -1416,356 +927,1530 @@ if (params.DataCheck || params.Analyze) { echo "NO_HIT" >> length.list virus="NO" gene="HIT" - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) echo "\$s done." - fi - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloformat.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" + done + fi + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; rm tmpcol.list tmp2col.list done - rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm *asvnames.txt + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: \${filename} " + done + for filename in ${asvs};do + name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') + diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + j=1 + if [ `echo \${filename} | grep -c "ASV"` -eq 1 ];then + for s in \$(cat seqids.lst);do + echo "[ASV#]" > otu.list + echo "[ASV sequence length]" > length.list + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" + done + fi + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm *asvnames.txt + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: \${filename} " + done + rm headers.list + """ + } + + } else { + + process ASV_Taxonomy_Inference { + + label 'high_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' + + input: + file(reads) from nuclFastas_forDiamond_ch + + output: + file("*.fasta") into tax_labeled_fasta + tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond + file("*_ASV*_summary_for_plot.csv") into taxplot1 + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + for filename in ${reads};do + name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') + diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + j=1 + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + echo "[ASV#]" > otu.list + echo "[ASV sequence length]" > length.list + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" + done + else + for s in \$(cat seqids.lst);do + echo "[ASV#]" > otu.list + echo "[ASV sequence length]" > length.list + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" + done + fi + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm *asvnames.txt + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: \${filename} " + done + rm headers.list + """ + } + } + } + + if (params.ncASV) { + + process Generate_Counts_Tables_Nucleotide { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*_ASV*.{biome,csv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Counts", mode: "copy", overwrite: true, pattern: '*ncASV*.{biome,csv}' + + input: + tuple file(notus), file(asvs) from nuclFastas_forCounts_ch + file(merged) from nuclCounts_mergedreads_ch + + output: + tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch + file("*ncASV*counts.csv") into notu_counts_plots + file("*_ASV*counts.csv") into asv_counts_plots + + script: + """ + for filename in ${notus};do + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv + fi + done + if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv + fi + """ + } + } else { + process Generate_ASV_Counts_Tables { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*ASV*.{biome,csv}' + + input: + file(asvs) from nuclFastas_forCounts_ch + file(merged) from nuclCounts_mergedreads_ch + + output: + tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch + file("*_ASV*counts.csv") into asv_counts_plots + + script: + """ + if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv + fi + """ + } + } + + if (params.ncASV) { + + process Generate_Nucleotide_Matrix { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*_ASV*PercentID.matrix' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Matrix", mode: "copy", overwrite: true, pattern: '*ncASV*PercentID.matrix' + + input: + tuple file(notus), file(asvs) from nuclFastas_forMatrix_ch + + output: + file("*.matrix") into clustmatrices + file("*ncASV*PercentID.matrix") into notu_heatmap + file("*_ASV*PercentID.matrix") into asv_heatmap + + script: + // remove if statement later (no fin) + """ + for filename in ${notus};do + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + fi + done + if [ `echo ${asvs} | grep -c "_ASV"` -eq 1 ];then + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + clustalo -i ${asvs} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i ${asvs} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + fi + """ + } + } else { + + process Generate_ASV_Matrix { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*ASV*PercentID.matrix' + + input: + file(reads) from nuclFastas_forMatrix_ch + + output: + file("*.matrix") into clustmatrices + file("*_ASV*PercentID.matrix") into asv_heatmap + + script: + // remove if statement later (no fin) + """ + for filename in ${reads};do + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + else + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + fi + done + """ + } + } + + if (!params.skipPhylogeny) { // need to edit paths + + if (params.ncASV) { + + process Nucleotide_Phylogeny { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ncASV*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ncASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ncASV*iq*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*_ASV*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*_ASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*_ASV*iq*' + + input: + tuple file(notus), file(asvs) from nuclFastas_forphylogeny + + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results + file("*iq.treefile") into nucl_phyl_plot + + script: + """ + for filename in ${notus};do + pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + # Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + fi + done + for filename in ${asvs};do + pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + # Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + done """ - } - } else if (params.headers == "RVDB") { + } + } else { + + process ASV_Phylogeny { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ASV*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' - process ncASV_Taxonomy_Inference_RVDB { /////// editttt + input: + file(asvs) from nuclFastas_forphylogeny + + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results + file("*iq.treefile") into nucl_phyl_plot + + script: + """ + for filename in ${asvs};do + pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + # Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + done + """ + } + } + } - label 'high_cpus' + if (!params.skipAminoTyping) { - tag "${mtag}" + if (params.sing) { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy", mode: "copy", overwrite: true, pattern: '*ncASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*ncASV*dmd.out' + process Translating_For_Aminotypes { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true input: - tuple nid, file(asvs) from nuclFastas_forDiamond_ncasv_ch + file(fasta) from asvsforAminotyping output: - file("*.fasta") into tax_labeled_fasta_ncasv - tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_ncasv - tuple nid, file("*ncASV*summary_for_plot.csv") into taxplot_ncasv - tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_ncasv + file("${params.projtag}_all_translations.fasta") into amintypegen + file("${params.projtag}_translation_report") into proteinstage_vap_report script: - mtag="ID=" + nid """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - echo "[ncASV#]" > otu.list - echo "[Sequence length]" > length.list - grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - if [[ ${params.lca} == "T" ]] - then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list - echo "[Classification]" > classfication.list - else echo "skipped" >> \${name}_quick_Taxbreakdown.csv - echo "[Classification]" > classfication.list - fi - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - for s in \$(cat seqids.lst);do - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') - lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') - echo "\$lcla" >> classfication.list - fi - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ "${params.lca}" == "T" ]] - then echo "N/A" >> classfication.list - fi - echo "\$s done." - fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - if [[ "${params.lca}" == "T" ]] - then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv - else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - fi - for x in *phyloformat.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + conda init && source activate virtualribosome + + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report """ + + } + + } else { + + process Translate_For_AminoTyping { + + label 'low_cpus' + + conda 'python=2.7' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true + + input: + file(fasta) from asvsforAminotyping + + output: + file("${params.projtag}_all_translations.fasta") into amintypegen + file("${params.projtag}_translation_report") into proteinstage_vap_report + + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report + """ + } + + } + + process Generate_AminoTypes { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Problematic", mode: "copy", overwrite: true, pattern: '*problematic*.{fasta}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes", mode: "copy", overwrite: true, pattern: '*AminoTypes_noTaxonomy.{fasta}' + + input: + file(prot) from amintypegen + file(asvs) from asvaminocheck + + output: + tuple file("*.fasta"), file("${params.projtag}_AminoTypes.clstr"), file("${params.projtag}_AminoType_summary_map.csv"), file("${params.projtag}_clustered.gc") into ( supplementalfiles ) + file("${params.projtag}_AminoTypes_noTaxonomy.fasta") into ( aminotypesCounts, aminotypesMafft, aminotypesClustal, aminotypesBlast, aminotypesEmboss ) + + script: + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_filtered_translations.fasta + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_problematic_nucleotides.fasta + else + rm ${params.projtag}_problematic_translations.fasta + fi + cd-hit -i ${params.projtag}_filtered_translations.fasta -c 1.0 -o ${params.projtag}_unlabeled_types.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_unlabeled_types.fasta.clstr >${params.projtag}_AminoTypes.clstr + grep ">Cluster_" ${params.projtag}_AminoTypes.clstr >tmpclusters.list + grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + paste -d"," tmpclusters.list tmphead.list >tmp.info.csv + grep ">" ${params.projtag}_unlabeled_types.fasta >lala.list + j=1 + for x in \$(cat lala.list);do + echo ">${params.projtag}_AminoType\${j}" >>${params.projtag}_aminoheaders.list + echo "\${x},>${params.projtag}_AminoType\${j}" >>tmpaminotype.info.csv + j=\$(( \${j}+1 )) + done + rm lala.list + awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list + for x in \$(cat tmporder.list);do + grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list + done + paste -d "," tmpclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_AminoType_summary_map.csv + rm tmp* + ./rename_seq.py ${params.projtag}_unlabeled_types.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_AminoTypes_noTaxonomy.fasta + stats.sh in=${params.projtag}_AminoTypes_noTaxonomy.fasta gc=${params.projtag}_clustered.gc gcformat=4 + """ + } + + process Generate_AminoType_Matrix { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Matrix", mode: "copy", overwrite: true + + input: + file(prot) from aminotypesClustal + + output: + file("*.matrix") into proclustmatrices + file("*PercentID.matrix") into aminotype_heatmap + + script: + """ + name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') + clustalo -i ${prot} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} + clustalo -i ${prot} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$(( \$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + """ + } + + if (!params.skipEMBOSS) { + + process AminoType_EMBOSS_Analyses { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' + + input: + file(prot) from aminotypesEmboss + + output: + tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into amino_emboss + + script: + """ + name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') + garnier -sequence ${prot} -outfile \${name}_2dStructures.garnier + hmoment -seqall ${prot} -graph svg -plot + mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg + iep -sequence ${prot} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep + mv iep.svg ./"\${name}"_IsoelectricPoint.svg + pepstats -sequence ${prot} -outfile \${name}_ProteinProperties.pepstats + grep ">" ${prot} | awk -F ">" '{print \$2}' > tmpsequence.list + for x in \$(cat tmpsequence.list);do + echo \$x > tmp1.list + seqtk subseq ${prot} tmp1.list > tmp2.fasta + len=\$(tail -1 tmp2.fasta | awk '{print length}') + pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo + mv pepinfo.svg ./"\$x"_PropertiesPlot.svg + cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo + rm "\$x"_PropertiesPlot.pepinfo + pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepnet.svg ./"\$x"_HelicalNet.svg + pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepwheel.svg ./"\$x"_HelicalWheel.svg + rm tmp1.list tmp2.fasta + done + rm tmpsequence.list + """ } + } + + if (!params.skipTaxonomy) { + + process AminoType_Taxonomy_Inference { + + label 'high_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*TaxonomyLabels.fasta' + + input: + file(reads) from aminotypesBlast + + output: + tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond + file("*_summary_for_plot.csv") into taxplot2 + file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 + + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} >> headers.list + headers="headers.list" + name=\$(ls ${reads} | awk -F "_noTaxonomy" '{print \$1}') + diamond blastp -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" >access.list + echo "[pcASV sequence length]" >length.list + echo "[e-value]" >evalue.list + echo "[Bitscore]" >bit.list + echo "[Percent ID (aa)]" >pid.list + echo "[AminoType#]" >otu.list + echo "[Virus ID]" >"\$name"_virus.list + echo "[Gene]" >"\$name"_genes.list + grep ">" ${reads} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + j=1 + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">AminoType\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">AminoType\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >>otu.list + echo "\$acc" >>access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') + echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list + echo ">AminoType\${j}_"\$virus"_"\$gene"" >>new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >>otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">AminoType\${j}_"\$virus"_"\$gene"" >>new_"\$name"_asvnames.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${reads} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst headers.list otu.list ; + rm *asvnames.txt + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: ${reads} " + """ } - } + } + if (!params.skipPhylogeny) { - process Generate_ncASV_Counts_Table { + process AminoType_Phylogeny { label 'norm_cpus' - tag "${mtag}" - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*_ASV*.{biome,csv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Counts", mode: "copy", overwrite: true, pattern: '*ncASV*.{biome,csv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' input: - tuple nid, file(notus) from nuclFastas_forCounts_ncasv_ch - file(merged) from nuclCounts_mergedreads_ncasv_ch + file(prot) from aminotypesMafft output: - tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch_ncasv - tuple nid, file("*ncASV*counts.csv") into notu_counts_plots + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.log"), file("*iq*"), file("*mt*") into alignprot_results + file("*iq.treefile") into amino_rax_plot + + script: + """ + # Protein_Alignment + pre=\$(echo ${prot} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${prot} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + + # Protein_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint + + # Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} + + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } + } + + process Generate_AminoTypes_Counts_Table { + + label 'high_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Counts", mode: "copy", overwrite: true + + input: + file(fasta) from aminotypesCounts + file(merged) from mergeforprotcounts + file(samplist) from samplelist + + output: + tuple file("*_protcounts.csv"), file("*dmd.out") into counts_summary + file("*_protcounts.csv") into aminocounts_plot + + script: + """ + set +e + diamond makedb --in ${fasta} --db ${fasta} + diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_protCounts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 + echo "OTU_ID" >tmp.col1.txt + echo "Generating sample id list" + grep ">" ${fasta} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list + cat otuid.list >> tmp.col1.txt + echo "Beginning them counts tho my g" + for y in \$( cat ${samplist} );do + echo "Starting with \$y now ..." + grep "\$y" ${params.projtag}_protCounts_dmd.out > tmp."\$y".out + echo "Isolated hits" + echo "Created uniq subject id list" + echo "\$y" > "\$y"_col.txt + echo "Starting my counts" + for z in \$(cat otuid.list);do + echo "Counting \$z hits" + echo "grep -wc "\$z" >> "\$y"_col.txt" + grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt + echo "\$z counted" + done + done + paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_protcounts.csv + rm tmp* + rm *col.txt + """ + } + } + + if (params.pcASV) { // ASV_nucl -> ASV_aa -> clusteraa by %id with ch-hit -> extract representative nucl sequences to generate new OTU file + + if (params.sing) { + + process Translating_For_pcASV_Generation { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' + + input: + file(fasta) from nucl2aa + + output: + file("*ASV*translations.fasta") into clustering_aa + file("*_ASV_translations_report") into reportaa_VR + file("*_ASV_nucleotide.fasta") into asvfastaforaaclust + + script: + """ + conda init && source activate virtualribosome + + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report + cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta + """ + + } + + } else { + + process Translation_For_pcASV_Generation { + + label 'low_cpus' + + conda 'python=2.7' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' + + input: + file(fasta) from nucl2aa + + output: + file("*ASV*translations.fasta") into clustering_aa + file("*_ASV_translations_report") into reportaa_VR + file("*_ASV_nucleotide.fasta") into asvfastaforaaclust + + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report + cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta + """ + } + } + + process Generate_pcASVs { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV", mode: "copy", overwrite: true, pattern: '*pcASV*.{fasta}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Problematic", mode: "copy", overwrite: true, pattern: '*problem*.{fasta}' + + input: + file(fasta) from clustering_aa + file(asvs) from asvfastaforaaclust + + output: + file("${params.projtag}_nucleotide_pcASV*.fasta") into ( pcASV_ntDiamond_ch, pcASV_nt_counts_ch, pcASV_ntmatrix_ch, pcASV_ntmafft_ch ) + file("*_aminoacid_pcASV*_noTaxonomy.fasta") into ( pcASV_aaMatrix_ch, pcASV_aaDiamond_ch, pcASV_aaMafft_ch, pcASV_aaCounts_ch, pcASVEMBOSS ) + tuple file("*.fasta"), file("*.clstr"), file("*.csv"), file("*.gc") into ( pcASVsupplementalfiles ) + + script: + // add awk script to count seqs + if (params.clusterAAIDlist) { + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + for id in `echo ${params.clusterAAIDlist} | tr "," "\\n"`;do + awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta + cd-hit -i ${params.projtag}_filtered_proteins.fasta -c \${id} -o ${params.projtag}_pcASV\${id}.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr + grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list + y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) + echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr + t=1 + b=1 + for x in \$(cat temporaryclusters.list);do + echo "Extracting \$x" + name="\$( echo \$x | awk -F ">" '{print \$2}')" + clust="pcASV"\${t}"" + echo "\${name}" + awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list + t=\$(( \${t}+1 )) + b=\$(( \${b}+1 )) + done + ls *_tmp.list + u=1 + for x in *_tmp.list;do + name="\$(echo \$x | awk -F "_p" '{print \$1}')" + echo "\${name}" + cluster="\$(echo \$x | awk -F "_" '{print \$3}')" + echo "\${cluster}" + grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list + seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta + vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta + grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list + for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do + echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders + u=\$(( \${u}+1 )) + done + u=1 + ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta + done + cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv + grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list + j=1 + for x in \$(cat lala.list);do + echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list + echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv + j=\$(( \${j}+1 )) + done + rm lala.list + awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list + for x in \$(cat tmporder.list);do + grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list + done + paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv + ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta + stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true + stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta + else + rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta + fi + rm *.list + rm Cluster* + rm *types* + rm *tmp* + rm ${params.projtag}_pcASV\${id}.fast* + done + """ + } else if (params.clusterAAID) { + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + id=${params.clusterAAID} + awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta + cd-hit -i ${params.projtag}_filtered_proteins.fasta -c ${params.clusterAAID} -o ${params.projtag}_pcASV\${id}.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr + grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list + y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) + echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr + t=1 + b=1 + for x in \$(cat temporaryclusters.list);do + echo "Extracting \$x" + name="\$( echo \$x | awk -F ">" '{print \$2}')" + clust="pcASV"\${t}"" + echo "\${name}" + awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list + t=\$(( \${t}+1 )) + b=\$(( \${b}+1 )) + done - script: - mtag="ID=" + nid - """ - name=\$( echo ${notus} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db ${notus} --id .${nid} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - """ + ls *_tmp.list + u=1 + for x in *_tmp.list;do + name="\$(echo \$x | awk -F "_p" '{print \$1}')" + echo "\${name}" + cluster="\$(echo \$x | awk -F "_" '{print \$3}')" + echo "\${cluster}" + grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list + seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta + vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta + grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list + for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do + echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders + u=\$(( \${u}+1 )) + done + u=1 + ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta + done + cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv + grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list + j=1 + for x in \$(cat lala.list);do + echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list + echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv + j=\$(( \${j}+1 )) + done + rm lala.list + awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list + for x in \$(cat tmporder.list);do + grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list + done + paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv + ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta + stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 + stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta + else + rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta + fi + rm *.list + rm Cluster* + rm *types* + rm *tmp* + rm ${params.projtag}_pcASV\${id}.fast* + """ } + } - process Generate_ncASV_Matrices { - label 'low_cpus' + if (!params.skipTaxonomy) { - tag "${mtag}" + process pcASV_Nucleotide_Taxonomy_Inference { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Matrices", mode: "copy", overwrite: true, pattern: '*ncASV*PercentID.matrix' + label 'high_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' input: - tuple nid, file(asvs) from nuclFastas_forMatrix_ncasv_ch + file(reads) from pcASV_ntDiamond_ch output: - file("*.matrix") into clustmatrices_ncasv - tuple nid, file("*ncASV*PercentID.matrix") into notu_heatmap + file("*.fasta") into ( pcASV_labeled ) + tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond + file("*_summary_for_plot.csv") into taxplot3 script: - mtag="ID=" + nid - """ - name=\$( echo ${asvs}| awk -F ".fasta" '{print \$1}') - clustalo -i ${asvs} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i ${asvs} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - cat \${name}_PercentIDq.matrix | tr " " "," | grep "," >\${name}_PercentID.matrix - rm \${name}_PercentIDq.matrix """ - } - - if (!params.skipPhylogeny) { - - process ncASV_Phylogeny { - - label 'norm_cpus' - - tag "${mtag}" - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ncASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ncASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ncASV*iq*' - - input: - tuple nid, file(asvs) from nuclFastas_forphylogeny_ncasv - - output: - tuple nid, file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_ncasv - tuple nid, file("*iq.treefile") into nucl_phyl_plot_ncasv - - script: - mtag="ID=" + nid - """ - pre=\$(echo ${asvs} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta - mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - fi - """ - } - - } - - } else { - reads_vsearch5_ch - .into{ nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch; asv_for_med } - } - - if (!params.skipTaxonomy) { - - if (params.headers == "RefSeq") { - - process ASV_Taxonomy_Inference_RefSeq { /////// editttt - - label 'high_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' - - input: - file(asvs) from nuclFastas_forDiamond_asv_ch - - output: - file("*.fasta") into tax_labeled_fasta_asv - tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv - file("*_ASV*_summary_for_plot.csv") into taxplot_asv - file("*_quick_Taxbreakdown.csv") into tax_table_asv - - script: - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + set +e + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} >> headers.list + headers="headers.list" + for filename in ${reads};do + name=\$(ls \${filename} | awk -F "_noTax" '{print \$1}') + diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - echo "[ASV#]" > otu.list - echo "[Sequence length]" > length.list - grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + echo "[Best hit accession number]" >access.list + echo "[pcASV sequence length]" >length.list + echo "[e-value]" >evalue.list + echo "[Bitscore]" >bit.list + echo "[Percent ID (aa)]" >pid.list + echo "[pcASV#]" >otu.list + echo "[Virus ID]" >"\$name"_virus.list + echo "[Gene]" >"\$name"_genes.list + grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst echo "extracting genes and names" - touch new_"\$name"_asvnames.txt + touch new_"\$name"_headers.txt + j=1 for s in \$(cat seqids.lst);do echo "Checking for \$s hit in diamond output" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then echo "Yep, there was a hit for \$s" echo "Extracting the information now:" acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') echo "\$s" >> otu.list echo "\$acc" >> access.list line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list echo "Extracting virus and gene ID for \$s now" gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) echo "\$s done." - else + else echo "Ugh, there was no hit for \$s .." echo "We still love \$s though and we will add it to the final fasta file" echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >>otu.list + echo "\$acc" >>access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list + echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >>otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list virus="NO" gene="HIT" - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt + j=\$((\$j+1)) echo "\$s done." - fi + fi + fi + echo "Done with \$s" done echo "Now editing "\$name" fasta headers" ###### rename_seq.py - ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + ./rename_seq.py \${filename} new_"\$name"_headers.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list + cat new_"\$name"_headers.txt >> newnames.list touch sequence.list echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloformat.csv;do + for x in *phyloseqObject.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; @@ -1773,2020 +2458,1307 @@ if (params.DataCheck || params.Analyze) { cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; rm tmpcol.list tmp2col.list done - rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list - """ - } - } else if (params.headers == "RVDB") { - - process ASV_Taxonomy_Inference_RVDB { /////// editttt - - label 'high_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' - - input: - file(asvs) from nuclFastas_forDiamond_asv_ch - - output: - file("*.fasta") into tax_labeled_fasta_asv - tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv - file("*_ASV*_summary_for_plot.csv") into taxplot_asv - file("*_quick_Taxbreakdown.csv") into tax_table_asv - - script: - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - echo "[ASV#]" > otu.list - echo "[Sequence length]" > length.list - grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - if [[ ${params.lca} == "T" ]] - then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list - echo "[Classification]" > classfication.list - else echo "skipped" >> \${name}_quick_Taxbreakdown.csv - echo "[Classification]" > classfication.list - fi - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - for s in \$(cat seqids.lst);do - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') - lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') - echo "\$lcla" >> classfication.list - fi - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ "${params.lca}" == "T" ]] - then echo "N/A" >> classfication.list - fi - echo "\$s done." - fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - if [[ "${params.lca}" == "T" ]] - then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv - else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - fi - for x in *phyloformat.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list - """ - } + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: \${filename} " + done + rm *headers.list + """ } } - process Generate_ASV_Counts_Tables { + process Generate_Nucleotide_pcASV_Counts { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*ASV*.{biome,csv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Counts", mode: "copy", overwrite: true, pattern: '*.{biome,csv,txt}' input: - file(asvs) from nuclFastas_forCounts_asv_ch - file(merged) from nuclCounts_mergedreads_asv_ch + file(potus) from pcASV_nt_counts_ch + file(merged) from pcASV_mergedreads_ch output: - tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch_asv - file("*_ASV*counts.csv") into (asv_counts_plots, asvcount_med) + tuple file("*_counts.txt"), file("*_counts.biome") into pcASVcounts_vsearch + file("*.csv") into potu_Ncounts_for_report script: """ - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db ${asvs} --id .${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv + for filename in ${potus};do + ident=\$( echo \${filename} | awk -F "pcASV" '{print \$2}' | awk -F "_noTaxonomy.fasta" '{print \$1}') + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv + done """ } - process Generate_ASV_Matrices { + process Generate_pcASV_Nucleotide_Matrix { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrices", mode: "copy", overwrite: true, pattern: '*ASV*PercentID.matrix' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Matrix", mode: "copy", overwrite: true input: - file(reads) from nuclFastas_forMatrix_asv_ch + file(potus) from pcASV_ntmatrix_ch output: - file("*.matrix") into clustmatrices_asv - file("*_ASV*PercentID.matrix") into asv_heatmap - - script: - // remove if statement later (no fin) - """ - for filename in ${reads};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - else - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - fi - done - """ - } - - if (!params.skipPhylogeny) { // need to edit paths - - process ASV_Phylogeny { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' - - input: - file(asvs) from nuclFastas_forphylogeny_asv - - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_asv - file("*iq.treefile") into (nucl_phyl_plot_asv, asvphy_med) - - script: - """ - pre=\$(echo ${asvs} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta - mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ - } - } - - if (params.asvMED) { - - process ASV_Minimum_Entropy_Decomposition { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASVs/MED", mode: "copy", overwrite: true - - input: - file(asvs) from asv_for_med - - output: - file("*_ASV_Grouping.csv") into asvgroupscsv - file("${params.projtag}_ASV_group_reps_aligned.fasta") into groupreps - file("${params.projtag}_asvMED_${params.asvC}") - - script: - """ - #alignment - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_mafftAlign.fasta - #trimming - trimal -in ${params.projtag}_ASVs_mafftAlign.fasta -out ${params.projtag}_ASVs_mafftAligned.fasta -keepheader -fasta -automated1 - rm ${params.projtag}_ASVs_mafftAlign.fasta - o-trim-uninformative-columns-from-alignment ${params.projtag}_ASVs_mafftAligned.fasta - mv ${params.projtag}_ASVs_mafftAligned.fasta-TRIMMED ./${params.projtag}_ASVs_Aligned_informativeonly.fasta - #entopy analysis - entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta - #Decomposition - oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.asvC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html - #generatemaps - cd ./${params.projtag}_asvMED_${params.asvC}/OLIGO-REPRESENTATIVES/ - echo "ASV,GroupID,IDPattern" - j=1 - for x in *_unique; - do gid=\$(echo \$x | awk -F "_" '{print \$1}') - uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') - grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list - seqtk subseq ../../${asvs} asv.list > Group"\${j}"_sequences.fasta - for z in \$( cat asv.list) - do echo ""\$z",Group"\$j","\$uni"" >> ${params.projtag}_ASV_Grouping.csv - - done - rm asv.list - echo ">Group\${j}" >> ${params.projtag}_ASV_group_reps_aligned.fasta - echo "\$uni" > group.list - seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta - tail -1 group.fasta >> ${params.projtag}_ASV_group_reps_aligned.fasta - mv "\$gid"_"\$uni" ./Group"\$j"_"\$uni"_aligned.fasta - mv "\$gid"_"\$uni"_unique ./Group"\$j"_"\$uni"_unqiues_aligned.fasta - rm "\$gid"*.cPickle - j=\$((\$j+1)) - done - mv ${params.projtag}_ASV_Grouping.csv ../../ - mv ${params.projtag}_ASV_group_reps_aligned.fasta ../../ - cd .. - """ - } - - process ASV_MED_Reps_phylogeny { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' - - input: - file(reps) from groupreps - - output: - file("*_ASV_Group_Reps*") into align_results_asvmed - file("*iq.treefile") into asv_group_rep_tree - - script: - """ - # Protein_ModelTest - modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.projtag}_ASV_Group_Reps_mt -d aa -s 203 --disable-checkpoint + file("*.matrix") into pcASVclustmatrices + file("*PercentID.matrix") into potu_nucl_heatmap - # Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq --redo -T auto ${params.iqCustomaa} - - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} - - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} - - elif [ "${params.parametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - - else - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ - } - - process Adding_ASV_MED_Info { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/", mode: "copy", overwrite: true - - input: - file(counts) from asvcount_med - file(map) from asvgroupscsv - - output: - file("${params.projtag}_ASV_Groupingcounts.csv") into asvgroupcounts - - script: - """ - awk -F "," '{print \$1}' ${counts} | sed '1d' > asv.list - echo "GroupID" >> group.list - for x in \$(cat asv.list); - do group=\$(grep -w \$x ${map} | awk -F "," '{print \$2}') - echo "\$group" >> group.list - done - paste -d',' group.list ${counts} > ${params.projtag}_ASV_Groupingcounts.csv - """ - } - } - - if (!params.skipAminoTyping) { - - process Translate_For_AminoTyping { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true - - input: - file(fasta) from asvsforAminotyping - - output: - file("${params.projtag}_all_translations.fasta") into amintypegen - file("${params.projtag}_translation_report") into proteinstage_vap_report - - script: - """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report - """ - } - - process Generate_AminoTypes { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Problematic", mode: "copy", overwrite: true, pattern: '*problematic*.{fasta}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes", mode: "copy", overwrite: true, pattern: '*AminoTypes_noTaxonomy.{fasta}' - - input: - file(prot) from amintypegen - file(asvs) from asvaminocheck - - output: - tuple file("*.fasta"), file("${params.projtag}_AminoTypes.clstr"), file("${params.projtag}_clustered.gc") into ( supplementalfiles ) - file("${params.projtag}_AminoTypes_noTaxonomy.fasta") into ( aminotypesCounts, aminotypesMafft, aminotypesClustal, aminotypesBlast, aminotypesEmboss, aminos_for_med ) - file("${params.projtag}_AminoType_summary_map.csv") into aminomapmed - - script: - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_filtered_translations.fasta - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_problematic_nucleotides.fasta - else - rm ${params.projtag}_problematic_translations.fasta - fi - cd-hit -i ${params.projtag}_filtered_translations.fasta -c 1.0 -o ${params.projtag}_unlabeled_types.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_unlabeled_types.fasta.clstr >${params.projtag}_AminoTypes.clstr - grep ">Cluster_" ${params.projtag}_AminoTypes.clstr >tmpclusters.list - grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," tmpclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_unlabeled_types.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_AminoType\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_AminoType\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," tmpclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_AminoType_summary_map.csv - rm tmp* - ./rename_seq.py ${params.projtag}_unlabeled_types.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_AminoTypes_noTaxonomy.fasta - stats.sh in=${params.projtag}_AminoTypes_noTaxonomy.fasta gc=${params.projtag}_clustered.gc gcformat=4 - """ - } + script: + """ + for filename in ${potus};do + ident=\$( echo \${filename} | awk -F "pcASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + done + """ + } - process Generate_AminoType_Matrices { + if (!params.skipPhylogeny) { - label 'low_cpus' + process pcASV_Nucleotide_Phylogeny { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Matrices", mode: "copy", overwrite: true + label 'norm_cpus' - input: - file(prot) from aminotypesClustal + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - output: - file("*.matrix") into proclustmatrices - file("*PercentID.matrix") into aminotype_heatmap + input: + file(reads) from pcASV_ntmafft_ch - script: - """ - name=\$( echo ${prot} | awk -F "_noTax" '{print \$1}') - clustalo -i ${prot} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} - clustalo -i ${prot} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$(( \$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - """ - } + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_nucleotide_phylogeny_results + file("*iq.treefile") into potu_Ntree_plot - if (!params.skipEMBOSS) { + script: + """ + for filename in ${reads};do + pre=\$( echo \${filename} | awk -F "_noTax" '{print \$1}' ) + mafft --maxiterate 5000 --auto \${filename} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - process AminoType_EMBOSS_Analyses { + # pcASV_Nucleotide_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - label 'low_cpus' + # pcASV_Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - input: - file(prot) from aminotypesEmboss + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - output: - tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into amino_emboss + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - script: - """ - name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') - garnier -sequence ${prot} -outfile \${name}_2dStructures.garnier - hmoment -seqall ${prot} -graph svg -plot - mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg - iep -sequence ${prot} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep - mv iep.svg ./"\${name}"_IsoelectricPoint.svg - pepstats -sequence ${prot} -outfile \${name}_ProteinProperties.pepstats - grep ">" ${prot} | awk -F ">" '{print \$2}' > tmpsequence.list - for x in \$(cat tmpsequence.list);do - echo \$x > tmp1.list - seqtk subseq ${prot} tmp1.list > tmp2.fasta - len=\$(tail -1 tmp2.fasta | awk '{print length}') - pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo - mv pepinfo.svg ./"\$x"_PropertiesPlot.svg - cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo - rm "\$x"_PropertiesPlot.pepinfo - pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepnet.svg ./"\$x"_HelicalNet.svg - pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepwheel.svg ./"\$x"_HelicalWheel.svg - rm tmp1.list tmp2.fasta - done - rm tmpsequence.list - """ - } - } + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - if (!params.skipTaxonomy) { + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + fi + done + """ + } + } - if (params.headers == "RefSeq") { + process pcASV_AminoAcid_Matrix { - process AminoType_Taxonomy_Inference_RefSeq { + label 'low_cpus' - label 'high_cpus' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Matrix", mode: "copy", overwrite: true - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*TaxonomyLabels.fasta' + input: + file(prot) from pcASV_aaMatrix_ch - input: - file(asvs) from aminotypesBlast + output: + file("*.matrix") into pcASVaaMatrix + file("*PercentID.matrix") into potu_aa_heatmap - output: - tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond - file("*_summary_for_plot.csv") into taxplot2 - file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 - file("*_quick_Taxbreakdown.csv") into tax_table_amino + script: + """ + for filename in ${prot};do + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + done + """ + } - script: - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - echo "[AminoType#]" > otu.list - echo "[Sequence length]" > length.list - grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - echo "\$s done." - fi - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloformat.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list - """ - } - } else if (params.headers == "RVDB") { - - process AminoType_Taxonomy_Inference_RVDB { - - label 'high_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*TaxonomyLabels.fasta' - - input: - file(asvs) from aminotypesBlast - - output: - tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond - file("*_summary_for_plot.csv") into taxplot2 - file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 - file("*_quick_Taxbreakdown.csv") into tax_table_amino - - script: - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - echo "[AminoType#]" > otu.list - echo "[Sequence length]" > length.list - grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - if [[ ${params.lca} == "T" ]] - then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list - echo "[Classification]" > classfication.list - else echo "skipped" >> \${name}_quick_Taxbreakdown.csv - echo "[Classification]" > classfication.list - fi - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - for s in \$(cat seqids.lst);do - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') - lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') - echo "\$lcla" >> classfication.list - fi - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ "${params.lca}" == "T" ]] - then echo "N/A" >> classfication.list - fi - echo "\$s done." - fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - if [[ "${params.lca}" == "T" ]] - then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv - else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - fi - for x in *phyloformat.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list - """ - } - } - } + if (!params.skipEMBOSS) { - if (!params.skipPhylogeny) { + process pcASV_EMBOSS_Analyses { - process AminoType_Phylogeny { + label 'low_cpus' - label 'norm_cpus' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' + input: + file(prot) from pcASVEMBOSS - input: - file(prot) from aminotypesMafft + output: + tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into pcASV_emboss - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.log"), file("*iq*"), file("*mt*") into alignprot_results - file("*iq.treefile") into (amino_rax_plot, amino_repphy) + script: + """ + for filename in ${prot};do + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + garnier -sequence \${filename} -outfile \${name}_2dStructures.garnier + hmoment -seqall \${filename} -graph svg -plot + mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg + iep -sequence \${filename} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep + mv iep.svg ./"\${name}"_IsoelectricPoint.svg + pepstats -sequence \${filename} -outfile \${name}_ProteinProperties.pepstats + grep ">" \${filename} | awk -F ">" '{print \$2}' > tmpsequence.list + for x in \$(cat tmpsequence.list);do + echo \$x > tmp1.list + seqtk subseq \${filename} tmp1.list > tmp2.fasta + len=\$(tail -1 tmp2.fasta | awk '{print length}') + pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo + mv pepinfo.svg ./"\$x"_PropertiesPlot.svg + cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo + rm "\$x"_PropertiesPlot.pepinfo + pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepnet.svg ./"\$x"_HelicalNet.svg + pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepwheel.svg ./"\$x"_HelicalWheel.svg + rm tmp1.list tmp2.fasta + done + rm tmpsequence.list + done + """ + } + } - script: - """ - # Protein_Alignment - pre=\$(echo ${prot} | awk -F "_noTax" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${prot} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta - mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta - # Protein_ModelTest - modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint + if (!params.skipTaxonomy) { - # Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} + process pcASV_AminoAcid_Taxonomy_Inference { - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + label 'high_cpus' - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + input: + file(reads) from pcASV_aaDiamond_ch - elif [ "${params.parametric}" != "false" ];then - iqtree -s\${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + output: + file("*.fasta") into ( pcASV_labeledAA ) + tuple file("*phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond + file("*_summary_for_plot.csv") into taxplot4 - else - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ - } + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} >> headers.list + headers="headers.list" + for filename in ${reads};do + name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') + diamond blastp -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" >access.list + echo "[pcASV sequence length]" >length.list + echo "[e-value]" >evalue.list + echo "[Bitscore]" >bit.list + echo "[Percent ID (aa)]" >pid.list + echo "[pcASVaa#]" >otu.list + echo "[Virus ID]" >"\$name"_virus.list + echo "[Gene]" >"\$name"_genes.list + grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_headers.txt + j=1 + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ ${params.refseq} == "T" ]];then + echo "RefSeq headers specified" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + fi + else + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >>otu.list + echo "\$acc" >>access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >>evalue.list + echo "\$line" | awk '{print \$11}' >>bit.list + echo "\$line" | awk '{print \$12}' >>pid.list + echo "\$line" | awk '{print \$2}' >>length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list + echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >>otu.list + echo "NO_HIT" >>access.list + echo "NO_HIT" >>"\$name"_genes.list + echo "NO_HIT" >>"\$name"_virus.list + echo "NO_HIT" >>evalue.list + echo "NO_HIT" >>bit.list + echo "NO_HIT" >>pid.list + echo "NO_HIT" >>length.list + virus="NO" + gene="HIT" + echo ">pcASVaa\${j}_\${virus}_\${gene}" >>new_"\$name"_headers.txt + j=\$((\$j+1)) + echo "\$s done." + fi + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py \${filename} new_"\$name"_headers.txt "\$name"_wTax.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_wTax.fasta > "\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_headers.txt >> newnames.list + touch sequence.list + awk 'BEGIN{RS=">";ORS=""}{print \$2"\\n"}' \${name}_tmpssasv.fasta >>sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_summary_phyloseqObject.csv + paste -d"\\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloseqObject.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; + rm "\$name"_virus.list + rm "\$name"_genes.list + rm newnames.list + rm access.list + echo "Taxonomy inferred for: \${filename} " + done + rm *headers.list + """ } + } - process Generate_AminoTypes_Counts_Table { + if (!params.skipPhylogeny) { - label 'high_cpus' + process pcASV_Protein_Phylogeny { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Counts", mode: "copy", overwrite: true + label 'norm_cpus' - input: - file(fasta) from aminotypesCounts - file(merged) from mergeforprotcounts - file(samplist) from samplelist + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - output: - tuple file("*_AminoType_counts.csv"), file("*dmd.out") into counts_summary - file("*_AminoType_counts.csv") into (aminocounts_plot, aminocountmed) + input: + file(prot) from pcASV_aaMafft_ch - script: - """ - set +e - diamond makedb --in ${fasta} --db ${fasta} - diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_protCounts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 - echo "OTU_ID" >tmp.col1.txt - echo "Generating sample id list" - grep ">" ${fasta} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list - cat otuid.list >> tmp.col1.txt - echo "Beginning them counts tho my g" - for y in \$( cat ${samplist} );do - echo "Starting with \$y now ..." - grep "\$y" ${params.projtag}_protCounts_dmd.out > tmp."\$y".out - echo "Isolated hits" - echo "Created uniq subject id list" - echo "\$y" > "\$y"_col.txt - echo "Starting my counts" - for z in \$(cat otuid.list);do - echo "Counting \$z hits" - echo "grep -wc "\$z" >> "\$y"_col.txt" - grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt - echo "\$z counted" - done - done - paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_AminoType_counts.csv - rm tmp* - rm *col.txt - """ - } - } + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_protein_phylogeny_results + file("*iq.treefile") into potu_Atree_plot - if (params.aminoMED) { + script: + """ + for filename in ${prot};do + pre=\$( echo \${filename} | awk -F ".fasta" '{print \$1}' ) + mafft --maxiterate 5000 --auto \${filename} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - process AminoType_Minimum_Entropy_Decomposition { + # pcASV_Protein_ModelTest + modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint - label 'low_cpus' + # pcASV_Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/MED", mode: "copy", overwrite: true + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - input: - file(aminos) from aminos_for_med + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - output: - file("*_AminoType_Grouping.csv") into atygroupscsv - file("${params.projtag}_AminoType_group_reps_aligned.fasta") into atygroupreps + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - script: - """ - #alignment - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta - #trimming - trimal -in ${params.projtag}_AminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 - rm ${params.projtag}_AminoTypes_mafftAlign.fasta - o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_mafftAligned.fasta - mv ${params.projtag}_AminoTypes_mafftAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta - #entopy analysis - entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta - #Decomposition - oligotype ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_AminoTypeMED_${params.aminoC} -M 1 -c ${params.aminoC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html - #generatemaps - cd ./${params.projtag}_AminoTypeMED_${params.aminoC}/OLIGO-REPRESENTATIVES/ - echo "AminoType,Group,IDPattern" - j=1 - for x in *_unique; - do gid=\$(echo \$x | awk -F "_" '{print \$1}') - uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') - grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list - seqtk subseq ../../${aminos} asv.list > Group"\${j}"_sequences.fasta - for z in \$( cat asv.list) - do echo ""\$z",Group"\$j","\$uni"" >> ${params.projtag}_AminoType_Grouping.csv - - done - rm asv.list - echo ">Group\${j}" >> ${params.projtag}_AminoType_group_reps_aligned.fasta - echo "\$uni" > group.list - seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta - tail -1 group.fasta >> ${params.projtag}_AminoType_group_reps_aligned.fasta - mv "\$gid"_"\$uni" ./Group"\$j"_"\$uni"_aligned.fasta - mv "\$gid"_"\$uni"_unique ./Group"\$j"_"\$uni"_unqiues_aligned.fasta - rm "\$gid"*.cPickle - j=\$((\$j+1)) - done - mv ${params.projtag}_AminoType_Grouping.csv ../../ - mv ${params.projtag}_AminoType_group_reps_aligned.fasta ../../ - cd .. + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - """ - } + else + iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + done + """ + } + } - process AminoType_MED_Reps_phylogeny { + process Generate_pcASV_Protein_Counts { - label 'low_cpus' + label 'high_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Counts", mode: "copy", overwrite: true - input: - file(reps) from atygroupreps + input: + file(fasta) from pcASV_aaCounts_ch + file(merged) from mergeforpcASVaacounts + file(samplist) from samplistpotu - output: - file("*_AminoType_Group_Reps*") into align_results_aminmed - file("*iq.treefile") into amino_group_rep_tree + output: + tuple file("*_counts.csv"), file("*dmd.out") into potuaacounts_summary + file("*counts.csv") into potu_Acounts - script: - """ - # Protein_ModelTest - modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.projtag}_AminoType_Group_Reps_mt -d aa -s 203 --disable-checkpoint + script: + """ + set +e + for filename in ${fasta};do + potu="\$( echo \${filename} | awk -F "_" '{print \$3}')" + diamond makedb --in \${filename} --db \${filename} + diamond blastx -q ${merged} -d \${filename} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_\${potu}_Counts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 + echo "OTU_ID" >tmp.col1.txt + echo "Generating sample id list" + grep ">" \${filename} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list + cat otuid.list >> tmp.col1.txt + echo "Beginning them counts tho my g" + for y in \$( cat ${samplist} );do + echo "Starting with \$y now ..." + grep "\$y" ${params.projtag}_\${potu}_Counts_dmd.out > tmp."\$y".out + echo "Isolated hits" + echo "Created uniq subject id list" + echo "\$y" > "\$y"_col.txt + echo "Starting my counts" + for z in \$(cat otuid.list);do + echo "Counting \$z hits" + echo "grep -wc "\$z" >> "\$y"_col.txt" + grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt + echo "\$z counted" + done + done + paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_\${potu}_counts.csv + rm tmp* + rm *col.txt + done + """ + } + } - # Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq --redo -T auto ${params.iqCustomaa} + if (!params.skipReport) { - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} + if (!params.skipAdapterRemoval) { - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + process combine_csv { - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} + input: + file(csv) from fastp_csv + .collect() - elif [ "${params.parametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + output: + file("final_reads_stats.csv") into ( fastp_csv1, fastp_csv2, fastp_csv3, fastp_csv4, fastp_csv5 ) - else - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ - } + script: + """ + cat ${csv} >all_reads_stats.csv + head -n1 all_reads_stats.csv >tmp.names.csv + cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv + cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv + rm tmp.names.csv tmp.reads.stats.csv + """ - process Adding_AminoType_MED_Info { + } + } - label 'low_cpus' + if (params.ncASV) { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/", mode: "copy", overwrite: true - input: - file(counts) from aminocountmed - file(tree) from amino_repphy - file(map) from atygroupscsv + process Report_ASV { - output: - file("${params.projtag}_AminoType_Groupingcounts.csv") into amino_groupcounts + label 'norm_cpus' - script: - """ - awk -F "," '{print \$1}' ${counts} | sed '1d' > amino.list - echo "GroupID" >> group.list - for x in \$(cat amino.list); - do group=\$(grep -w \$x ${map} | awk -F "," '{print \$2}') - echo "\$group" >> group.list - done - paste -d',' group.list ${counts} > ${params.projtag}_AminoType_Groupingcounts.csv - """ - } - } + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true + + input: + file(counts) from asv_counts_plots + file(taxonomy) from taxplot1 + file(matrix) from asv_heatmap + file(readsstats) from fastp_csv1 + + output: + file("*.html") into report_summaryA - if (params.pcASV) { // ASV_nucl -> ASV_aa -> clusteraa by %id with ch-hit -> extract representative nucl sequences to generate new OTU file + script: + """ + name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') + cp ${params.vampdir}/bin/vAMPirus_ReportA.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_ReportA.Rmd',output_file='\${name}_ASV_Report.html')" \${name} \ + ${readsstats} \ + ${counts} \ + ${params.metadata} \ + ${params.minimumCounts} \ + ${matrix} \ + ${taxonomy} \ + ${params.trymax} \ + ${params.stats} + """ + } - process Translation_For_pcASV_Generation { + process Report_ncASV { - label 'low_cpus' + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/ncASV", mode: "copy", overwrite: true - input: - file(fasta) from nucl2aa + input: + file(counts) from notu_counts_plots + file(taxonomy) from taxplot1a + file(matrix) from notu_heatmap + file(phylogeny) from nucl_phyl_plot + file(readsstats) from fastp_csv2 - output: - file("*ASV*translations.fasta") into clustering_aa - file("*_ASV_translations_report") into reportaa_VR - file("*_ASV_nucleotide.fasta") into asvfastaforaaclust + output: + file("*.html") into report_summaryB - script: - """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report - cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta - """ + script: + """ + cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + for x in *_summary_for_plot.csv;do + name=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}') + id=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) + Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_ncASV\${id}_Report.html')" \${name} \ + ${readsstats} \ + \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ + ${params.metadata} \ + ${params.minimumCounts} \ + \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ + ${params.trymax} \ + ${params.stats} + done + """ } - process Generate_pcASVs { + if (!params.skipAminoTyping) { + + process Report_AminoTypes { label 'norm_cpus' - tag "${mtag}" - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV", mode: "copy", overwrite: true, pattern: '*pcASV*.{fasta}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Problematic", mode: "copy", overwrite: true, pattern: '*problem*.{fasta}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true input: - each x from 1..naa - file(fasta) from clustering_aa - file(asvs) from asvfastaforaaclust + file(counts) from aminocounts_plot + file(taxonomy) from taxplot2 + file(matrix) from aminotype_heatmap + file(phylogeny) from amino_rax_plot + file(readsstats) from fastp_csv5 output: - tuple nid, file("${params.projtag}_nucleotide_pcASV*.fasta") into ( pcASV_ntDiamond_ch, pcASV_nt_counts_ch, pcASV_ntmatrix_ch, pcASV_ntmafft_ch ) - tuple nid, file("*_aminoacid_pcASV*_noTaxonomy.fasta") into ( pcASV_aaMatrix_ch, pcASV_aaDiamond_ch, pcASV_aaMafft_ch, pcASV_aaCounts_ch, pcASVEMBOSS ) - tuple nid, file("*.fasta"), file("*.clstr"), file("*.csv"), file("*.gc") into ( pcASVsupplementalfiles ) + file("*.html") into report_summaryE script: - // add awk script to count seqs - nid=slist2.get(x-1) - mtag="ID=" + slist2.get(x-1) """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -c .${nid} -o ${params.projtag}_pcASV${nid}.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV${nid}.fasta.clstr >${params.projtag}_pcASV${nid}.clstr - grep ">Cluster_" ${params.projtag}_pcASV${nid}.clstr >temporaryclusters.list - y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV${nid}.clstr) - echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV${nid}.clstr - t=1 - b=1 - for x in \$(cat temporaryclusters.list);do - echo "Extracting \$x" - name="\$( echo \$x | awk -F ">" '{print \$2}')" - clust="pcASV"\${t}"" - echo "\${name}" - awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV${nid}.clstr > "\${name}"_"\${clust}"_tmp.list - t=\$(( \${t}+1 )) - b=\$(( \${b}+1 )) - done - - ls *_tmp.list - u=1 - for x in *_tmp.list;do - name="\$(echo \$x | awk -F "_p" '{print \$1}')" - echo "\${name}" - cluster="\$(echo \$x | awk -F "_" '{print \$3}')" - echo "\${cluster}" - grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list - seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta - vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta - grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list - for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do - echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders - u=\$(( \${u}+1 )) - done - u=1 - ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta - done - cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV${nid}_noTaxonomy.fasta - grep -w "*" ${params.projtag}_pcASV${nid}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_pcASV${nid}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_pcASV${nid}.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster${nid}_summary.csv - ./rename_seq.py ${params.projtag}_pcASV${nid}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV${nid}_noTaxonomy.fasta - stats.sh in=${params.projtag}_aminoacid_pcASV${nid}_noTaxonomy.fasta gc=${params.projtag}_pcASV${nid}_aminoacid_clustered.gc gcformat=4 - stats.sh in=${params.projtag}_nucleotide_pcASV${nid}_noTaxonomy.fasta gc=${params.projtag}_pcASV${nid}_nucleotide_clustered.gc gcformat=4 - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV${nid}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_pcASV${nid}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_pcASV${nid}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV${nid}_problematic_nucleotides.fasta - else - rm ${params.projtag}_pcASV${nid}_problematic_translations.fasta - fi - rm *.list - rm Cluster* - rm *types* - rm *tmp* - rm ${params.projtag}_pcASV${nid}.fast* + name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') + cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_AminoType_Report.html')" \${name} \ + ${readsstats} \ + ${counts} \ + ${params.metadata} \ + ${params.minimumCounts} ${matrix} \ + ${taxonomy} \ + ${phylogeny} \ + ${params.trymax} \ + ${params.stats} """ } + } + } else { - if (!params.skipTaxonomy) { - - if (params.headers == "RefSeq") { - - process pcASV_Nucleotide_Taxonomy_Inference_RefSeq { - - label 'high_cpus' + process Report_ASVs { - tag "${mtag}" + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true input: - tuple nid, file(asvs) from pcASV_ntDiamond_ch + file(counts) from asv_counts_plots + file(taxonomy) from taxplot1 + file(matrix) from asv_heatmap + file(phylogeny) from nucl_phyl_plot + file(readsstats) from fastp_csv1 output: - file("*.fasta") into ( pcASV_labeled ) - tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond - tuple nid, file("*_summary_for_plot.csv") into taxplot3 - tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvnt + file("*.html") into report_summaryA script: - mtag="ID=" + nid """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - echo "[pcASV#]" > otu.list - echo "[Sequence length]" > length.list - grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - echo "\$s done." - fi - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloformat.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') + cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_ASV_Report.html')" \${name} \ + ${readsstats} \ + ${counts} \ + ${params.metadata} \ + ${params.minimumCounts} \ + ${matrix} \ + ${taxonomy} \ + ${phylogeny} \ + ${params.trymax} \ + ${params.stats} """ + } + + if (!params.skipAminoTyping) { + + process Report_AminoType { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true + + input: + file(counts) from aminocounts_plot + file(taxonomy) from taxplot2 + file(matrix) from aminotype_heatmap + file(phylogeny) from amino_rax_plot + file(readsstats) from fastp_csv5 + + output: + file("*.html") into report_summaryE + + script: + """ + name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') + cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_AminoType_Report.html')" \${name} \ + ${readsstats} \ + ${counts} \ + ${params.metadata} \ + ${params.minimumCounts} ${matrix} \ + ${taxonomy} \ + ${phylogeny} \ + ${params.trymax} \ + ${params.stats} + """ } - } else if (params.headers == "RVDB") { - - process pcASV_Nucleotide_Taxonomy_Inference_RVDB { - - label 'high_cpus' - - tag "${mtag}" - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' - - input: - tuple nid, file(asvs) from pcASV_ntDiamond_ch - - output: - file("*.fasta") into ( pcASV_labeled ) - tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond - tuple nid, file("*_summary_for_plot.csv") into taxplot3 - tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvnt - - script: - mtag="ID=" + nid - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - echo "[pcASV#]" > otu.list - echo "[Sequence length]" > length.list - grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - if [[ ${params.lca} == "T" ]] - then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list - echo "[Classification]" > classfication.list - else echo "skipped" >> \${name}_quick_Taxbreakdown.csv - echo "[Classification]" > classfication.list - fi - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - for s in \$(cat seqids.lst);do - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') - lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') - echo "\$lcla" >> classfication.list - fi - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ "${params.lca}" == "T" ]] - then echo "N/A" >> classfication.list - fi - echo "\$s done." - fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - if [[ "${params.lca}" == "T" ]] - then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv - else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - fi - for x in *phyloformat.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list - """ } } - } + if (params.pcASV) { - process Generate_Nucleotide_pcASV_Counts { + process Report_pcASV_AminoAcid { label 'norm_cpus' - tag "${mtag}" - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Counts", mode: "copy", overwrite: true, pattern: '*.{biome,csv,txt}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/pcASV/Aminoacid", mode: "copy", overwrite: true input: - tuple nid, file(potus) from pcASV_nt_counts_ch - file(merged) from pcASV_mergedreads_ch + file(counts) from potu_Acounts + file(taxonomy) from taxplot4 + file(matrix) from potu_aa_heatmap + file(phylogeny) from potu_Atree_plot + file(readsstats) from fastp_csv3 output: - tuple file("*_counts.txt"), file("*_counts.biome") into pcASVcounts_vsearch - tuple nid, file("*.csv") into potu_Ncounts_for_report + file("*.html") into report_summaryC script: - mtag="ID=" + nid """ - name=\$( echo ${potus} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db ${potus} --id .${nid} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv + cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + for x in *_summary_for_plot.csv;do + name=\$( echo \${x} | awk -F "_noTaxonomy_summary_for_plot.csv" '{print \$1}') + id=\$( echo \${x} | awk -F "_noTaxonomy_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) + Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_pcASVaa\${id}_Report.html')" \${name} \ + ${readsstats} \ + \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ + ${params.metadata} \ + ${params.minimumCounts} \ + \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ + ${params.trymax} \ + ${params.stats} + done """ - } - - process Generate_pcASV_Nucleotide_Matrix { + } - label 'low_cpus' + process Report_pcASV_Nucleotide { - tag "${mtag}" + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Matrix", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/pcASV/Nucleotide", mode: "copy", overwrite: true input: - tuple nid, file(potus) from pcASV_ntmatrix_ch + file(counts) from potu_Ncounts_for_report + file(taxonomy) from taxplot3 + file(matrix) from potu_nucl_heatmap + file(phylogeny) from potu_Ntree_plot + file(readsstats) from fastp_csv4 output: - file("*.matrix") into pcASVclustmatrices - tuple nid, file("*PercentID.matrix") into potu_nucl_heatmap + file("*.html") into report_summaryD script: - //check --percent-id second clustalo - mtag="ID=" + nid """ - name=\$( echo ${potus} | awk -F ".fasta" '{print \$1}') - clustalo -i ${potus} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} - clustalo -i ${potus} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - cat \${name}_PercentIDq.matrix | tr " " "," | grep "," >\${name}_PercentID.matrix - rm \${name}_PercentIDq.matrix + cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + for x in *_summary_for_plot.csv;do + name=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}') + id=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) + Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_pcASVnt\${id}_Report.html')" \${name} \ + ${readsstats} \ + \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ + ${params.metadata} \ + ${params.minimumCounts} \ + \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ + \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ + ${params.trymax} \ + ${params.stats} + done """ } + } + } - if (!params.skipPhylogeny) { +} else if (params.DataCheck) { - process pcASV_Nucleotide_Phylogeny { + println("\n\tRunning vAMPirus DataCheck \n") - label 'norm_cpus' + process QualityCheck_1DC { - tag "${mtag}" + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' + tag "${sample_id}" - input: - tuple nid, file(reads) from pcASV_ntmafft_ch + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/FastQC/PreClean", mode: "copy", overwrite: true - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_nucleotide_phylogeny_results - tuple nid, file("*iq.treefile") into potu_Ntree_plot + input: + tuple sample_id, file(reads) from reads_qc_ch - script: - mtag="ID=" + nid - """ - pre=\$( echo ${reads} | awk -F "_noTax" '{print \$1}' ) - mafft --maxiterate 5000 --auto ${reads} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta - mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta - # pcASV_Nucleotide_ModelTest - modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_noTaxonomy_mt -d nt -s 203 --disable-checkpoint + output: + tuple sample_id, file("*_fastqc.{zip,html}") into fastqc_results_OAS + + script: + """ + fastqc --quiet --threads ${task.cpus} ${reads} + """ + } + + process Adapter_Removal_DC { + + label 'norm_cpus' + + tag "${sample_id}" + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/AdapterRemoval", mode: "copy", overwrite: true, pattern: "*.filter.fq" + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/AdapterRemoval/fastpOut", mode: "copy", overwrite: true, pattern: "*.fastp.{json,html}" + + input: + tuple sample_id, file(reads) from reads_ch + + output: + tuple sample_id, file("*.fastp.{json,html}") into fastp_results + tuple sample_id, file("*.filter.fq") into reads_fastp_ch + file("*.csv") into fastp_csv + + script: + """ + echo ${sample_id} + + fastp -i ${reads[0]} -I ${reads[1]} -o left-${sample_id}.filter.fq -O right-${sample_id}.filter.fq --detect_adapter_for_pe \ + --average_qual 25 -c --overrepresentation_analysis --html ${sample_id}.fastp.html --json ${sample_id}.fastp.json --thread ${task.cpus} \ + --report_title ${sample_id} + + bash get_readstats.sh ${sample_id}.fastp.json + """ + } + + process Primer_Removal_DC { + + label 'norm_cpus' + + tag "${sample_id}" + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/PrimerRemoval", mode: "copy", overwrite: true + + input: + tuple sample_id, file(reads) from reads_fastp_ch + + output: + tuple sample_id, file("*bbduk*.fastq.gz") into ( reads_bbduk_ch, readsforqc2 ) + + script: + // add cocktail primer removal, easy, set a list, line by line seperated by , in a for loop + if ( params.fwd == "" && params.rev == "" && !params.multi) { + """ + bbduk.sh in1=${reads[0]} out=${sample_id}_bb_R1.fastq.gz ftl=${params.defaultFwdTrim} t=${task.cpus} + bbduk.sh in=${reads[1]} out=${sample_id}_bb_R2.fastq.gz ftl=${params.defaultRevTrim} t=${task.cpus} + repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz minlength=${params.minilen} outs=sing.fq repair + """ + } else if ( params.GlobTrim && !params.GlobTrim == "" ) { + """ + FTRIM=\$( echo ${GlobTrim} | cut -f 1 -d "," ) + RTRIM=\$( echo ${GlobTrim} | cut -f 2 -d "," ) + bbduk.sh in=${reads[0]} out=${sample_id}_bb_R1.fastq.gz ftl=\${FTRIM} t=${task.cpus} + bbduk.sh in=${reads[1]} out=${sample_id}_bb_R2.fastq.gz ftl=\${RTRIM} t=${task.cpus} + repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz minlength=${params.minilen} outs=sing.fq repair + """ + } else if ( params.multi && params.primers ) { + """ + bbduk.sh in=${reads[0]} in2=${reads[1]} out=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz ref=${params.primers} copyundefined=t t=${task.cpus} restrictleft=${params.primerLength} k=${params.maxkmer} ordered=t mink=${params.minkmer} ktrim=l ecco=t rcomp=t minlength=${params.minilen} tbo tpe + """ + } else { + """ + bbduk.sh in=${reads[0]} in2=${reads[1]} out=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz literal=${params.fwd},${params.rev} copyundefined=t t=${task.cpus} restrictleft=${params.primerLength} k=${params.maxkmer} ordered=t mink=${params.minkmer} ktrim=l ecco=t rcomp=t minlength=${params.minilen} tbo tpe + """ + } + } + + process QualityCheck_2_DC { + + label 'low_cpus' + + tag "${sample_id}" + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/FastQC/PostClean", mode: "copy", overwrite: true + + input: + tuple sample_id, file(reads) from readsforqc2 + + output: + tuple sample_id, file("*_fastqc.{zip,html}") into fastqc2_results_OAS + + script: + """ + fastqc --quiet --threads ${task.cpus} ${reads} + """ + } + + process Read_Merging_DC { + + label 'norm_cpus' + + tag "${sample_id}" + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Individual", mode: "copy", overwrite: true, pattern: "*mergedclean.fastq" + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Individual/notmerged", mode: "copy", overwrite: true, pattern: "*notmerged*.fastq" + + input: + tuple sample_id, file(reads) from reads_bbduk_ch + + output: + file("*_mergedclean.fastq") into reads_vsearch1_ch + file("*.name") into names + file("*notmerged*.fastq") into notmerged + + script: + """ + vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxee ${params.maxEE} --relabel ${sample_id}. + echo ${sample_id} > ${sample_id}.name + """ + + } + + process Compile_Reads_DC { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true + + input: + file(reads) from reads_vsearch1_ch + .collect() + + output: + file("*_all_merged_preFilt_preClean.fastq") into collect_samples_ch + + script: + """ + cat ${reads} >>${params.projtag}_all_merged_preFilt_preClean.fastq + """ + } - # pcASV_Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq --redo -T auto ${params.iqCustomnt} + process Compile_Names_DC { - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo-nt auto -b ${params.boots} + label 'low_cpus' - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging", mode: "copy", overwrite: true - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -b ${params.boots} + input: + file(names) from names + .collect() - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + output: + file("*sample_ids.list") into ( samplelist, samplistpotu ) - else - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ - } - } + script: + """ + cat ${names} >>${params.projtag}_sample_ids.list + """ + } - process pcASV_AminoAcid_Matrix { + process Length_Filtering_DC { - label 'low_cpus' + label 'norm_cpus' - tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Matrix", mode: "copy", overwrite: true + input: + file(reads) from collect_samples_ch - input: - tuple nid, file(prot) from pcASV_aaMatrix_ch + output: + file("*_merged_preFilt_clean.fasta") into ( nuclCounts_mergedreads_ch, pcASV_mergedreads_ch ) + file("*_merged_clean_Lengthfiltered.fastq") into reads_vsearch2_ch + + file("*preFilt_preClean_baseFrequency_hist.csv") into prefilt_basefreq + file("*preFilt_preClean_qualityScore_hist.csv") into prefilt_qualityscore + file("*preFilt_preClean_gcContent_hist.csv") into prefilt_gccontent + file("*preFilt_preClean_averageQuality_hist.csv") into prefilt_averagequality + file("*preFilt_preClean_length_hist.csv") into prefilt_length + + file("*postFilt_baseFrequency_hist.csv") into postFilt_basefreq + file("*postFilt_qualityScore_hist.csv") into postFilt_qualityscore + file("*postFilt_gcContent_hist.csv") into postFilt_gccontent + file("*postFilt_averageQuaulity_hist.csv") into postFilt_averagequality + file("*postFilt_length_hist.csv") into postFilt_length + + file("reads_per_sample_preFilt_preClean.csv") into reads_per_sample_preFilt + file("read_per_sample_postFilt_postClean.csv") into reads_per_sample_postFilt + script: + """ + bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt_preClean_length_hist.txt gcbins=auto + for x in *preFilt*hist.txt;do + pre=\$(echo \$x | awk -F ".txt" '{print \$1}') + cat \$x | tr "\t" "," > \${pre}.csv + rm \$x + done + reformat.sh in=${reads} out=${params.projtag}_preFilt_preclean.fasta t=${task.cpus} + echo "sample,reads" >> reads_per_sample_preFilt_preClean.csv + grep ">" ${params.projtag}_preFilt_preclean.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> reads_per_sample_preFilt_preClean.csv + rm ${params.projtag}_preFilt_preclean.fasta + fastp -i ${reads} -o ${params.projtag}_merged_preFilt_clean.fastq -b ${params.maxLen} -l ${params.minLen} --thread ${task.cpus} -n 1 + reformat.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_preFilt_clean.fasta t=${task.cpus} + bbduk.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fastq minlength=${params.maxLen} maxlength=${params.maxLen} t=${task.cpus} + bbduk.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq bhist=${params.projtag}_all_merged_postFilt_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_postFilt_qualityScore_hist.txt gchist=${params.projtag}_all_merged_postFilt_gcContent_hist.txt aqhist=${params.projtag}_all_merged_postFilt_averageQuaulity_hist.txt lhist=${params.projtag}_all_merged_postFilt_length_hist.txt gcbins=auto + for x in *postFilt*hist.txt;do + pre=\$(echo \$x | awk -F ".txt" '{print \$1}') + cat \$x | tr "\t" "," > \${pre}.csv + rm \$x + done + reformat.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fasta t=${task.cpus} + echo "sample,reads" >> read_per_sample_postFilt_postClean.csv + grep ">" ${params.projtag}_merged_clean_Lengthfiltered.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> read_per_sample_postFilt_postClean.csv + """ + } - output: - file("*.matrix") into pcASVaaMatrix - tuple nid, file("*PercentID.matrix") into potu_aa_heatmap + process Extract_Uniques_DC { - script: - mtag="ID=" + nid - """ - name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') - clustalo -i ${prot} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} - clustalo -i ${prot} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - cat \${name}_PercentIDq.matrix | tr " " "," | grep "," >\${name}_PercentID.matrix - rm \${name}_PercentIDq.matrix - """ - } + label 'norm_cpus' - if (!params.skipEMBOSS) { + publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Uniques", mode: "copy", overwrite: true - process pcASV_EMBOSS_Analyses { + input: + file(reads) from reads_vsearch2_ch - label 'low_cpus' + output: + file("*unique_sequences.fasta") into reads_vsearch3_ch - tag "${mtag}" + script: + """ + vsearch --derep_fulllength ${reads} --sizeout --relabel_keep --output ${params.projtag}_unique_sequences.fasta + """ + } - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' + process Identify_ASVs_DC { - input: - tuple nid, file(prot) from pcASVEMBOSS + label 'norm_cpus' - output: - tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into pcASV_emboss + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/ASVs/ChimeraCheck", mode: "copy", overwrite: true - script: - // check do I need for loop - mtag="ID=" + nid - """ - name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') - garnier -sequence ${prot} -outfile \${name}_2dStructures.garnier - hmoment -seqall ${prot} -graph svg -plot - mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg - iep -sequence ${prot} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep - mv iep.svg ./"\${name}"_IsoelectricPoint.svg - pepstats -sequence ${prot} -outfile \${name}_ProteinProperties.pepstats - grep ">" ${prot} | awk -F ">" '{print \$2}' > tmpsequence.list - for x in \$(cat tmpsequence.list);do - echo \$x > tmp1.list - seqtk subseq ${prot} tmp1.list > tmp2.fasta - len=\$(tail -1 tmp2.fasta | awk '{print length}') - pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo - mv pepinfo.svg ./"\$x"_PropertiesPlot.svg - cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo - rm "\$x"_PropertiesPlot.pepinfo - pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepnet.svg ./"\$x"_HelicalNet.svg - pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepwheel.svg ./"\$x"_HelicalWheel.svg - rm tmp1.list tmp2.fasta - done - rm tmpsequence.list - """ - } - } + input: + file(reads) from reads_vsearch3_ch - if (!params.skipTaxonomy) { + output: + file("*notChecked.fasta") into reads_vsearch4_ch - if (params.headers == "RefSeq") { + script: + """ + vsearch --cluster_unoise ${reads} --unoise_alpha ${params.alpha} --relabel ASV --centroids ${params.projtag}_notChecked.fasta --minsize ${params.minSize} + """ + } - process pcASV_AminoAcid_Taxonomy_Inference_RefSeq { + process Chimera_Check_DC { - label 'high_cpus' + label 'norm_cpus' - tag "${mtag}" + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/ASVs", mode: "copy", overwrite: true - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' + input: + file(fasta) from reads_vsearch4_ch - input: - tuple nid, file(asvs) from pcASV_aaDiamond_ch + output: + file("*ASVs.fasta") into ( reads_vsearch5_ch, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) - output: - file("*.fasta") into ( pcASV_labeledAA ) - tuple file("*phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond - tuple nid, file("*_summary_for_plot.csv") into taxplot4 - tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvaa + script: + """ + vsearch --uchime3_denovo ${fasta} --relabel ASV --nonchimeras ${params.projtag}_ASVs.fasta + """ + } - script: - mtag="ID=" + nid - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - echo "[pcASV#]" > otu.list - echo "[Sequence length]" > length.list - grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - echo "\$s done." - fi - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloformat.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list - """ - } - } else if (params.headers == "RVDB") { - - process pcASV_AminoAcid_Taxonomy_Inference_RVDB { - - label 'high_cpus' - - tag "${mtag}" - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' - - input: - tuple nid, file(asvs) from pcASV_aaDiamond_ch - - output: - file("*.fasta") into ( pcASV_labeledAA ) - tuple file("*phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond - tuple nid, file("*_summary_for_plot.csv") into taxplot4 - tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvaa - - script: - mtag="ID=" + nid - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list - echo "[Gene]" > "\$name"_genes.list - echo "[pcASV#]" > otu.list - echo "[Sequence length]" > length.list - grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst - if [[ ${params.lca} == "T" ]] - then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list - echo "[Classification]" > classfication.list - else echo "skipped" >> \${name}_quick_Taxbreakdown.csv - echo "[Classification]" > classfication.list - fi - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - for s in \$(cat seqids.lst);do - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') - lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') - echo "\$lcla" >> classfication.list - fi - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - if [[ "${params.lca}" == "T" ]] - then echo "N/A" >> classfication.list - fi - echo "\$s done." - fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - if [[ "${params.lca}" == "T" ]] - then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv - else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - fi - for x in *phyloformat.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list - """ - } - } - } + process NucleotideBased_ASV_clustering_DC { - if (!params.skipPhylogeny) { + label 'norm_cpus' - process pcASV_Protein_Phylogeny { + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Nucleotide", mode: "copy", overwrite: true, pattern: '*{.csv}' - label 'norm_cpus' + input: + file(fasta) from reads_vsearch5_ch - tag "${mtag}" + output: + file("number_per_percentage_nucl.csv") into number_per_percent_nucl_plot - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' + script: + if (params.datacheckntIDlist) { + """ + for id in `echo ${params.datacheckntIDlist} | tr "," "\\n"`;do + vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel OTU --id \${id} + done + for x in *ncASV*.fasta;do + id=\$( echo \$x | awk -F "_ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + numb=\$( grep -c ">" \$x ) + echo "\${id},\${numb}" >> number_per_percentage_nucl.csv + done + yo=\$(grep -c ">" ${fasta}) + echo "1.0,\${yo}" >> number_per_percentage_nucl.csv + """ + } + } - input: - tuple nid, file(prot) from pcASV_aaMafft_ch - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_protein_phylogeny_results - tuple nid, file("*iq.treefile") into potu_Atree_plot + if (params.sing) { - script: - mtag="ID=" + nid - """ - pre=\$( echo ${prot} | awk -F ".fasta" '{print \$1}' ) - mafft --maxiterate 5000 --auto ${prot} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta - mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta - # pcASV_Protein_ModelTest - modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint + process Translating_For_ProteinClustering_DC { - # pcASV_Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} + label 'low_cpus' - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + input: + file(fasta) from nucl2aa - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + output: + file("*ASVprotforclust.fasta") into clustering_aa + file("*_translation_report") into reportaa_VR + file("*_ASV_all.fasta") into asvfastaforaaclust - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + script: + """ + conda init && source activate virtualribosome - else - iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ - } - } + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report + cp ${fasta} ${params.projtag}_ASV_all.fasta - process Generate_pcASV_Protein_Counts { + """ - label 'high_cpus' + } - tag "${mtag}" + } else { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Counts", mode: "copy", overwrite: true + process Translation_For_ProteinBased_Clustering_DC { - input: - tuple nid, file(fasta) from pcASV_aaCounts_ch - file(merged) from mergeforpcASVaacounts - file(samplist) from samplistpotu + label 'norm_cpus' - output: - tuple file("*_counts.csv"), file("*dmd.out") into potuaacounts_summary - tuple nid, file("*counts.csv") into potu_Acounts + conda 'python=2.7' - script: - // check do I need for loop - mtag="ID=" + nid - """ - set +e - potu="\$( echo ${fasta} | awk -F "_" '{print \$3}')" - diamond makedb --in ${fasta} --db ${fasta} - diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_\${potu}_Counts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 - echo "OTU_ID" >tmp.col1.txt - echo "Generating sample id list" - grep ">" ${fasta} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list - cat otuid.list >> tmp.col1.txt - echo "Beginning them counts tho my g" - for y in \$( cat ${samplist} );do - echo "Starting with \$y now ..." - grep "\$y" ${params.projtag}_\${potu}_Counts_dmd.out > tmp."\$y".out - echo "Isolated hits" - echo "Created uniq subject id list" - echo "\$y" > "\$y"_col.txt - echo "Starting my counts" - for z in \$(cat otuid.list);do - echo "Counting \$z hits" - echo "grep -wc "\$z" >> "\$y"_col.txt" - grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt - echo "\$z counted" - done - done - paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_aminoacid_\${potu}_noTaxonomy_counts.csv - rm tmp* - rm *col.txt - """ - } - } + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true - if (!params.skipReport) { + input: + file(fasta) from nucl2aa - if (!params.skipAdapterRemoval || !params.skipReadProcessing || !params.skipMerging) { + output: + file("*ASVprotforclust.fasta") into clustering_aa + file("*_translation_report") into reportaa_VR + file("*_ASV_all.fasta") into asvfastaforaaclust - process combine_csv { + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report + cp ${fasta} ${params.projtag}_ASV_all.fasta + """ + } + } - input: - file(csv) from fastp_csv_in2 - .collect() + process Protein_clustering_DC { - output: - file("final_reads_stats.csv") into fastp_csv_in + label 'norm_cpus' - script: - """ - cat ${csv} >all_reads_stats.csv - head -n1 all_reads_stats.csv >tmp.names.csv - cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv - cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv - rm tmp.names.csv tmp.reads.stats.csv - """ - } - } else { + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid", mode: "copy", overwrite: true, pattern: '*{.csv}' - process skip_combine_csv { + input: + file(fasta) from clustering_aa + file(asvs) from asvfastaforaaclust - output: - file("filter_reads.txt") into fastp_csv_in + output: + file("number_per_percentage_prot.csv") into number_per_percent_prot_plot - script: - """ - echo "Read processing steps skipped." >filter_reads.txt - """ - } - } + script: + // add awk script to count seqs + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + for id in `echo ${params.datacheckaaIDlist} | tr "," "\\n"`;do + if [ \${id} == ".55" ];then + word=3 + elif [ \${id} == ".65" ];then + word=4 + else + word=5 + fi + awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta + cd-hit -i ${params.projtag}_filtered_proteins.fasta -n \${word} -c \${id} -o ${params.projtag}_pcASV\${id}.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr + grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list + y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) + echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr + t=1 + b=1 + for x in \$(cat temporaryclusters.list);do + echo "Extracting \$x" + name="\$( echo \$x | awk -F ">" '{print \$2}')" + clust="pcASV"\${t}"" + echo "\${name}" + awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list + t=\$(( \${t}+1 )) + b=\$(( \${b}+1 )) + done + ls *_tmp.list + u=1 + for x in *_tmp.list;do + name="\$(echo \$x | awk -F "_p" '{print \$1}')" + echo "\${name}" + cluster="\$(echo \$x | awk -F "_" '{print \$3}')" + echo "\${cluster}" + grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list + seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta + vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta + grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list + for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do + echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders + u=\$(( \${u}+1 )) + done + u=1 + ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta + done + cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv + grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list + j=1 + for x in \$(cat lala.list);do + echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list + echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv + j=\$(( \${j}+1 )) + done + rm lala.list + awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list + for x in \$(cat tmporder.list);do + grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list + done + paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv + ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta + stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true + stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta + else + rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta + fi + rm *.list + rm Cluster* + rm *types* + rm *tmp* + rm ${params.projtag}_pcASV\${id}.fast* + done + for x in *aminoacid*noTaxonomy.fasta;do + id=\$( echo \$x | awk -F "_noTax" '{print \$1}' | awk -F "pcASV" '{print \$2}') + numb=\$( grep -c ">" \$x) + echo "\${id},\${numb}" >> number_per_percentage_protz.csv + done + yesirr=\$( wc -l number_per_percentage_protz.csv | awk '{print \$1}') + tail -\$(( \${yesirr}-1 )) number_per_percentage_protz.csv > number_per_percentage_prot.csv + head -1 number_per_percentage_protz.csv >> number_per_percentage_prot.csv + rm number_per_percentage_protz.csv + """ + } - //NEW REPORT !!!!!!!!!!!!!!!!! - /*Report_ASV - asv_counts_plots -> ${params.projtag}_ASV_counts.csv - taxplot1 -> ${params.projtag}_ASV_summary_for_plot.csv - asv_heatmap -> ${params.projtag}_ASV_PercentID.matrix - nucl_phyl_plot -> ${params.projtag}_ASV_iq.treefile - file("*_ASV_Grouping.csv") into asvgroupscsv - "${params.projtag}_ASV_Groupingcounts.csv") into asvgroupcounts - *_quick_Taxbreakdown.csv") into tax_table_asv - \\${params.projtag}_ASV_Group_Reps_iq.treefile - */ - - report_asv = Channel.create() - asv_counts_plots.mix(taxplot_asv, asv_heatmap, nucl_phyl_plot_asv, asvgroupscsv, asvgroupcounts, asv_group_rep_tree, tax_table_asv).flatten().buffer(size:8).dump(tag:'asv').into(report_asv) - - if (params.ncASV) { - report_ncasv = Channel.create() - notu_counts_plots.mix(taxplot_ncasv, notu_heatmap, nucl_phyl_plot_ncasv, tax_table_ncasv).groupTuple(by:0, size:5).dump(tag:'ncasv').into(report_ncasv) - /* - notu_counts_plots -> ${params.projtag}_ncASV${id}_counts.csv - taxplot1a -> ${params.projtag}_ncASV${id}_summary_for_plot.csv - notu_heatmap -> ${params.projtag}_ncASV${id}_PercentID.matrix - nucl_phyl_plot -> ${params.projtag}_ncASV${id}_iq.treefile - ${params.projtag}_ncASV${id}_quick_Taxbreakdown.csv - */ - } else { - report_ncasv = Channel.empty() - } + process combine_csv_DC { - if (params.pcASV) { - report_pcasv_aa = Channel.create() - potu_Acounts.mix(taxplot4, potu_aa_heatmap, potu_Atree_plot, tax_table_pcasvaa).groupTuple(by:0, size:5).dump(tag:'pcasv1').into(report_pcasv_aa) - /*Report_pcASV_AminoAcid - potu_Acounts -> ${params.projtag}_pcASV${id}_noTaxonomy_counts.csv - taxplot4 -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_summary_for_plot.csv - potu_aa_heatmap -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_PercentID.matrix - potu_Atree_plot -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_iq.treefile - tax_table_pcasvaa -> ${params.projtag}_aminoacid_pcASV${id}_quick_Taxbreakdown.csv - */ - report_pcasv_nucl = Channel.create() - potu_Ncounts_for_report.mix(taxplot3, potu_nucl_heatmap, potu_Ntree_plot, tax_table_pcasvnt).groupTuple(by:0, size:5).dump(tag:'pcasv2').into(report_pcasv_nucl) - /*Report_pcASV_Nucleotide - potu_Ncounts_for_report -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_counts.csv - taxplot3 -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_summary_for_plot.csv - potu_nucl_heatmap -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_PercentID.matrix - potu_Ntree_plot -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_iq.treefile - tax_table_pcasvnt -> ${params.projtag}_nucleotide_pcASV${id}_quick_Taxbreakdown.csv - */ - } else { - report_pcasv_aa = Channel.empty() - report_pcasv_nucl = Channel.empty() - } + input: + file(csv) from fastp_csv + .collect() - if (!params.skipAminoTyping) { - report_aminotypes = Channel.create() - aminocounts_plot.mix(taxplot2, aminotype_heatmap, amino_rax_plot, atygroupscsv, amino_group_rep_tree, amino_groupcounts, tax_table_amino).flatten().buffer(size:8).dump(tag:'amino').into(report_aminotypes) - /* - Report_AminoTypes - aminocounts_plot -> ${params.projtag}_AminoType_counts.csv - taxplot2 -> ${params.projtag}_AminoTypes_summary_for_plot.csv - aminotype_heatmap -> ${params.projtag}_AminoTypes_PercentID.matrix - amino_rax_plot -> ${params.projtag}_AminoTypes_iq.treefile - atygroupscsv -> *_AminoType_Grouping.csv - amino_group_rep_tree -> ${params.projtag}_AminoType_Group_Reps_iq.treefile - params.projtag}_AminoType_Groupingcounts.csv") into amino_groupcounts - *_quick_Taxbreakdown.csv") into tax_table_amino - */ - } else { - report_aminotypes = Channel.empty() - } + output: + file("final_reads_stats.csv") into fastp_csv1 - report_all_ch = Channel.create() - report_asv.mix(report_ncasv, report_pcasv_aa, report_pcasv_nucl, report_aminotypes).map{it.flatten()}.dump(tag:'report').into(report_all_ch) + script: + """ + cat ${csv} >all_reads_stats.csv + head -n1 all_reads_stats.csv >tmp.names.csv + cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv + cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv + rm tmp.names.csv tmp.reads.stats.csv + """ - process Report { + } - label 'norm_cpus' + process Report_DataCheck { - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReports", mode: "copy", overwrite: true + label 'norm_cpus' - input: - file(csv) from fastp_csv_in - file(files) from report_all_ch + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Report", mode: "copy", overwrite: true, pattern: '*.{html}' - output: - file("*.html") into report_all_out + input: + file(fastpcsv) from fastp_csv1 + file(reads_per_sample_preFilt) from reads_per_sample_preFilt + file(read_per_sample_postFilt) from reads_per_sample_postFilt + file(preFilt_baseFrequency) from prefilt_basefreq + file(postFilt_baseFrequency) from postFilt_basefreq + file(preFilt_qualityScore) from prefilt_qualityscore + file(postFilt_qualityScore) from postFilt_qualityscore + file(preFilt_gcContent) from prefilt_gccontent + file(postFilt_gcContent) from postFilt_gccontent + file(preFilt_averageQuality) from prefilt_averagequality + file(postFilt_averageQuaulity) from postFilt_averagequality + file(preFilt_length) from prefilt_length + file(postFilt_length) from postFilt_length + file(number_per_percentage_nucl) from number_per_percent_nucl_plot + file(number_per_percentage_prot) from number_per_percent_prot_plot - script: - """ - name=\$( ls *summary_for_plot.csv | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_Report.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_Report.Rmd',output_file='\${name}_Report.html')" \${name} \ - ${params.skipReadProcessing} \ - ${params.skipMerging} \ - ${params.skipAdapterRemoval} \ - ${params.skipTaxonomy} \ - ${params.skipPhylogeny} \ - ${params.trymax} \ - ${params.stats} \ - ${params.metadata} \ - ${params.minimumCounts} - """ - } + output: + file("*.html") into datacheckreport - } - } + script: + """ + cp ${params.vampdir}/bin/vAMPirus_DC_Report.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_DC_Report.Rmd',output_file='${params.projtag}_DataCheck_Report.html')" ${params.projtag} \ + ${fastpcsv} \ + ${reads_per_sample_preFilt} \ + ${read_per_sample_postFilt} \ + ${preFilt_baseFrequency} \ + ${postFilt_baseFrequency} \ + ${preFilt_qualityScore} \ + ${postFilt_qualityScore} \ + ${preFilt_averageQuality} \ + ${postFilt_averageQuaulity} \ + ${preFilt_length} \ + ${postFilt_length} \ + ${number_per_percentage_nucl} \ + ${number_per_percentage_prot} + """ + } } else { println("\n\t\033[0;31mMandatory argument not specified. For more info use `nextflow run vAMPirus.nf --help`\n\033[0m") exit 0 } -if (params.DataCheck) { - workflow.onComplete { - log.info ( workflow.success ? \ - "---------------------------------------------------------------------------------" \ - + "\n\033[0;32mDone! Open the following reports in your browser\033[0m" \ - + "\n\033[0;32mPipeline performance report: ${params.workingdir}/${params.outdir}/${params.tracedir}/vampirus_report.html\033[0m" \ - + "\n\033[0;32mvAMPirus --DataCheck interactive report: ${params.workingdir}/${params.outdir}/DataCheck/Report/*.hmtl\033[0m" \ - : \ - "---------------------------------------------------------------------------------" \ - + "\n\033[0;31mSomething went wrong. Check error message below and/or log files.\033[0m" ) - } -} else if (params.Analyze) { - workflow.onComplete { - log.info ( workflow.success ? \ - "---------------------------------------------------------------------------------" \ - + "\n\033[0;32mDone! Open the following reports in your browser\033[0m" \ - + "\n\033[0;32mPipeline performance report: ${params.workingdir}/${params.outdir}/${params.tracedir}/vampirus_report.html\033[0m" \ - + "\n\033[0;32mvAMPirus --Analyze interactive report: ${params.workingdir}/${params.outdir}/Analyze/*.hmtl\033[0m" \ - : \ - "---------------------------------------------------------------------------------" \ - + "\n\033[0;31mSomething went wrong. Check error message below and/or log files.\033[0m" ) - } + +workflow.onComplete { + log.info ( workflow.success ? \ + "---------------------------------------------------------------------------------" \ + + "\n\033[0;32mDone! Open the following reports in your browser\033[0m" \ + + "\n\033[0;32mPipeline performance report: ${params.workingdir}/${params.outdir}/${params.tracedir}/vampirus_report.html\033[0m" \ + + "\n\033[0;32mvAMPirus --DataCheck interactive report: ${params.workingdir}/${params.outdir}/DataCheck/*.hmtl\033[0m" \ + + "\n\033[0;32mvAMPirus --Analyze interactive report: ${params.workingdir}/${params.outdir}/Analyze/*.hmtl\033[0m" \ + : \ + "---------------------------------------------------------------------------------" \ + + "\n\033[0;31mSomething went wrong. Check error message below and/or log files.\033[0m" ) } diff --git a/vampirus.config b/vampirus.config index a987467..c1610aa 100644 --- a/vampirus.config +++ b/vampirus.config @@ -106,7 +106,7 @@ params { // Set minimum bitscore for best hit in taxonomy assignment bitscore="50" // Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment - minID="80" + minID="40" // Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment minaln="30" From 48a923dd498779fcfb45b126dbaeb7832190aeb8 Mon Sep 17 00:00:00 2001 From: Ramon Rivera Date: Mon, 3 May 2021 15:37:24 -0700 Subject: [PATCH 109/223] Update vAMPirus.nf --- vAMPirus.nf | 5402 ++++++++++++++++++++++++++------------------------- 1 file changed, 2715 insertions(+), 2687 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 4542133..3af44b5 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -33,7 +33,7 @@ def helpMessage() { Usage: - nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] + nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] [--asvMED] [--aminoMED] [--stats] --Help options-- @@ -57,6 +57,12 @@ def helpMessage() { --pcASV Set this option to have vAMPirus cluster nucleotide and translated ASVs into protein-based operational taxonomic units (pcASVs) - See options below to define a single percent similarity or a list + --Minimum Entropy Decomposition arguments-- + + --asvMED Set this option to perform Minimum Entropy Decomposition on ASV sequences, see manual for more information. You will need to set a value for --asvC to perform this analysis + + --amino_med Set this option to perform Minimum Entropy Decomposition on AminoType sequences, see manual for more information. You will need to set a value for --aminoC to perform this analysis + --Skip options-- --skipReadProcessing Set this option to skip all read processing steps in the pipeline @@ -65,7 +71,9 @@ def helpMessage() { --skipAdapterRemoval Set this option to skip adapter removal in the pipeline - --skipPrimerRemoval Set this option to skup Skip primer removal process + --skipPrimerRemoval Set this option to skip primer removal process + + --skipMerging Set this option to skip read merging --skipAminoTyping Set this option to skip AminoTyping processes @@ -73,6 +81,10 @@ def helpMessage() { --skipPhylogeny Set this option to skip phylogeny processes + --skipEMBOSS Set this option to skip EMBOSS processes + + --skipReport Set this option to skip html report generation + **NOTE** Most opitons below can be set using the configuration file (vampirus.config) to avoid a lengthy launch command. --Project/analysis information-- @@ -140,6 +152,11 @@ def helpMessage() { --minAA With --pcASV set, use this option to set the expected or minimum amino acid sequence length of open reading frames within your amplicon sequences + --Minimum Entropy Decomposition-- + + --asvC Number of high entropy positions to use for ASV MED analysis and generate "Groups" + + --aminoC Number of high entropy positions to use for AminoType MED analysis and generate "Groups" --Counts table generation-- @@ -158,7 +175,11 @@ def helpMessage() { --dbdir Path to Directory where database is being stored - --refseq Set "--refseq T" to toggle use of RefSeq header format; default is "F" to use Reverence Viral DataBase (RVDB) header + --headers Set taxonomy database header format -> headers= "RefSeq" to toggle use of RefSeq header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers + + --dbanno Path to directory hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. + + --lca Set --lca T if you would like to add taxonomic classification to taxonomy results - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" --bitscore Set minimum bitscore to allow for best hit in taxonomy assignment @@ -205,186 +226,208 @@ def fullHelpMessage() { THIS IS A LONGER HELP WITH USAGE EXAMPLES vAMPirus v${workflow.manifest.version} ============================================================================================================================================================================================== - Steps: - 1- Before launching the vAMPirus.nf, be sure to run the vampirus_startup.sh script to install dependencies and/or databases + Steps: + 1- Before launching the vAMPirus.nf, be sure to run the vampirus_startup.sh script to install dependencies and/or databases + + 2- Test the vAMPirus installation with the provided test dataset (if you have ran the start up script, you can see STARTUP_HELP.txt for test commands and other examples) + + 3. Edit parameters in vampirus.config file + + 4. Launch the DataCheck pipeline to get summary information about your dataset + + 5. Change any parameters in vampirus.config file that might aid your analysis (e.g. clustering ID, maximum merged read length) + + 6. Launch the Analyze pipeline to perform a comprehensive analysis with your dataset + + 7. Explore results directories and produced final reports - 2- Test the vAMPirus installation with the provided test dataset (if you have ran the start up script, you can see STARTUP_HELP.txt for test commands and other examples) - 3. Edit parameters in vampirus.config file + Usage: - 4. Launch the DataCheck pipeline to get summary information about your dataset + nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] - 5. Change any parameters in vampirus.config file that might aid your analysis (e.g. clustering ID, maximum merged read length) - 6. Launch the Analyze pipeline to perform a comprehensive analysis with your dataset + --Help options-- - 7. Explore results directories and produced final reports + --help Print help information + --fullHelp Print even more help information - Usage: - nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --[Analyze|DataCheck] [--ncASV] [--pcASV] + --Mandatory arguments (choose one)-- + --Analyze Run absolutely everything - --Help options-- + --DataCheck Assess how data performs with during processing and clustering - --help Print help information - --fullHelp Print even more help information + --ASV clustering arguments-- + --ncASV Set this option to have vAMPirus cluster nucleotide amplicon sequence variants (ASVs) into nucleotide-based operational taxonomic units (ncASVs) - See options below to define a single percent similarity or a list - --Mandatory arguments (choose one)-- + --pcASV Set this option to have vAMPirus cluster nucleotide and translated ASVs into protein-based operational taxonomic units (pcASVs) - See options below to define a single percent similarity or a list - --Analyze Run absolutely everything - --DataCheck Assess how data performs with during processing and clustering + --Minimum Entropy Decomposition arguments-- + --asvMED Set this option to perform Minimum Entropy Decomposition on ASV sequences, see manual for more information. You will need to set a value for --asvC to perform this analysis - --ASV clustering arguments-- + --amino_med Set this option to perform Minimum Entropy Decomposition on AminoType sequences, see manual for more information. You will need to set a value for --aminoC to perform this analysis - --ncASV Set this option to have vAMPirus cluster nucleotide amplicon sequence variants (ASVs) into nucleotide-based operational taxonomic units (ncASVs) - See options below to define a single percent similarity or a list + --Skip options-- - --pcASV Set this option to have vAMPirus cluster nucleotide and translated ASVs into protein-based operational taxonomic units (pcASVs) - See options below to define a single percent similarity or a list + --skipReadProcessing Set this option to skip all read processing steps in the pipeline + --skipFastQC Set this option to skiip FastQC steps in the pipeline - --Skip options-- + --skipAdapterRemoval Set this option to skip adapter removal in the pipeline - --skipReadProcessing Set this option to skip all read processing steps in the pipeline + --skipPrimerRemoval Set this option to skip primer removal process - --skipFastQC Set this option to skiip FastQC steps in the pipeline + --skipMerging Set this option to skip read merging - --skipAdapterRemoval Set this option to skip adapter removal in the pipeline + --skipAminoTyping Set this option to skip AminoTyping processes - --skipPrimerRemoval Set this option to skup Skip primer removal process + --skipTaxonomy Set this option to skip taxonomy assignment processes - --skipAminoTyping Set this option to skip AminoTyping processes + --skipPhylogeny Set this option to skip phylogeny processes - --skipTaxonomy Set this option to skip taxonomy assignment processes + --skipEMBOSS Set this option to skip EMBOSS processes - --skipPhylogeny Set this option to skip phylogeny processes + --skipReport Set this option to skip html report generation - **NOTE** Most opitons below can be set using the configuration file (vampirus.config) to avoid a lengthy launch command. - --Project/analysis information-- + **NOTE** Most opitons below can be set using the configuration file (vampirus.config) to avoid a lengthy launch command. - --projtag Set project name to be used as a prefix for output files + --Project/analysis information-- - --metadata Set path to metadata spreadsheet file to be used for report generation (must be defined if generating report) + --projtag Set project name to be used as a prefix for output files - --reads Path to directory containing read libraries, must have *R{1,2}* in the library names + --metadata Set path to metadata spreadsheet file to be used for report generation (must be defined if generating report) - --workingdir Path to working directory where Nextflow will put all Nextflow and vAMPirus generated output files + --reads Path to directory containing read libraries, must have *R{1,2}* in the library names - --outdir Name of results directory containing all output from the chosen pipeline (will be made within the working directory) + --workingdir Path to working directory where Nextflow will put all Nextflow and vAMPirus generated output files + --outdir Name of results directory containing all output from the chosen pipeline (will be made within the working directory) - --Merged read length filtering-- - --minLen Minimum merged read length - reads below the specified maximum read length will be used for counts only + --Merged read length filtering-- - --maxLen Maximum merged read length - reads with length equal to the specified max read length will be used to identifying unique sequences and subsequent Amplicon Sequence Variant (ASV) analysis + --minLen Minimum merged read length - reads below the specified maximum read length will be used for counts only - --maxEE Use this option to set the maximum expected error rate for vsearch merging. Default is 1. + --maxLen Maximum merged read length - reads with length equal to the specified max read length will be used to identifying unique sequences and subsequent Amplicon Sequence Variant (ASV) analysis + --maxEE Use this option to set the maximum expected error rate for vsearch merging. Default is 1. - --Primer removal-- - General primer removal parameters + --Primer removal-- - --primerLength Use this option to set the max primer length to restrict bbduk.sh primer trimming to the first x number of bases + General primer removal parameters - --maxkmer Maximum kmer length for bbduk.sh to use for primer detection and removal (must be shorter than your primer length; default = 13) + --primerLength Use this option to set the max primer length to restrict bbduk.sh primer trimming to the first x number of bases - --minkmer Minimum kmer length for primer removal (default = 3) + --maxkmer Maximum kmer length for bbduk.sh to use for primer detection and removal (must be shorter than your primer length; default = 13) - --minilen Minimum read length after adapter and primer removal (default = 200) + --minkmer Minimum kmer length for primer removal (default = 3) - Single primer set removal- + --minilen Minimum read length after adapter and primer removal (default = 200) - --GlobTrim Set this option to perform global trimming to reads to remove primer sequences. Example usage "--GlobTrim #basesfromforward,#basesfromreverse" + Single primer set removal- - --fwd Forward primer sequence for reads to be detected and removed from reads (must specify reverse sequence if providing forward) + --GlobTrim Set this option to perform global trimming to reads to remove primer sequences. Example usage "--GlobTrim #basesfromforward,#basesfromreverse" - --rev Reverse primer sequence for reads to be detected and removed from reads (must specify forward sequence if providing reverse) + --fwd Forward primer sequence for reads to be detected and removed from reads (must specify reverse sequence if providing forward) - Multiple primer set removal- + --rev Reverse primer sequence for reads to be detected and removed from reads (must specify forward sequence if providing reverse) - --multi Use this option to signal multiple primer sequence removal within the specified pipeline + Multiple primer set removal- - --primers Use this option to set the path to a fasta file with all of the primer sequences to be detected and removed from reads + --multi Use this option to signal multiple primer sequence removal within the specified pipeline + --primers Use this option to set the path to a fasta file with all of the primer sequences to be detected and removed from reads - --Amplicon Sequence Variant (ASV) genration and clustering-- - --alpha Alpha value for denoising - the higher the alpha the higher the chance of false positives in ASV generation (1 or 2) + --Amplicon Sequence Variant (ASV) genration and clustering-- - --minSize Minimum size or representation for sequence to be considered in ASV generation + --alpha Alpha value for denoising - the higher the alpha the higher the chance of false positives in ASV generation (1 or 2) - --clusterNuclID With --ncASV set, use this option to set a single percent similarity to cluster nucleotide ASV sequences into ncASVs by [ Example: --clusterNuclID .97 ] + --minSize Minimum size or representation for sequence to be considered in ASV generation - --clusterNuclIDlist With --ncASV set, use this option to perform nucleotide-based clustering of ASVs with a comma separated list of percent similarities [ Example: --clusterNuclIDlist .95,.96,.97,.98 ] + --clusterNuclID With --ncASV set, use this option to set a single percent similarity to cluster nucleotide ASV sequences into ncASVs by [ Example: --clusterNuclID .97 ] - --clusterAAID With --pcASV set, use this option to set a single percent similarity for protein-based ASV clustering to generate pcASVs[ Example: --clusterAAID .97 ] + --clusterNuclIDlist With --ncASV set, use this option to perform nucleotide clustering with a comma separated list of percent similarities [ Example: --clusterNuclIDlist .95,.96,.97,.98 ] - --clusterAAIDlist With --pcASV set, use this option to perform protein-based ASV clustering to generate pcASVs with a comma separated list of percent similarities [ Example: --clusterAAIDlist .95,.96,.97,.98 ] + --clusterAAID With --pcASV set, use this option to set a single percent similarity for protein-based ASV clustering to generation pcASVs [ Example: --clusterAAID .97 ] - --minAA With --pcASV set, use this option to set the expected or minimum amino acid sequence length of open reading frames within your amplicon sequences + --clusterAAIDlist With --pcASV set, use this option to perform protein-based ASV clustering to generate pcASVs with a comma separated list of percent similarities [ Example: --clusterAAIDlist .95,.96,.97,.98 ] + --minAA With --pcASV set, use this option to set the expected or minimum amino acid sequence length of open reading frames within your amplicon sequences - --Counts table generation-- + --Minimum Entropy Decomposition-- - --asvcountID Similarity ID to use for ASV counts + --asvC Number of high entropy positions to use for ASV MED analysis and generate "Groups" - --ProtCountID Minimum amino acid sequence similarity for hit to count + --aminoC Number of high entropy positions to use for AminoType MED analysis and generate "Groups" - --ProtCountsLength Minimum alignment length for hit to count + --Counts table generation-- - --ProtCountsBit Minimum bitscore for hit to be counted + --asvcountID Similarity ID to use for ASV counts + --ProtCountID Minimum amino acid sequence similarity for hit to count - --Taxonomy inference parameters-- + --ProtCountsLength Minimum alignment length for hit to count - --dbname Specify name of database to use for analysis + --ProtCountsBit Minimum bitscore for hit to be counted - --dbdir Path to Directory where database is being stored - --refseq Set "--refseq T" to toggle use of RefSeq header format; default is "F" to use Reverence Viral DataBase (RVDB) header + --Taxonomy inference parameters-- - --bitscore Set minimum bitscore to allow for best hit in taxonomy assignment + --dbname Specify name of database to use for analysis - --minID Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment + --dbdir Path to Directory where database is being stored - --minaln Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment + --headers Set taxonomy database header format -> headers= "RefSeq" to toggle use of RefSeq header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers + --dbanno Path to directory hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. - --Phylogeny analysis parameters-- + --lca Set --lca T if you would like to add taxonomic classification to taxonomy results - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" - Setting customs options for IQ-TREE (Example: "-option1 A -option2 B -option3 C -option4 D") - might be easier to set in the vampirus.config file at lines 108/109 + --bitscore Set minimum bitscore to allow for best hit in taxonomy assignment - --iqCustomnt Use option to set custom options to use in all IQTREE analyses with nuceoltide sequences + --minID Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment - --iqCustomaa Use option to set custom options to use in all IQTREE analyses with amino acid sequences + --minaln Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment - These options below you can set at the command, for example, to set to use model from ModelTest-NG with parametric bootstrapping --ModelTnt --ModelTaa --parametric - --ModelTnt=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with nuceoltide sequences (Default is IQ-TREE will do automatic model testing with ModelFinder Plus) + --Phylogeny analysis parameters-- - --ModelTaa=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with amino acid sequences + Setting customs options for IQ-TREE (Example: "-option1 A -option2 B -option3 C -option4 D") - might be easier to set in the vampirus.config file at lines 108/109 - --parametric Set to use parametric bootstrapping in IQTREE analyses + --iqCustomnt Use option to set custom options to use in all IQTREE analyses with nuceoltide sequences - --nonparametric Set to use parametric bootstrapping in IQTREE analyses + --iqCustomaa Use option to set custom options to use in all IQTREE analyses with amino acid sequences - --boots Number of bootstraps (recommended 1000 for parametric and 100 for non-parametric) + These options below you can set at the command, for example, to set to use model from ModelTest-NG with parametric bootstrapping --ModelTnt --ModelTaa --parametric + --ModelTnt=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with nuceoltide sequences (Default is IQ-TREE will do automatic model testing with ModelFinder Plus) - --Statistics options-- + --ModelTaa=false Signal for IQ-TREE to use model determined by ModelTest-NG for all IQTREE analyses with amino acid sequences - --stats Set "--stats run" to signal statstical tests to be performed and included in the final report + --parametric Set to use parametric bootstrapping in IQTREE analyses - --minimumCounts Minimum number of hit counts for a sample to have to be included in the downstream statistical analyses and report generation + --nonparametric Set to use parametric bootstrapping in IQTREE analyses - --trymax Maximum number of iterations performed by metaMDS + --boots Number of bootstraps (recommended 1000 for parametric and 100 for non-parametric) + + + --Statistics options-- + + --stats Set "--stats run" to signal statstical tests to be performed and included in the final report + + --minimumCounts Minimum number of hit counts for a sample to have to be included in the downstream statistical analyses and report generation + + --trymax Maximum number of iterations performed by metaMDS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| @@ -414,7 +457,7 @@ def fullHelpMessage() { Example 4. Launching the vAMPirus Analyze pipeline with singularity with ASV and AminoType generation with all accesory analyses (taxonomy assignment, EMBOSS, IQTREE, statistics) - nextflow run vAMPirus.nf -c vampirus.config -profile singularity --Analyze --stats run + nextflow run vAMPirus.nf -c vampirus.config -profile singularity --Analyze --stats Example 5. Launching the vAMPirus Analyze pipeline with conda to perform multiple primer removal and protein-based clustering of ASVs, but skip most of the extra analyses @@ -422,7 +465,11 @@ def fullHelpMessage() { Example 6. Launching vAMPirus Analyze pipeline with conda to produce only ASV-related results - nextflow run vAMPirus.nf -c vampirus.config -profile conda --Analyze --skipAminoTyping --stats run + nextflow run vAMPirus.nf -c vampirus.config -profile conda --Analyze --skipAminoTyping --stats + + Example 7. Launching vAMPirus Analyze pipeline with conda to perform ASV analyses with Minimum Entropy Decomposition to form "Groups" + + nextflow run vAMPirus.nf -c vampirus.config -profile conda --Analyze --skipAminoTyping --stats --asvMED --asvC 24 Resuming analyses => @@ -445,7 +492,6 @@ if (params.help) { exit 0 } -// This will be printed to the user in each run. here thy can check if the values the selected are fine log.info """\ ================================================================================================================================================ vAMPirus v${workflow.manifest.version} - Virus Amplicon Sequencing Analysis Pipeline @@ -463,15 +509,35 @@ if (params.readsTest) { Channel .fromFilePairs(params.readsTest) .ifEmpty{ exit 1, "params.readTest was empty - no input files supplied" } - .into{ reads_ch; reads_qc_ch } + .into{ reads_ch; reads_qc_ch; reads_processing } } else { println("\n\tEverything ready for launch.\n") Channel .fromFilePairs("${params.reads}", checkIfExists: true) - .into{ reads_ch; reads_qc_ch } + .into{ reads_ch; reads_qc_ch; reads_processing } +} + +if (params.clusterNuclIDlist == "") { + a=params.clusterNuclID + slist=[a] + nnuc=slist.size() +} else { + msize=params.clusterNuclIDlist + slist=msize.split(',').collect{it as int} + nnuc=slist.size() +} + +if (params.clusterAAIDlist == "") { + b=params.clusterAAID + slist2=[b] + naa=slist2.size() +} else { + msize2=params.clusterAAIDlist + slist2=msize2.split(',').collect{it as int} + naa=slist2.size() } -if (params.Analyze) { +if (params.DataCheck || params.Analyze) { println("\n\tRunning vAMPirus Analyze pipeline - This might take a while, check out Nextflow tower (tower.nf) to remotely monitor the run.\n") @@ -530,7 +596,7 @@ if (params.Analyze) { } } - if (!params.skipReadProcessing) { + if (!params.skipReadProcessing || !params.skipMerging ) { if (!params.skipFastQC) { @@ -540,13 +606,13 @@ if (params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/FastQC/PreClean", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/FastQC/PreClean", mode: "copy", overwrite: true input: tuple sample_id, file(reads) from reads_qc_ch output: - tuple sample_id, file("*_fastqc.{zip,html}") into fastqc_results_OAS + tuple sample_id, file("*_fastqc.{zip,html}") into fastqc_results script: """ @@ -563,8 +629,8 @@ if (params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/AdapterRemoval", mode: "copy", overwrite: true, pattern: "*.filter.fq" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/AdapterRemoval/fastpOut", mode: "copy", overwrite: true, pattern: "*.fastp.{json,html}" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/AdapterRemoval", mode: "copy", overwrite: true, pattern: "*.filter.fq" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/AdapterRemoval/fastpOut", mode: "copy", overwrite: true, pattern: "*.fastp.{json,html}" input: tuple sample_id, file(reads) from reads_ch @@ -572,7 +638,7 @@ if (params.Analyze) { output: tuple sample_id, file("*.fastp.{json,html}") into fastp_results tuple sample_id, file("*.filter.fq") into reads_fastp_ch - file("*.csv") into fastp_csv + file("*.csv") into ( fastp_csv_in1, fastp_csv_in2 ) script: """ @@ -589,6 +655,7 @@ if (params.Analyze) { reads_ch .set{ reads_fastp_ch } fastp_results = Channel.empty() + } if (!params.skipPrimerRemoval) { @@ -599,7 +666,7 @@ if (params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/PrimerRemoval", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/PrimerRemoval", mode: "copy", overwrite: true input: tuple sample_id, file(reads) from reads_fastp_ch @@ -636,9 +703,10 @@ if (params.Analyze) { } else { reads_fastp_ch .set{ reads_bbduk_ch } + } - if (!params.skipFastQC) { + if (!params.skipFastQC && !params.skipPrimerRemoval) { process QualityCheck_2 { @@ -646,13 +714,13 @@ if (params.Analyze) { tag "${sample_id}" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/FastQC/PostClean", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/FastQC/PostClean", mode: "copy", overwrite: true input: tuple sample_id, file(reads) from readsforqc2 output: - tuple sample_id, file("*_fastqc.{zip,html}") into fastqc2_results_OAS + tuple sample_id, file("*_fastqc.{zip,html}") into fastqc2_results script: """ @@ -660,38 +728,50 @@ if (params.Analyze) { """ } } + } else { + reads_ch + .set{ reads_bbduk_ch } + } - process Read_Merging { + if (!params.skipMerging) { - label 'norm_cpus' + process Read_Merging { - tag "${sample_id}" + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Individual", mode: "copy", overwrite: true, pattern: "*mergedclean.fastq" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Individual/notmerged", mode: "copy", overwrite: true, pattern: "*notmerged*.fastq" + tag "${sample_id}" - input: - tuple sample_id, file(reads) from reads_bbduk_ch + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Individual", mode: "copy", overwrite: true, pattern: "*mergedclean.fastq" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Individual/notmerged", mode: "copy", overwrite: true, pattern: "*notmerged*.fastq" - output: - file("*_mergedclean.fastq") into reads_vsearch1_ch - file("*.name") into names - file("*notmerged*.fastq") into notmerged + input: + tuple sample_id, file(reads) from reads_bbduk_ch - script: - """ - vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxee ${params.maxEE} --relabel ${sample_id}. - echo ${sample_id} > ${sample_id}.name - """ + output: + file("*_mergedclean.fastq") into reads_vsearch1_ch + file("*.name") into names + file("*notmerged*.fastq") into notmerged + + script: + """ + vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxdiffs ${params.diffs} --fastq_maxns ${params.maxn} --fastq_allowmergestagger --fastq_maxee ${params.maxEE} --relabel ${sample_id}. + echo ${sample_id} > ${sample_id}.name + """ + + } + } else { + reads_bbduk_ch + .set{ reads_vsearch1_ch } } - process Compile_Reads { + + process Filtering_Prep1 { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true input: file(reads) from reads_vsearch1_ch @@ -706,11 +786,11 @@ if (params.Analyze) { """ } - process Compile_Names { + process Filtering_Prep2 { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging", mode: "copy", overwrite: true input: file(names) from names @@ -726,39 +806,78 @@ if (params.Analyze) { } - process Length_Filtering { //changed + process Length_Filtering { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" input: file(reads) from collect_samples_ch output: - file("*_merged_preFilt_clean.fasta") into ( nuclCounts_mergedreads_ch, pcASV_mergedreads_ch ) - file("*_merged_clean_Lengthfiltered.fastq") into reads_vsearch2_ch file("*_merged_preFilt_clean.fastq") into ( mergeforprotcounts, mergeforpcASVaacounts ) - file("**hist.txt") into histos + + file("*_merged_preFilt_clean.fasta") into ( nuclCounts_mergedreads_asv_ch, nuclCounts_mergedreads_ncasv_ch, pcASV_mergedreads_ch ) + file("*_merged_clean_Lengthfiltered.fastq") into reads_vsearch2_ch + + file("*preFilt_preClean_baseFrequency_hist.csv") into prefilt_basefreq + file("*preFilt_preClean_qualityScore_hist.csv") into prefilt_qualityscore + file("*preFilt_preClean_gcContent_hist.csv") into prefilt_gccontent + file("*preFilt_preClean_averageQuality_hist.csv") into prefilt_averagequality + file("*preFilt_preClean_length_hist.csv") into prefilt_length + + file("*postFilt_baseFrequency_hist.csv") into postFilt_basefreq + file("*postFilt_qualityScore_hist.csv") into postFilt_qualityscore + file("*postFilt_gcContent_hist.csv") into postFilt_gccontent + file("*postFilt_averageQuaulity_hist.csv") into postFilt_averagequality + file("*postFilt_length_hist.csv") into postFilt_length + + file("reads_per_sample_preFilt_preClean.csv") into reads_per_sample_preFilt + file("read_per_sample_postFilt_postClean.csv") into reads_per_sample_postFilt script: """ - bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt__preClean_length_hist.txt gcbins=auto + #bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt__preClean_length_hist.txt gcbins=auto + #fastp -i ${reads} -o ${params.projtag}_merged_preFilt_clean.fastq -b ${params.maxLen} -l ${params.minLen} --thread ${task.cpus} -n 1 + #reformat.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_preFilt_clean.fasta t=${task.cpus} + #bbduk.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fastq minlength=${params.maxLen} maxlength=${params.maxLen} t=${task.cpus} + #bbduk.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq bhist=${params.projtag}_all_merged_postFilt_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_postFilt_qualityScore_hist.txt gchist=${params.projtag}_all_merged_postFilt_gcContent_hist.txt aqhist=${params.projtag}_all_merged_postFilt_averageQuaulity_hist.txt lhist=${params.projtag}_all_merged_postFilt_length_hist.txt gcbins=auto + + # from DC + bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt_preClean_length_hist.txt gcbins=auto + for x in *preFilt*hist.txt;do + pre=\$(echo \$x | awk -F ".txt" '{print \$1}') + cat \$x | tr "\t" "," > \${pre}.csv + rm \$x + done + reformat.sh in=${reads} out=${params.projtag}_preFilt_preclean.fasta t=${task.cpus} + echo "sample,reads" >> reads_per_sample_preFilt_preClean.csv + grep ">" ${params.projtag}_preFilt_preclean.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> reads_per_sample_preFilt_preClean.csv + rm ${params.projtag}_preFilt_preclean.fasta fastp -i ${reads} -o ${params.projtag}_merged_preFilt_clean.fastq -b ${params.maxLen} -l ${params.minLen} --thread ${task.cpus} -n 1 reformat.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_preFilt_clean.fasta t=${task.cpus} bbduk.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fastq minlength=${params.maxLen} maxlength=${params.maxLen} t=${task.cpus} bbduk.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq bhist=${params.projtag}_all_merged_postFilt_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_postFilt_qualityScore_hist.txt gchist=${params.projtag}_all_merged_postFilt_gcContent_hist.txt aqhist=${params.projtag}_all_merged_postFilt_averageQuaulity_hist.txt lhist=${params.projtag}_all_merged_postFilt_length_hist.txt gcbins=auto - """ + for x in *postFilt*hist.txt;do + pre=\$(echo \$x | awk -F ".txt" '{print \$1}') + cat \$x | tr "\t" "," > \${pre}.csv + rm \$x + done + reformat.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fasta t=${task.cpus} + echo "sample,reads" >> read_per_sample_postFilt_postClean.csv + grep ">" ${params.projtag}_merged_clean_Lengthfiltered.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> read_per_sample_postFilt_postClean.csv + """ } - process Extract_Uniques { + process Extracting_Uniques { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/ReadProcessing/ReadMerging/Uniques", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ReadMerging/Uniques", mode: "copy", overwrite: true input: file(reads) from reads_vsearch2_ch @@ -800,7 +919,7 @@ if (params.Analyze) { file(fasta) from reads_vsearch4_ch output: - file("*ASVs.fasta") into ( reads_vsearch5_ch, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) + file("*ASVs.fasta") into ( reads_vsearch5_ch, asv_med, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) script: """ @@ -810,73 +929,448 @@ if (params.Analyze) { // UNTIL HERE DEFAULT - if (params.ncASV) { + if (params.DataCheck) { + + process NucleotideBased_ASV_clustering_DC { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Nucleotide", mode: "copy", overwrite: true, pattern: '*{.csv}' + + input: + file(fasta) from reads_vsearch5_ch + + output: + file("number_per_percentage_nucl.csv") into number_per_percent_nucl_plot + + script: + if (params.datacheckntIDlist) { + """ + for id in `echo ${params.datacheckntIDlist} | tr "," "\\n"`;do + vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel OTU --id \${id} + done + for x in *ncASV*.fasta;do + id=\$( echo \$x | awk -F "_ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + numb=\$( grep -c ">" \$x ) + echo "\${id},\${numb}" >> number_per_percentage_nucl.csv + done + yo=\$(grep -c ">" ${fasta}) + echo "1.0,\${yo}" >> number_per_percentage_nucl.csv + """ + } + } + + process Translation_For_ProteinBased_Clustering_DC { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true + + input: + file(fasta) from nucl2aa + + output: + file("*ASVprotforclust.fasta") into clustering_aa + file("*_translation_report") into reportaa_VR + file("*_ASV_all.fasta") into asvfastaforaaclust + + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report + cp ${fasta} ${params.projtag}_ASV_all.fasta + """ + } - process NucleotideBased_ASV_clustering { + process Protein_clustering_DC { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ncASV", mode: "copy", overwrite: true, pattern: '*ncASV*.fasta' + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid", mode: "copy", overwrite: true, pattern: '*{.csv}' input: - file(fasta) from reads_vsearch5_ch + file(fasta) from clustering_aa + file(asvs) from asvfastaforaaclust output: - tuple file("*_ncASV*.fasta"), file("*ASV.fasta") into ( nuclFastas_forDiamond_ch, nuclFastas_forCounts_ch, nuclFastas_forMatrix_ch) - tuple file("*_ncASV*.fasta"), file("*ASV.fasta") into nuclFastas_forphylogeny - + file("number_per_percentage_prot.csv") into number_per_percent_prot_plot + file("*aminoacid_pcASV1.0_noTaxonomy.fasta") into amino_med script: - if (params.clusterNuclIDlist) { + // add awk script to count seqs """ - cp ${fasta} ./${params.projtag}_ASV.fasta - for id in `echo ${params.clusterNuclIDlist} | tr "," "\\n"`;do - vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id \${id} + set +e + cp ${params.vampdir}/bin/rename_seq.py . + for id in `echo ${params.datacheckaaIDlist} | tr "," "\\n"`;do + if [ \${id} == ".55" ];then + word=3 + elif [ \${id} == ".65" ];then + word=4 + else + word=5 + fi + awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta + cd-hit -i ${params.projtag}_filtered_proteins.fasta -n \${word} -c \${id} -o ${params.projtag}_pcASV\${id}.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr + grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list + y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) + echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr + t=1 + b=1 + for x in \$(cat temporaryclusters.list);do + echo "Extracting \$x" + name="\$( echo \$x | awk -F ">" '{print \$2}')" + clust="pcASV"\${t}"" + echo "\${name}" + awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list + t=\$(( \${t}+1 )) + b=\$(( \${b}+1 )) + done + ls *_tmp.list + u=1 + for x in *_tmp.list;do + name="\$(echo \$x | awk -F "_p" '{print \$1}')" + echo "\${name}" + cluster="\$(echo \$x | awk -F "_" '{print \$3}')" + echo "\${cluster}" + grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list + seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta + vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta + grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list + for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do + echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders + u=\$(( \${u}+1 )) + done + u=1 + ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta + done + cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv + grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list + j=1 + for x in \$(cat lala.list);do + echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list + echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv + j=\$(( \${j}+1 )) + done + rm lala.list + awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list + for x in \$(cat tmporder.list);do + grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list + done + paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv + ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta + stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true + stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta + else + rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta + fi + rm *.list + rm Cluster* + rm *types* + rm *tmp* + rm ${params.projtag}_pcASV\${id}.fast* done + for x in *aminoacid*noTaxonomy.fasta;do + id=\$( echo \$x | awk -F "_noTax" '{print \$1}' | awk -F "pcASV" '{print \$2}') + numb=\$( grep -c ">" \$x) + echo "\${id},\${numb}" >> number_per_percentage_protz.csv + done + yesirr=\$( wc -l number_per_percentage_protz.csv | awk '{print \$1}') + tail -\$(( \${yesirr}-1 )) number_per_percentage_protz.csv > number_per_percentage_prot.csv + head -1 number_per_percentage_protz.csv >> number_per_percentage_prot.csv + rm number_per_percentage_protz.csv """ - } else if (params.clusterNuclID) { + } + + process ASV_Shannons_Entropy_Analysis { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Nucleotide/ShannonEntropy", mode: "copy", overwrite: true + + input: + file(asvs) from asv_med + + output: + + file("*_ASV_entropy_breakdown.csv") into asv_entro_csv + file("*Aligned_informativeonly.fasta-ENTROPY") into asv_entropy + file("*ASV*") into entrop + + script: + """ + set +e + #alignment + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_mafftAlign.fasta + #trimming + trimal -in ${params.projtag}_ASVs_mafftAlign.fasta -out ${params.projtag}_ASVs_mafftAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_ASVs_mafftAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_ASVs_mafftAligned.fasta + mv ${params.projtag}_ASVs_mafftAligned.fasta-TRIMMED ./${params.projtag}_ASVs_Aligned_informativeonly.fasta + #entopy analysis + entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta + #summarize entropy peaks + awk '{print \$2}' ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list + for x in \$(cat tmp_value.list) + do echo "\$x" + if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; + then echo dope >> above-0.0-.list + fi + if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; + then echo dope >> above-0.1-.list + fi + if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; + then echo dope >> above-0.2-.list + fi + if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; + then echo dope >> above-0.3-.list + fi + if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; + then echo dope >> above-0.4-.list + fi + if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; + then echo dope >> above-0.5-.list + fi + if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; + then echo dope >> above-0.6-.list + fi + if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; + then echo dope >> above-0.7-.list + fi + if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; + then echo dope >> above-0.8-.list + fi + if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; + then echo dope >> above-0.9-.list + fi + if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; + then echo dope >> above-1.0-.list + fi + if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; + then echo dope >> above-1.5-.list + fi + done + echo "Entropy,Peaks_above" >> ${params.projtag}_ASV_entropy_breakdown.csv + for z in above*.list; + do entrop=\$(echo \$z | awk -F "-" '{print \$2}') + echo ""\$entrop", "\$(wc -l \$z | awk '{print \$1}')"" >> ${params.projtag}_ASV_entropy_breakdown.csv + done + rm above* + mv ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY ./tmp.fasta + echo "Base_position Shannons_Entropy" >> ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY + cat tmp.fasta >> ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY + rm tmp.fasta + + """ + + } + + process AminoType_Shannons_Entropy_Analysis { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/ShannonEntropy", mode: "copy", overwrite: true, pattern: '*{.csv}' + + input: + file(aminos) from amino_med + + output: + file("*AminoType_entropy_breakdown.csv") into amino_entro_csv + file ("*Aligned_informativeonly.fasta-ENTROPY") into amino_entropy + file("*AminoTypes*") into aminos + + script: + """ + #alignment + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta + #trimming + trimal -in ${params.projtag}_AminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_AminoTypes_mafftAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_mafftAligned.fasta + mv ${params.projtag}_AminoTypes_mafftAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta + #entropy analysis + entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta --amino-acid-sequences + #summarize entropy peaks + awk '{print \$2}' ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list + for x in \$(cat tmp_value.list) + do echo "\$x" + if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; + then echo dope >> above-0.0-.list + fi + if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; + then echo dope >> above-0.1-.list + fi + if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; + then echo dope >> above-0.2-.list + fi + if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; + then echo dope >> above-0.3-.list + fi + if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; + then echo dope >> above-0.4-.list + fi + if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; + then echo dope >> above-0.5-.list + fi + if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; + then echo dope >> above-0.6-.list + fi + if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; + then echo dope >> above-0.7-.list + fi + if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; + then echo dope >> above-0.8-.list + fi + if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; + then echo dope >> above-0.9-.list + fi + if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; + then echo dope >> above-1.0-.list + fi + if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; + then echo dope >> above-1.5-.list + fi + done + echo "Entropy,Peaks_above" >> ${params.projtag}_AminoType_entropy_breakdown.csv + for z in above*.list; + do entrop=\$(echo \$z | awk -F "-" '{print \$2}') + echo ""\$entrop", "\$(wc -l \$z | awk '{print \$1}')"" >> ${params.projtag}_AminoType_entropy_breakdown.csv + done + rm above* + mv ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY ./tmp.fasta + echo "Base_position Shannons_Entropy" >> ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY + cat tmp.fasta >> ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY + rm tmp.fasta + """ + } + + if (!params.skipReadProcessing || !params.skipMerging ) { + + process combine_csv_DC { + + input: + file(csv) from fastp_csv_in1 + .collect() + + output: + file("final_reads_stats.csv") into fastp_csv_dc + + script: + """ + cat ${csv} >all_reads_stats.csv + head -n1 all_reads_stats.csv >tmp.names.csv + cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv + cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv + rm tmp.names.csv tmp.reads.stats.csv + """ + + } + } else { + + process skip_combine_csv_DC { + output: + file("filter_reads.txt") into fastp_csv_dc + + script: + """ + echo "Read processing steps skipped." >filter_reads.txt + """ + } + } + + report_dc_in = Channel.create() + fastp_csv_dc.mix( reads_per_sample_preFilt, reads_per_sample_postFilt, prefilt_basefreq, postFilt_basefreq, prefilt_qualityscore, postFilt_qualityscore, prefilt_gccontent, postFilt_gccontent, prefilt_averagequality, postFilt_averagequality, prefilt_length, postFilt_length, number_per_percent_nucl_plot, number_per_percent_prot_plot, amino_entro_csv, amino_entropy, asv_entro_csv, asv_entropy).into(report_dc_in) + + process Report_DataCheck { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/DataCheck/Report", mode: "copy", overwrite: true, pattern: '*.{html}' + + input: + file(files) from report_dc_in + .collect() + + output: + file("*.html") into datacheckreport + + script: """ - cp ${fasta} ./${params.projtag}_ASV.fasta - id=${params.clusterNuclID} - vsearch --cluster_fast ${params.projtag}_ASV.fasta --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel ncASV --id \${id} + cp ${params.vampdir}/bin/vAMPirus_DC_Report.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_DC_Report.Rmd',output_file='${params.projtag}_DataCheck_Report.html')" ${params.projtag} \ + ${params.skipReadProcessing} \ + ${params.skipMerging} \ + ${params.skipAdapterRemoval} """ - } } - } else { - reads_vsearch5_ch - .into{ nuclFastas_forDiamond_ch; nuclFastas_forCounts_ch; nuclFastas_forphylogeny; nuclFastas_forMatrix_ch } - } - if (!params.skipTaxonomy) { + } else if (params.Analyze) { if (params.ncASV) { - process Nucleotide_Taxonomy_Inference { + reads_vsearch5_ch + .into{ asv_file_for_ncasvs; nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch; asv_for_med } + + process NucleotideBased_ASV_clustering { + + label 'norm_cpus' - label 'high_cpus' + tag "${mtag}" - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy", mode: "copy", overwrite: true, pattern: '*ncASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*ncASV*dmd.out' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ncASV", mode: "copy", overwrite: true, pattern: '*ncASV*.fasta' input: - tuple file(notus), file(asvs) from nuclFastas_forDiamond_ch + each x from 1..nnuc + file(fasta) from asv_file_for_ncasvs output: - file("*.fasta") into tax_labeled_fasta - tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond - file("*ncASV*summary_for_plot.csv") into taxplot1a - file("*_ASV*_summary_for_plot.csv") into taxplot1 + tuple nid, file("*_ncASV*.fasta") into ( nuclFastas_forphylogeny_ncasv, nuclFastas_forDiamond_ncasv_ch, nuclFastas_forCounts_ncasv_ch, nuclFastas_forMatrix_ncasv_ch ) script: + nid=slist.get(x-1) + mtag="ID=" + slist.get(x-1) + """ + vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV${nid}.fasta --threads ${task.cpus} --relabel ncASV --id .${nid} """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - for filename in ${notus};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + } + + if (!params.skipTaxonomy) { + + if (params.headers == "RefSeq") { + + process ncASV_Taxonomy_Inference_RefSeq { /////// editttt + + label 'high_cpus' + + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy", mode: "copy", overwrite: true, pattern: '*ncASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*ncASV*dmd.out' + + input: + tuple nid, file(asvs) from nuclFastas_forDiamond_ncasv_ch + + output: + file("*.fasta") into tax_labeled_fasta_ncasv + tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_ncasv + tuple nid, file("*ncASV*summary_for_plot.csv") into taxplot_ncasv + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_ncasv + + script: + mtag="ID=" + nid + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -884,18 +1378,14 @@ if (params.Analyze) { echo "[Percent ID (aa)]" > pid.list echo "[Organism ID]" > "\$name"_virus.list echo "[Gene]" > "\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + echo "[ncASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst echo "extracting genes and names" touch new_"\$name"_asvnames.txt - j=1 - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - echo "[ncASV#]" > otu.list - echo "[ncASV sequence length]" > length.list - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then echo "Yep, there was a hit for \$s" echo "Extracting the information now:" acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') @@ -911,10 +1401,9 @@ if (params.Analyze) { echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) + echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - else + else echo "Ugh, there was no hit for \$s .." echo "We still love \$s though and we will add it to the final fasta file" echo "\$s" >> otu.list @@ -927,55 +1416,13 @@ if (params.Analyze) { echo "NO_HIT" >> length.list virus="NO" gene="HIT" - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ncASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - fi + fi + done echo "Now editing "\$name" fasta headers" ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta echo "[Sequence header]" > newnames.list cat new_"\$name"_asvnames.txt >> newnames.list @@ -983,9 +1430,9 @@ if (params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do + for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; @@ -993,17 +1440,270 @@ if (params.Analyze) { cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; rm tmpcol.list tmp2col.list done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " - done - for filename in ${asvs};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ + } + } else if (params.headers == "RVDB") { + + process ncASV_Taxonomy_Inference_RVDB { /////// editttt + + label 'high_cpus' + + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy", mode: "copy", overwrite: true, pattern: '*ncASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*ncASV*dmd.out' + + input: + tuple nid, file(asvs) from nuclFastas_forDiamond_ncasv_ch + + output: + file("*.fasta") into tax_labeled_fasta_ncasv + tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_ncasv + tuple nid, file("*ncASV*summary_for_plot.csv") into taxplot_ncasv + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_ncasv + + script: + mtag="ID=" + nid + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[ncASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lca} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Classification]" > classfication.list + else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + echo "[Classification]" > classfication.list + fi + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> classfication.list + fi + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then echo "N/A" >> classfication.list + fi + echo "\$s done." + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + if [[ "${params.lca}" == "T" ]] + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + fi + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ + } + } + } + + + process Generate_ncASV_Counts_Table { + + label 'norm_cpus' + + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*_ASV*.{biome,csv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Counts", mode: "copy", overwrite: true, pattern: '*ncASV*.{biome,csv}' + + input: + tuple nid, file(notus) from nuclFastas_forCounts_ncasv_ch + file(merged) from nuclCounts_mergedreads_ncasv_ch + + output: + tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch_ncasv + tuple nid, file("*ncASV*counts.csv") into notu_counts_plots + + script: + mtag="ID=" + nid + """ + name=\$( echo ${notus} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db ${notus} --id .${nid} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv + """ + } + + process Generate_ncASV_Matrices { + label 'low_cpus' + + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Matrices", mode: "copy", overwrite: true, pattern: '*ncASV*PercentID.matrix' + + input: + tuple nid, file(asvs) from nuclFastas_forMatrix_ncasv_ch + + output: + file("*.matrix") into clustmatrices_ncasv + tuple nid, file("*ncASV*PercentID.matrix") into notu_heatmap + + script: + mtag="ID=" + nid + """ + name=\$( echo ${asvs}| awk -F ".fasta" '{print \$1}') + clustalo -i ${asvs} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i ${asvs} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + cat \${name}_PercentIDq.matrix | tr " " "," | grep "," >\${name}_PercentID.matrix + rm \${name}_PercentIDq.matrix + """ + } + + if (!params.skipPhylogeny) { + + process ncASV_Phylogeny { + + label 'norm_cpus' + + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ncASV*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ncASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ncASV*iq*' + + input: + tuple nid, file(asvs) from nuclFastas_forphylogeny_ncasv + + output: + tuple nid, file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_ncasv + tuple nid, file("*iq.treefile") into nucl_phyl_plot_ncasv + + script: + mtag="ID=" + nid + """ + pre=\$(echo ${asvs} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta + mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta + # Nucleotide_ModelTest + modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + else + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni + fi + """ + } + + } + + } else { + reads_vsearch5_ch + .into{ nuclFastas_forDiamond_asv_ch; nuclFastas_forCounts_asv_ch; nuclFastas_forphylogeny_asv; nuclFastas_forMatrix_asv_ch; asv_for_med } + } + + if (!params.skipTaxonomy) { + + if (params.headers == "RefSeq") { + + process ASV_Taxonomy_Inference_RefSeq { /////// editttt + + label 'high_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' + + input: + file(asvs) from nuclFastas_forDiamond_asv_ch + + output: + file("*.fasta") into tax_labeled_fasta_asv + tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv + file("*_ASV*_summary_for_plot.csv") into taxplot_asv + file("*_quick_Taxbreakdown.csv") into tax_table_asv + + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -1011,18 +1711,14 @@ if (params.Analyze) { echo "[Percent ID (aa)]" > pid.list echo "[Organism ID]" > "\$name"_virus.list echo "[Gene]" > "\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + echo "[ASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst echo "extracting genes and names" touch new_"\$name"_asvnames.txt - j=1 - if [ `echo \${filename} | grep -c "ASV"` -eq 1 ];then - for s in \$(cat seqids.lst);do - echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then echo "Yep, there was a hit for \$s" echo "Extracting the information now:" acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') @@ -1038,48 +1734,9 @@ if (params.Analyze) { echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) + echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - else + else echo "Ugh, there was no hit for \$s .." echo "We still love \$s though and we will add it to the final fasta file" echo "\$s" >> otu.list @@ -1092,17 +1749,13 @@ if (params.Analyze) { echo "NO_HIT" >> length.list virus="NO" gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - fi - fi - echo "Done with \$s" - done - fi + fi + done echo "Now editing "\$name" fasta headers" ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta echo "[Sequence header]" > newnames.list cat new_"\$name"_asvnames.txt >> newnames.list @@ -1110,9 +1763,9 @@ if (params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do + for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; @@ -1120,146 +1773,572 @@ if (params.Analyze) { cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; rm tmpcol.list tmp2col.list done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ + } + } else if (params.headers == "RVDB") { + + process ASV_Taxonomy_Inference_RVDB { /////// editttt + + label 'high_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' + + input: + file(asvs) from nuclFastas_forDiamond_asv_ch + + output: + file("*.fasta") into tax_labeled_fasta_asv + tuple file("*_phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond_asv + file("*_ASV*_summary_for_plot.csv") into taxplot_asv + file("*_quick_Taxbreakdown.csv") into tax_table_asv + + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[ASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lca} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Classification]" > classfication.list + else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + echo "[Classification]" > classfication.list + fi + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> classfication.list + fi + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then echo "N/A" >> classfication.list + fi + echo "\$s done." + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + if [[ "${params.lca}" == "T" ]] + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + fi + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ + } + } + } + + process Generate_ASV_Counts_Tables { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*ASV*.{biome,csv}' + + input: + file(asvs) from nuclFastas_forCounts_asv_ch + file(merged) from nuclCounts_mergedreads_asv_ch + + output: + tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch_asv + file("*_ASV*counts.csv") into (asv_counts_plots, asvcount_med) + + script: + """ + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db ${asvs} --id .${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv + """ + } + + process Generate_ASV_Matrices { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrices", mode: "copy", overwrite: true, pattern: '*ASV*PercentID.matrix' + + input: + file(reads) from nuclFastas_forMatrix_asv_ch + + output: + file("*.matrix") into clustmatrices_asv + file("*_ASV*PercentID.matrix") into asv_heatmap + + script: + // remove if statement later (no fin) + """ + for filename in ${reads};do + if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then + ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') + name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + else + name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') + clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} + clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$((\$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + fi + done + """ + } + + if (!params.skipPhylogeny) { // need to edit paths + + process ASV_Phylogeny { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ASV*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' + + input: + file(asvs) from nuclFastas_forphylogeny_asv + + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results_asv + file("*iq.treefile") into (nucl_phyl_plot_asv, asvphy_med) + + script: + """ + pre=\$(echo ${asvs} | awk -F ".fasta" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta + mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta + # Nucleotide_ModelTest + modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint + # Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + else + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } + } + + if (params.asvMED) { + + process ASV_Minimum_Entropy_Decomposition { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/ASVs/MED", mode: "copy", overwrite: true + + input: + file(asvs) from asv_for_med + + output: + file("*_ASV_Grouping.csv") into asvgroupscsv + file("${params.projtag}_ASV_group_reps_aligned.fasta") into groupreps + file("${params.projtag}_asvMED_${params.asvC}") + + script: + """ + #alignment + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_mafftAlign.fasta + #trimming + trimal -in ${params.projtag}_ASVs_mafftAlign.fasta -out ${params.projtag}_ASVs_mafftAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_ASVs_mafftAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_ASVs_mafftAligned.fasta + mv ${params.projtag}_ASVs_mafftAligned.fasta-TRIMMED ./${params.projtag}_ASVs_Aligned_informativeonly.fasta + #entopy analysis + entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta + #Decomposition + oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.asvC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + #generatemaps + cd ./${params.projtag}_asvMED_${params.asvC}/OLIGO-REPRESENTATIVES/ + echo "ASV,GroupID,IDPattern" + j=1 + for x in *_unique; + do gid=\$(echo \$x | awk -F "_" '{print \$1}') + uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') + grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list + seqtk subseq ../../${asvs} asv.list > Group"\${j}"_sequences.fasta + for z in \$( cat asv.list) + do echo ""\$z",Group"\$j","\$uni"" >> ${params.projtag}_ASV_Grouping.csv + + done + rm asv.list + echo ">Group\${j}" >> ${params.projtag}_ASV_group_reps_aligned.fasta + echo "\$uni" > group.list + seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta + tail -1 group.fasta >> ${params.projtag}_ASV_group_reps_aligned.fasta + mv "\$gid"_"\$uni" ./Group"\$j"_"\$uni"_aligned.fasta + mv "\$gid"_"\$uni"_unique ./Group"\$j"_"\$uni"_unqiues_aligned.fasta + rm "\$gid"*.cPickle + j=\$((\$j+1)) done - rm headers.list + mv ${params.projtag}_ASV_Grouping.csv ../../ + mv ${params.projtag}_ASV_group_reps_aligned.fasta ../../ + cd .. """ - } + } - } else { + process ASV_MED_Reps_phylogeny { - process ASV_Taxonomy_Inference { + label 'low_cpus' - label 'high_cpus' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy", mode: "copy", overwrite: true, pattern: '*_ASV*.{fasta,csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*_ASV*dmd.out' + input: + file(reps) from groupreps - input: - file(reads) from nuclFastas_forDiamond_ch + output: + file("*_ASV_Group_Reps*") into align_results_asvmed + file("*iq.treefile") into asv_group_rep_tree - output: - file("*.fasta") into tax_labeled_fasta - tuple file("*_phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_diamond - file("*_ASV*_summary_for_plot.csv") into taxplot1 - script: - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} > headers.list - headers="headers.list" - for filename in ${reads};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" > access.list - echo "[e-value]" > evalue.list - echo "[Bitscore]" > bit.list - echo "[Percent ID (aa)]" > pid.list - echo "[Organism ID]" > "\$name"_virus.list + script: + """ + # Protein_ModelTest + modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.projtag}_ASV_Group_Reps_mt -d aa -s 203 --disable-checkpoint + + # Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq --redo -T auto ${params.iqCustomaa} + + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} + + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} + + elif [ "${params.parametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + + else + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } + + process Adding_ASV_MED_Info { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/", mode: "copy", overwrite: true + + input: + file(counts) from asvcount_med + file(map) from asvgroupscsv + + output: + file("${params.projtag}_ASV_Groupingcounts.csv") into asvgroupcounts + + script: + """ + awk -F "," '{print \$1}' ${counts} | sed '1d' > asv.list + echo "GroupID" >> group.list + for x in \$(cat asv.list); + do group=\$(grep -w \$x ${map} | awk -F "," '{print \$2}') + echo "\$group" >> group.list + done + paste -d',' group.list ${counts} > ${params.projtag}_ASV_Groupingcounts.csv + """ + } + } + + if (!params.skipAminoTyping) { + + process Translate_For_AminoTyping { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true + + input: + file(fasta) from asvsforAminotyping + + output: + file("${params.projtag}_all_translations.fasta") into amintypegen + file("${params.projtag}_translation_report") into proteinstage_vap_report + + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report + """ + } + + process Generate_AminoTypes { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Problematic", mode: "copy", overwrite: true, pattern: '*problematic*.{fasta}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes", mode: "copy", overwrite: true, pattern: '*AminoTypes_noTaxonomy.{fasta}' + + input: + file(prot) from amintypegen + file(asvs) from asvaminocheck + + output: + tuple file("*.fasta"), file("${params.projtag}_AminoTypes.clstr"), file("${params.projtag}_clustered.gc") into ( supplementalfiles ) + file("${params.projtag}_AminoTypes_noTaxonomy.fasta") into ( aminotypesCounts, aminotypesMafft, aminotypesClustal, aminotypesBlast, aminotypesEmboss, aminos_for_med ) + file("${params.projtag}_AminoType_summary_map.csv") into aminomapmed + + script: + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_filtered_translations.fasta + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_problematic_nucleotides.fasta + else + rm ${params.projtag}_problematic_translations.fasta + fi + cd-hit -i ${params.projtag}_filtered_translations.fasta -c 1.0 -o ${params.projtag}_unlabeled_types.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_unlabeled_types.fasta.clstr >${params.projtag}_AminoTypes.clstr + grep ">Cluster_" ${params.projtag}_AminoTypes.clstr >tmpclusters.list + grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + paste -d"," tmpclusters.list tmphead.list >tmp.info.csv + grep ">" ${params.projtag}_unlabeled_types.fasta >lala.list + j=1 + for x in \$(cat lala.list);do + echo ">${params.projtag}_AminoType\${j}" >>${params.projtag}_aminoheaders.list + echo "\${x},>${params.projtag}_AminoType\${j}" >>tmpaminotype.info.csv + j=\$(( \${j}+1 )) + done + rm lala.list + awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list + for x in \$(cat tmporder.list);do + grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list + done + paste -d "," tmpclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_AminoType_summary_map.csv + rm tmp* + ./rename_seq.py ${params.projtag}_unlabeled_types.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_AminoTypes_noTaxonomy.fasta + stats.sh in=${params.projtag}_AminoTypes_noTaxonomy.fasta gc=${params.projtag}_clustered.gc gcformat=4 + """ + } + + process Generate_AminoType_Matrices { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Matrices", mode: "copy", overwrite: true + + input: + file(prot) from aminotypesClustal + + output: + file("*.matrix") into proclustmatrices + file("*PercentID.matrix") into aminotype_heatmap + + script: + """ + name=\$( echo ${prot} | awk -F "_noTax" '{print \$1}') + clustalo -i ${prot} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} + clustalo -i ${prot} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + for x in *q.matrix;do + pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') + ya=\$(wc -l \$x | awk '{print \$1}') + echo "\$((\$ya-1))" + tail -"\$(( \$ya-1))" \$x > \${pre}z.matrix + rm \$x + cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix + rm \${pre}z.matrix + done + """ + } + + if (!params.skipEMBOSS) { + + process AminoType_EMBOSS_Analyses { + + label 'low_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' + + input: + file(prot) from aminotypesEmboss + + output: + tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into amino_emboss + + script: + """ + name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') + garnier -sequence ${prot} -outfile \${name}_2dStructures.garnier + hmoment -seqall ${prot} -graph svg -plot + mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg + iep -sequence ${prot} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep + mv iep.svg ./"\${name}"_IsoelectricPoint.svg + pepstats -sequence ${prot} -outfile \${name}_ProteinProperties.pepstats + grep ">" ${prot} | awk -F ">" '{print \$2}' > tmpsequence.list + for x in \$(cat tmpsequence.list);do + echo \$x > tmp1.list + seqtk subseq ${prot} tmp1.list > tmp2.fasta + len=\$(tail -1 tmp2.fasta | awk '{print length}') + pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo + mv pepinfo.svg ./"\$x"_PropertiesPlot.svg + cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo + rm "\$x"_PropertiesPlot.pepinfo + pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepnet.svg ./"\$x"_HelicalNet.svg + pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepwheel.svg ./"\$x"_HelicalWheel.svg + rm tmp1.list tmp2.fasta + done + rm tmpsequence.list + """ + } + } + + if (!params.skipTaxonomy) { + + if (params.headers == "RefSeq") { + + process AminoType_Taxonomy_Inference_RefSeq { + + label 'high_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*TaxonomyLabels.fasta' + + input: + file(asvs) from aminotypesBlast + + output: + tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond + file("*_summary_for_plot.csv") into taxplot2 + file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 + file("*_quick_Taxbreakdown.csv") into tax_table_amino + + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list echo "[Gene]" > "\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst + echo "[AminoType#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst echo "extracting genes and names" touch new_"\$name"_asvnames.txt - j=1 - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - else - for s in \$(cat seqids.lst);do - echo "[ASV#]" > otu.list - echo "[ASV sequence length]" > length.list - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then echo "Yep, there was a hit for \$s" echo "Extracting the information now:" acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') @@ -1275,48 +2354,9 @@ if (params.Analyze) { echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >> access.list - echo "NO_HIT" >> "\$name"_genes.list - echo "NO_HIT" >> "\$name"_virus.list - echo "NO_HIT" >> evalue.list - echo "NO_HIT" >> bit.list - echo "NO_HIT" >> pid.list - echo "NO_HIT" >> length.list - virus="NO" - gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >> evalue.list - echo "\$line" | awk '{print \$11}' >> bit.list - echo "\$line" | awk '{print \$12}' >> pid.list - echo "\$line" | awk '{print \$2}' >> length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) + echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - else + else echo "Ugh, there was no hit for \$s .." echo "We still love \$s though and we will add it to the final fasta file" echo "\$s" >> otu.list @@ -1329,17 +2369,13 @@ if (params.Analyze) { echo "NO_HIT" >> length.list virus="NO" gene="HIT" - echo ">ASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt echo "\$s done." - fi - fi - echo "Done with \$s" - done - fi + fi + done echo "Now editing "\$name" fasta headers" ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta echo "[Sequence header]" > newnames.list cat new_"\$name"_asvnames.txt >> newnames.list @@ -1347,9 +2383,9 @@ if (params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do + for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; @@ -1357,2408 +2393,1400 @@ if (params.Analyze) { cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; rm tmpcol.list tmp2col.list done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " - done - rm headers.list - """ + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ + } + } else if (params.headers == "RVDB") { + + process AminoType_Taxonomy_Inference_RVDB { + + label 'high_cpus' + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*TaxonomyLabels.fasta' + + input: + file(asvs) from aminotypesBlast + + output: + tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond + file("*_summary_for_plot.csv") into taxplot2 + file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 + file("*_quick_Taxbreakdown.csv") into tax_table_amino + + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[AminoType#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lca} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Classification]" > classfication.list + else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + echo "[Classification]" > classfication.list + fi + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> classfication.list + fi + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then echo "N/A" >> classfication.list + fi + echo "\$s done." + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + if [[ "${params.lca}" == "T" ]] + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + fi + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ + } } - } - } + } - if (params.ncASV) { + if (!params.skipPhylogeny) { - process Generate_Counts_Tables_Nucleotide { + process AminoType_Phylogeny { - label 'norm_cpus' + label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*_ASV*.{biome,csv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Counts", mode: "copy", overwrite: true, pattern: '*ncASV*.{biome,csv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - input: - tuple file(notus), file(asvs) from nuclFastas_forCounts_ch - file(merged) from nuclCounts_mergedreads_ch + input: + file(prot) from aminotypesMafft - output: - tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch - file("*ncASV*counts.csv") into notu_counts_plots - file("*_ASV*counts.csv") into asv_counts_plots + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.log"), file("*iq*"), file("*mt*") into alignprot_results + file("*iq.treefile") into (amino_rax_plot, amino_repphy) - script: - """ - for filename in ${notus};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - fi - done - if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - fi - """ - } - } else { - process Generate_ASV_Counts_Tables { + script: + """ + # Protein_Alignment + pre=\$(echo ${prot} | awk -F "_noTax" '{print \$1}' ) + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${prot} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta + mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta + # Protein_ModelTest + modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint - label 'norm_cpus' + # Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Counts", mode: "copy", overwrite: true, pattern: '*ASV*.{biome,csv}' + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - input: - file(asvs) from nuclFastas_forCounts_ch - file(merged) from nuclCounts_mergedreads_ch + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - output: - tuple file("*_counts.csv"), file("*_counts.biome") into counts_vsearch - file("*_ASV*counts.csv") into asv_counts_plots + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - script: - """ - if [ `echo ${asvs} | grep -c "ASV"` -eq 1 ];then - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db ${asvs} --id ${params.asvcountID} --threads ${task.cpus} --otutabout "\$name"_counts.txt --biomout "\$name"_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - fi - """ + elif [ "${params.parametric}" != "false" ];then + iqtree -s\${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + + else + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } } - } - if (params.ncASV) { + process Generate_AminoTypes_Counts_Table { - process Generate_Nucleotide_Matrix { + label 'high_cpus' - label 'low_cpus' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Counts", mode: "copy", overwrite: true - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*_ASV*PercentID.matrix' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Matrix", mode: "copy", overwrite: true, pattern: '*ncASV*PercentID.matrix' - - input: - tuple file(notus), file(asvs) from nuclFastas_forMatrix_ch - - output: - file("*.matrix") into clustmatrices - file("*ncASV*PercentID.matrix") into notu_heatmap - file("*_ASV*PercentID.matrix") into asv_heatmap - - script: - // remove if statement later (no fin) - """ - for filename in ${notus};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - fi - done - if [ `echo ${asvs} | grep -c "_ASV"` -eq 1 ];then - name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - clustalo -i ${asvs} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i ${asvs} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - fi - """ - } - } else { - - process Generate_ASV_Matrix { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Matrix", mode: "copy", overwrite: true, pattern: '*ASV*PercentID.matrix' - - input: - file(reads) from nuclFastas_forMatrix_ch - - output: - file("*.matrix") into clustmatrices - file("*_ASV*PercentID.matrix") into asv_heatmap - - script: - // remove if statement later (no fin) - """ - for filename in ${reads};do - if [ `echo \${filename} | grep -c "ncASV"` -eq 1 ];then - ident=\$( echo \${filename} | awk -F "ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename}| awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - else - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistance.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - fi - done - """ - } - } - - if (!params.skipPhylogeny) { // need to edit paths - - if (params.ncASV) { - - process Nucleotide_Phylogeny { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ncASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ncASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ncASV/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ncASV*iq*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*_ASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*_ASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*_ASV*iq*' - - input: - tuple file(notus), file(asvs) from nuclFastas_forphylogeny + input: + file(fasta) from aminotypesCounts + file(merged) from mergeforprotcounts + file(samplist) from samplelist output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results - file("*iq.treefile") into nucl_phyl_plot + tuple file("*_AminoType_counts.csv"), file("*dmd.out") into counts_summary + file("*_AminoType_counts.csv") into (aminocounts_plot, aminocountmed) script: """ - for filename in ${notus};do - pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - fi - done - for filename in ${asvs};do - pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - done - """ + set +e + diamond makedb --in ${fasta} --db ${fasta} + diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_protCounts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 + echo "OTU_ID" >tmp.col1.txt + echo "Generating sample id list" + grep ">" ${fasta} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list + cat otuid.list >> tmp.col1.txt + echo "Beginning them counts tho my g" + for y in \$( cat ${samplist} );do + echo "Starting with \$y now ..." + grep "\$y" ${params.projtag}_protCounts_dmd.out > tmp."\$y".out + echo "Isolated hits" + echo "Created uniq subject id list" + echo "\$y" > "\$y"_col.txt + echo "Starting my counts" + for z in \$(cat otuid.list);do + echo "Counting \$z hits" + echo "grep -wc "\$z" >> "\$y"_col.txt" + grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt + echo "\$z counted" + done + done + paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_AminoType_counts.csv + rm tmp* + rm *col.txt + """ } - } else { - - process ASV_Phylogeny { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*ASV*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' - - input: - file(asvs) from nuclFastas_forphylogeny - - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into align_results - file("*iq.treefile") into nucl_phyl_plot - - script: - """ - for filename in ${asvs};do - pre=\$(echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - # Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - # Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomnt} - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - done - """ - } } - } - - if (!params.skipAminoTyping) { - if (params.sing) { + if (params.aminoMED) { - process Translating_For_Aminotypes { + process AminoType_Minimum_Entropy_Decomposition { label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/MED", mode: "copy", overwrite: true input: - file(fasta) from asvsforAminotyping + file(aminos) from aminos_for_med output: - file("${params.projtag}_all_translations.fasta") into amintypegen - file("${params.projtag}_translation_report") into proteinstage_vap_report + file("*_AminoType_Grouping.csv") into atygroupscsv + file("${params.projtag}_AminoType_group_reps_aligned.fasta") into atygroupreps script: - """ - conda init && source activate virtualribosome - - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report - """ - - } - - } else { - - process Translate_For_AminoTyping { - - label 'low_cpus' - - conda 'python=2.7' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Translation", mode: "copy", overwrite: true - - input: - file(fasta) from asvsforAminotyping - - output: - file("${params.projtag}_all_translations.fasta") into amintypegen - file("${params.projtag}_translation_report") into proteinstage_vap_report - - script: - """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_all_translations.fasta --report ${params.projtag}_translation_report """ - } - - } - - process Generate_AminoTypes { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/Problematic", mode: "copy", overwrite: true, pattern: '*problematic*.{fasta}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes", mode: "copy", overwrite: true, pattern: '*AminoTypes_noTaxonomy.{fasta}' - - input: - file(prot) from amintypegen - file(asvs) from asvaminocheck - - output: - tuple file("*.fasta"), file("${params.projtag}_AminoTypes.clstr"), file("${params.projtag}_AminoType_summary_map.csv"), file("${params.projtag}_clustered.gc") into ( supplementalfiles ) - file("${params.projtag}_AminoTypes_noTaxonomy.fasta") into ( aminotypesCounts, aminotypesMafft, aminotypesClustal, aminotypesBlast, aminotypesEmboss ) - - script: - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_filtered_translations.fasta - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${prot} >${params.projtag}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_problematic_nucleotides.fasta - else - rm ${params.projtag}_problematic_translations.fasta - fi - cd-hit -i ${params.projtag}_filtered_translations.fasta -c 1.0 -o ${params.projtag}_unlabeled_types.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_unlabeled_types.fasta.clstr >${params.projtag}_AminoTypes.clstr - grep ">Cluster_" ${params.projtag}_AminoTypes.clstr >tmpclusters.list - grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_AminoTypes.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," tmpclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_unlabeled_types.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_AminoType\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_AminoType\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," tmpclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_AminoType_summary_map.csv - rm tmp* - ./rename_seq.py ${params.projtag}_unlabeled_types.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_AminoTypes_noTaxonomy.fasta - stats.sh in=${params.projtag}_AminoTypes_noTaxonomy.fasta gc=${params.projtag}_clustered.gc gcformat=4 - """ - } - - process Generate_AminoType_Matrix { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Matrix", mode: "copy", overwrite: true - - input: - file(prot) from aminotypesClustal - - output: - file("*.matrix") into proclustmatrices - file("*PercentID.matrix") into aminotype_heatmap - - script: - """ - name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') - clustalo -i ${prot} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} - clustalo -i ${prot} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$(( \$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - """ - } - - if (!params.skipEMBOSS) { - - process AminoType_EMBOSS_Analyses { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' - - input: - file(prot) from aminotypesEmboss - - output: - tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into amino_emboss - - script: - """ - name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') - garnier -sequence ${prot} -outfile \${name}_2dStructures.garnier - hmoment -seqall ${prot} -graph svg -plot - mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg - iep -sequence ${prot} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep - mv iep.svg ./"\${name}"_IsoelectricPoint.svg - pepstats -sequence ${prot} -outfile \${name}_ProteinProperties.pepstats - grep ">" ${prot} | awk -F ">" '{print \$2}' > tmpsequence.list - for x in \$(cat tmpsequence.list);do - echo \$x > tmp1.list - seqtk subseq ${prot} tmp1.list > tmp2.fasta - len=\$(tail -1 tmp2.fasta | awk '{print length}') - pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo - mv pepinfo.svg ./"\$x"_PropertiesPlot.svg - cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo - rm "\$x"_PropertiesPlot.pepinfo - pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepnet.svg ./"\$x"_HelicalNet.svg - pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepwheel.svg ./"\$x"_HelicalWheel.svg - rm tmp1.list tmp2.fasta - done - rm tmpsequence.list - """ - } - } - - if (!params.skipTaxonomy) { - - process AminoType_Taxonomy_Inference { - - label 'high_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Taxonomy", mode: "copy", overwrite: true, pattern: '*TaxonomyLabels.fasta' - - input: - file(reads) from aminotypesBlast - - output: - tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AA_diamond - file("*_summary_for_plot.csv") into taxplot2 - file("*TaxonomyLabels.fasta") into tax_labeled_fasta2 - - script: - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} >> headers.list - headers="headers.list" - name=\$(ls ${reads} | awk -F "_noTaxonomy" '{print \$1}') - diamond blastp -q ${reads} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" >access.list - echo "[pcASV sequence length]" >length.list - echo "[e-value]" >evalue.list - echo "[Bitscore]" >bit.list - echo "[Percent ID (aa)]" >pid.list - echo "[AminoType#]" >otu.list - echo "[Virus ID]" >"\$name"_virus.list - echo "[Gene]" >"\$name"_genes.list - grep ">" ${reads} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_asvnames.txt - j=1 - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">AminoType\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">AminoType\${j}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >>otu.list - echo "\$acc" >>access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') - echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list - echo ">AminoType\${j}_"\$virus"_"\$gene"" >>new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >>otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">AminoType\${j}_"\$virus"_"\$gene"" >>new_"\$name"_asvnames.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py ${reads} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_asvnames.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst headers.list otu.list ; - rm *asvnames.txt - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: ${reads} " - """ - } - } - - if (!params.skipPhylogeny) { - - process AminoType_Phylogeny { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - - input: - file(prot) from aminotypesMafft - - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.log"), file("*iq*"), file("*mt*") into alignprot_results - file("*iq.treefile") into amino_rax_plot - - script: - """ - # Protein_Alignment - pre=\$(echo ${prot} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${prot} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - - # Protein_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint - - # Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} - - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ - } - } - - process Generate_AminoTypes_Counts_Table { - - label 'high_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/Counts", mode: "copy", overwrite: true - - input: - file(fasta) from aminotypesCounts - file(merged) from mergeforprotcounts - file(samplist) from samplelist + #alignment + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta + #trimming + trimal -in ${params.projtag}_AminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_AminoTypes_mafftAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_mafftAligned.fasta + mv ${params.projtag}_AminoTypes_mafftAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta + #entopy analysis + entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta + #Decomposition + oligotype ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_AminoTypeMED_${params.aminoC} -M 1 -c ${params.aminoC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + #generatemaps + cd ./${params.projtag}_AminoTypeMED_${params.aminoC}/OLIGO-REPRESENTATIVES/ + echo "AminoType,Group,IDPattern" + j=1 + for x in *_unique; + do gid=\$(echo \$x | awk -F "_" '{print \$1}') + uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') + grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list + seqtk subseq ../../${aminos} asv.list > Group"\${j}"_sequences.fasta + for z in \$( cat asv.list) + do echo ""\$z",Group"\$j","\$uni"" >> ${params.projtag}_AminoType_Grouping.csv + + done + rm asv.list + echo ">Group\${j}" >> ${params.projtag}_AminoType_group_reps_aligned.fasta + echo "\$uni" > group.list + seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta + tail -1 group.fasta >> ${params.projtag}_AminoType_group_reps_aligned.fasta + mv "\$gid"_"\$uni" ./Group"\$j"_"\$uni"_aligned.fasta + mv "\$gid"_"\$uni"_unique ./Group"\$j"_"\$uni"_unqiues_aligned.fasta + rm "\$gid"*.cPickle + j=\$((\$j+1)) + done + mv ${params.projtag}_AminoType_Grouping.csv ../../ + mv ${params.projtag}_AminoType_group_reps_aligned.fasta ../../ + cd .. - output: - tuple file("*_protcounts.csv"), file("*dmd.out") into counts_summary - file("*_protcounts.csv") into aminocounts_plot + """ + } - script: - """ - set +e - diamond makedb --in ${fasta} --db ${fasta} - diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_protCounts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 - echo "OTU_ID" >tmp.col1.txt - echo "Generating sample id list" - grep ">" ${fasta} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list - cat otuid.list >> tmp.col1.txt - echo "Beginning them counts tho my g" - for y in \$( cat ${samplist} );do - echo "Starting with \$y now ..." - grep "\$y" ${params.projtag}_protCounts_dmd.out > tmp."\$y".out - echo "Isolated hits" - echo "Created uniq subject id list" - echo "\$y" > "\$y"_col.txt - echo "Starting my counts" - for z in \$(cat otuid.list);do - echo "Counting \$z hits" - echo "grep -wc "\$z" >> "\$y"_col.txt" - grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt - echo "\$z counted" - done - done - paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_protcounts.csv - rm tmp* - rm *col.txt - """ - } - } + process AminoType_MED_Reps_phylogeny { - if (params.pcASV) { // ASV_nucl -> ASV_aa -> clusteraa by %id with ch-hit -> extract representative nucl sequences to generate new OTU file + label 'low_cpus' - if (params.sing) { + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - process Translating_For_pcASV_Generation { + input: + file(reps) from atygroupreps - label 'low_cpus' + output: + file("*_AminoType_Group_Reps*") into align_results_aminmed + file("*iq.treefile") into amino_group_rep_tree - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' + script: + """ + # Protein_ModelTest + modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.projtag}_AminoType_Group_Reps_mt -d aa -s 203 --disable-checkpoint - input: - file(fasta) from nucl2aa + # Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq --redo -T auto ${params.iqCustomaa} - output: - file("*ASV*translations.fasta") into clustering_aa - file("*_ASV_translations_report") into reportaa_VR - file("*_ASV_nucleotide.fasta") into asvfastaforaaclust + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} - script: - """ - conda init && source activate virtualribosome + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report - cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta - """ + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} - } + elif [ "${params.parametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - } else { + else + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } - process Translation_For_pcASV_Generation { + process Adding_AminoType_MED_Info { label 'low_cpus' - conda 'python=2.7' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/", mode: "copy", overwrite: true input: - file(fasta) from nucl2aa + file(counts) from aminocountmed + file(tree) from amino_repphy + file(map) from atygroupscsv output: - file("*ASV*translations.fasta") into clustering_aa - file("*_ASV_translations_report") into reportaa_VR - file("*_ASV_nucleotide.fasta") into asvfastaforaaclust + file("${params.projtag}_AminoType_Groupingcounts.csv") into amino_groupcounts script: """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report - cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta + awk -F "," '{print \$1}' ${counts} | sed '1d' > amino.list + echo "GroupID" >> group.list + for x in \$(cat amino.list); + do group=\$(grep -w \$x ${map} | awk -F "," '{print \$2}') + echo "\$group" >> group.list + done + paste -d',' group.list ${counts} > ${params.projtag}_AminoType_Groupingcounts.csv """ - } - } - - process Generate_pcASVs { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV", mode: "copy", overwrite: true, pattern: '*pcASV*.{fasta}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Problematic", mode: "copy", overwrite: true, pattern: '*problem*.{fasta}' - - input: - file(fasta) from clustering_aa - file(asvs) from asvfastaforaaclust - - output: - file("${params.projtag}_nucleotide_pcASV*.fasta") into ( pcASV_ntDiamond_ch, pcASV_nt_counts_ch, pcASV_ntmatrix_ch, pcASV_ntmafft_ch ) - file("*_aminoacid_pcASV*_noTaxonomy.fasta") into ( pcASV_aaMatrix_ch, pcASV_aaDiamond_ch, pcASV_aaMafft_ch, pcASV_aaCounts_ch, pcASVEMBOSS ) - tuple file("*.fasta"), file("*.clstr"), file("*.csv"), file("*.gc") into ( pcASVsupplementalfiles ) - - script: - // add awk script to count seqs - if (params.clusterAAIDlist) { - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - for id in `echo ${params.clusterAAIDlist} | tr "," "\\n"`;do - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -c \${id} -o ${params.projtag}_pcASV\${id}.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr - grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list - y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) - echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr - t=1 - b=1 - for x in \$(cat temporaryclusters.list);do - echo "Extracting \$x" - name="\$( echo \$x | awk -F ">" '{print \$2}')" - clust="pcASV"\${t}"" - echo "\${name}" - awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list - t=\$(( \${t}+1 )) - b=\$(( \${b}+1 )) - done - ls *_tmp.list - u=1 - for x in *_tmp.list;do - name="\$(echo \$x | awk -F "_p" '{print \$1}')" - echo "\${name}" - cluster="\$(echo \$x | awk -F "_" '{print \$3}')" - echo "\${cluster}" - grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list - seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta - vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta - grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list - for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do - echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders - u=\$(( \${u}+1 )) - done - u=1 - ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta - done - cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv - ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta - stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true - stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta - else - rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta - fi - rm *.list - rm Cluster* - rm *types* - rm *tmp* - rm ${params.projtag}_pcASV\${id}.fast* - done - """ - } else if (params.clusterAAID) { - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - id=${params.clusterAAID} - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -c ${params.clusterAAID} -o ${params.projtag}_pcASV\${id}.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr - grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list - y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) - echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr - t=1 - b=1 - for x in \$(cat temporaryclusters.list);do - echo "Extracting \$x" - name="\$( echo \$x | awk -F ">" '{print \$2}')" - clust="pcASV"\${t}"" - echo "\${name}" - awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list - t=\$(( \${t}+1 )) - b=\$(( \${b}+1 )) - done - - ls *_tmp.list - u=1 - for x in *_tmp.list;do - name="\$(echo \$x | awk -F "_p" '{print \$1}')" - echo "\${name}" - cluster="\$(echo \$x | awk -F "_" '{print \$3}')" - echo "\${cluster}" - grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list - seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta - vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta - grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list - for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do - echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders - u=\$(( \${u}+1 )) - done - u=1 - ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta - done - cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv - ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta - stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 - stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta - else - rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta - fi - rm *.list - rm Cluster* - rm *types* - rm *tmp* - rm ${params.projtag}_pcASV\${id}.fast* - """ - } - } - - if (!params.skipTaxonomy) { - - process pcASV_Nucleotide_Taxonomy_Inference { - - label 'high_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' - - input: - file(reads) from pcASV_ntDiamond_ch - - output: - file("*.fasta") into ( pcASV_labeled ) - tuple file("*_phyloseqObject.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond - file("*_summary_for_plot.csv") into taxplot3 - - script: - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} >> headers.list - headers="headers.list" - for filename in ${reads};do - name=\$(ls \${filename} | awk -F "_noTax" '{print \$1}') - diamond blastx -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" >access.list - echo "[pcASV sequence length]" >length.list - echo "[e-value]" >evalue.list - echo "[Bitscore]" >bit.list - echo "[Percent ID (aa)]" >pid.list - echo "[pcASV#]" >otu.list - echo "[Virus ID]" >"\$name"_virus.list - echo "[Gene]" >"\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_headers.txt - j=1 - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASV\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >>otu.list - echo "\$acc" >>access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list - echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >>otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASV\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_headers.txt "\$name"_TaxonomyLabels.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta > "\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_headers.txt >> newnames.list - touch sequence.list - echo " " > sequence.list - grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloseqObject.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " - done - rm *headers.list - """ - } - } - - process Generate_Nucleotide_pcASV_Counts { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Counts", mode: "copy", overwrite: true, pattern: '*.{biome,csv,txt}' - - input: - file(potus) from pcASV_nt_counts_ch - file(merged) from pcASV_mergedreads_ch - - output: - tuple file("*_counts.txt"), file("*_counts.biome") into pcASVcounts_vsearch - file("*.csv") into potu_Ncounts_for_report - - script: - """ - for filename in ${potus};do - ident=\$( echo \${filename} | awk -F "pcASV" '{print \$2}' | awk -F "_noTaxonomy.fasta" '{print \$1}') - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - vsearch --usearch_global ${merged} --db \${filename} --id \${ident} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome - cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv - sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv - rm \${name}_count.csv - done - """ - } - - process Generate_pcASV_Nucleotide_Matrix { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Matrix", mode: "copy", overwrite: true - - input: - file(potus) from pcASV_ntmatrix_ch - - output: - file("*.matrix") into pcASVclustmatrices - file("*PercentID.matrix") into potu_nucl_heatmap - - script: - """ - for filename in ${potus};do - ident=\$( echo \${filename} | awk -F "pcASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - done - """ - } - - if (!params.skipPhylogeny) { - - process pcASV_Nucleotide_Phylogeny { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - - input: - file(reads) from pcASV_ntmafft_ch - - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_nucleotide_phylogeny_results - file("*iq.treefile") into potu_Ntree_plot - - script: - """ - for filename in ${reads};do - pre=\$( echo \${filename} | awk -F "_noTax" '{print \$1}' ) - mafft --maxiterate 5000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - - # pcASV_Nucleotide_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d nt -s 203 --disable-checkpoint - - # pcASV_Nucleotide_Phylogeny - if [ "${params.iqCustomnt}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -t \${pre}_mt.tree -T auto ${params.iqCustomnt} - - elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - - elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -b ${params.boots} - - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -t \${pre}_mt.tree -nt auto -bb ${params.boots} -bnni - fi - done - """ - } - } - - process pcASV_AminoAcid_Matrix { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Matrix", mode: "copy", overwrite: true - - input: - file(prot) from pcASV_aaMatrix_ch - - output: - file("*.matrix") into pcASVaaMatrix - file("*PercentID.matrix") into potu_aa_heatmap - - script: - """ - for filename in ${prot};do - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - clustalo -i \${filename} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} - clustalo -i \${filename} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} - for x in *q.matrix;do - pre=\$(echo "\$x" | awk -F "q.matrix" '{print \$1}') - ya=\$(wc -l \$x | awk '{print \$1}') - echo "\$((\$ya-1))" - tail -"\$((\$ya-1))" \$x > \${pre}z.matrix - rm \$x - cat \${pre}z.matrix | sed 's/ /,/g' | sed -E 's/(,*),/,/g' >\${pre}.matrix - rm \${pre}z.matrix - done - done - """ - } - - if (!params.skipEMBOSS) { - - process pcASV_EMBOSS_Analyses { - - label 'low_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' - - input: - file(prot) from pcASVEMBOSS - - output: - tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into pcASV_emboss - - script: - """ - for filename in ${prot};do - name=\$( echo \${filename} | awk -F ".fasta" '{print \$1}') - garnier -sequence \${filename} -outfile \${name}_2dStructures.garnier - hmoment -seqall \${filename} -graph svg -plot - mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg - iep -sequence \${filename} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep - mv iep.svg ./"\${name}"_IsoelectricPoint.svg - pepstats -sequence \${filename} -outfile \${name}_ProteinProperties.pepstats - grep ">" \${filename} | awk -F ">" '{print \$2}' > tmpsequence.list - for x in \$(cat tmpsequence.list);do - echo \$x > tmp1.list - seqtk subseq \${filename} tmp1.list > tmp2.fasta - len=\$(tail -1 tmp2.fasta | awk '{print length}') - pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo - mv pepinfo.svg ./"\$x"_PropertiesPlot.svg - cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo - rm "\$x"_PropertiesPlot.pepinfo - pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepnet.svg ./"\$x"_HelicalNet.svg - pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len - mv pepwheel.svg ./"\$x"_HelicalWheel.svg - rm tmp1.list tmp2.fasta - done - rm tmpsequence.list - done - """ - } - } - - if (!params.skipTaxonomy) { - - process pcASV_AminoAcid_Taxonomy_Inference { - - label 'high_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' - - input: - file(reads) from pcASV_aaDiamond_ch - - output: - file("*.fasta") into ( pcASV_labeledAA ) - tuple file("*phyloseqObject.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond - file("*_summary_for_plot.csv") into taxplot4 - - script: - """ - cp ${params.vampdir}/bin/rename_seq.py . - virdb=${params.dbdir}/${params.dbname} - grep ">" \${virdb} >> headers.list - headers="headers.list" - for filename in ${reads};do - name=\$(ls \${filename} | awk -F ".fasta" '{print \$1}') - diamond blastp -q \${filename} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 - echo "Preparing lists to generate summary .csv's" - echo "[Best hit accession number]" >access.list - echo "[pcASV sequence length]" >length.list - echo "[e-value]" >evalue.list - echo "[Bitscore]" >bit.list - echo "[Percent ID (aa)]" >pid.list - echo "[pcASVaa#]" >otu.list - echo "[Virus ID]" >"\$name"_virus.list - echo "[Gene]" >"\$name"_genes.list - grep ">" \${filename} | awk -F ">" '{print \$2}' > seqids.lst - echo "extracting genes and names" - touch new_"\$name"_headers.txt - j=1 - for s in \$(cat seqids.lst);do - echo "Checking for \$s hit in diamond output" - if [[ ${params.refseq} == "T" ]];then - echo "RefSeq headers specified" - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') - echo "\$s" >> otu.list - echo "\$acc" >> access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') - echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >> otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >> new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi - else - echo "Using RVDB headers." - if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then - echo "Yep, there was a hit for \$s" - echo "Extracting the information now:" - acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') - echo "\$s" >>otu.list - echo "\$acc" >>access.list - line="\$(grep -w "\$s" "\$name"_dmd.out)" - echo "\$line" | awk '{print \$10}' >>evalue.list - echo "\$line" | awk '{print \$11}' >>bit.list - echo "\$line" | awk '{print \$12}' >>pid.list - echo "\$line" | awk '{print \$2}' >>length.list - echo "Extracting virus and gene ID for \$s now" - gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && - echo "\$gene" | sed 's/_/ /g' >>"\$name"_genes.list - virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && - echo "\$virus" | sed 's/_/ /g' >>"\$name"_virus.list - echo ">pcASVaa\${j}_"\$virus"_"\$gene"" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - else - echo "Ugh, there was no hit for \$s .." - echo "We still love \$s though and we will add it to the final fasta file" - echo "\$s" >>otu.list - echo "NO_HIT" >>access.list - echo "NO_HIT" >>"\$name"_genes.list - echo "NO_HIT" >>"\$name"_virus.list - echo "NO_HIT" >>evalue.list - echo "NO_HIT" >>bit.list - echo "NO_HIT" >>pid.list - echo "NO_HIT" >>length.list - virus="NO" - gene="HIT" - echo ">pcASVaa\${j}_\${virus}_\${gene}" >>new_"\$name"_headers.txt - j=\$((\$j+1)) - echo "\$s done." - fi - fi - echo "Done with \$s" - done - echo "Now editing "\$name" fasta headers" - ###### rename_seq.py - ./rename_seq.py \${filename} new_"\$name"_headers.txt "\$name"_wTax.fasta - awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_wTax.fasta > "\$name"_tmpssasv.fasta - echo "[Sequence header]" > newnames.list - cat new_"\$name"_headers.txt >> newnames.list - touch sequence.list - awk 'BEGIN{RS=">";ORS=""}{print \$2"\\n"}' \${name}_tmpssasv.fasta >>sequence.list - rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_summary_phyloseqObject.csv - paste -d"\\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - for x in *phyloseqObject.csv;do - echo "\$x" - lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) - tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; - sed 's/ /_/g' tmpcol.list > tmp2col.list; - cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; - rm tmpcol.list tmp2col.list - done - rm evalue.list ; rm sequence.list ; rm bit.list ; rm pid.list ; rm length.list seqids.lst otu.list ; - rm "\$name"_virus.list - rm "\$name"_genes.list - rm newnames.list - rm access.list - echo "Taxonomy inferred for: \${filename} " - done - rm *headers.list - """ - } - } - - if (!params.skipPhylogeny) { - - process pcASV_Protein_Phylogeny { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - - input: - file(prot) from pcASV_aaMafft_ch - - output: - tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_protein_phylogeny_results - file("*iq.treefile") into potu_Atree_plot - - script: - """ - for filename in ${prot};do - pre=\$( echo \${filename} | awk -F ".fasta" '{print \$1}' ) - mafft --maxiterate 5000 --auto \${filename} >\${pre}_ALN.fasta - trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html - - # pcASV_Protein_ModelTest - modeltest-ng -i \${pre}_aln.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint - - # pcASV_Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} - - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 \${pre}_aln.fasta.log | head -1 | awk '{print \$6}') - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - - elif [ "${params.parametric}" != "false" ];then - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - - else - iqtree -s \${pre}_aln.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - done - """ - } - } - - process Generate_pcASV_Protein_Counts { - - label 'high_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Counts", mode: "copy", overwrite: true - - input: - file(fasta) from pcASV_aaCounts_ch - file(merged) from mergeforpcASVaacounts - file(samplist) from samplistpotu - - output: - tuple file("*_counts.csv"), file("*dmd.out") into potuaacounts_summary - file("*counts.csv") into potu_Acounts - - script: - """ - set +e - for filename in ${fasta};do - potu="\$( echo \${filename} | awk -F "_" '{print \$3}')" - diamond makedb --in \${filename} --db \${filename} - diamond blastx -q ${merged} -d \${filename} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_\${potu}_Counts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 - echo "OTU_ID" >tmp.col1.txt - echo "Generating sample id list" - grep ">" \${filename} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list - cat otuid.list >> tmp.col1.txt - echo "Beginning them counts tho my g" - for y in \$( cat ${samplist} );do - echo "Starting with \$y now ..." - grep "\$y" ${params.projtag}_\${potu}_Counts_dmd.out > tmp."\$y".out - echo "Isolated hits" - echo "Created uniq subject id list" - echo "\$y" > "\$y"_col.txt - echo "Starting my counts" - for z in \$(cat otuid.list);do - echo "Counting \$z hits" - echo "grep -wc "\$z" >> "\$y"_col.txt" - grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt - echo "\$z counted" - done - done - paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_\${potu}_counts.csv - rm tmp* - rm *col.txt - done - """ - } - } - - if (!params.skipReport) { - - if (!params.skipAdapterRemoval) { - - process combine_csv { - - input: - file(csv) from fastp_csv - .collect() - - output: - file("final_reads_stats.csv") into ( fastp_csv1, fastp_csv2, fastp_csv3, fastp_csv4, fastp_csv5 ) - - script: - """ - cat ${csv} >all_reads_stats.csv - head -n1 all_reads_stats.csv >tmp.names.csv - cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv - cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv - rm tmp.names.csv tmp.reads.stats.csv - """ - - } - } - - if (params.ncASV) { - - - process Report_ASV { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true - - input: - file(counts) from asv_counts_plots - file(taxonomy) from taxplot1 - file(matrix) from asv_heatmap - file(readsstats) from fastp_csv1 - - output: - file("*.html") into report_summaryA + } + } - script: - """ - name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_ReportA.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportA.Rmd',output_file='\${name}_ASV_Report.html')" \${name} \ - ${readsstats} \ - ${counts} \ - ${params.metadata} \ - ${params.minimumCounts} \ - ${matrix} \ - ${taxonomy} \ - ${params.trymax} \ - ${params.stats} - """ - } + if (params.pcASV) { // ASV_nucl -> ASV_aa -> clusteraa by %id with ch-hit -> extract representative nucl sequences to generate new OTU file - process Report_ncASV { + process Translation_For_pcASV_Generation { - label 'norm_cpus' + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/ncASV", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Translation", mode: "copy", overwrite: true, pattern: '*_ASV_translations*' - input: - file(counts) from notu_counts_plots - file(taxonomy) from taxplot1a - file(matrix) from notu_heatmap - file(phylogeny) from nucl_phyl_plot - file(readsstats) from fastp_csv2 + input: + file(fasta) from nucl2aa - output: - file("*.html") into report_summaryB + output: + file("*ASV*translations.fasta") into clustering_aa + file("*_ASV_translations_report") into reportaa_VR + file("*_ASV_nucleotide.fasta") into asvfastaforaaclust - script: - """ - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - for x in *_summary_for_plot.csv;do - name=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}') - id=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_ncASV\${id}_Report.html')" \${name} \ - ${readsstats} \ - \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ - ${params.metadata} \ - ${params.minimumCounts} \ - \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ - ${params.trymax} \ - ${params.stats} - done - """ + script: + """ + ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASV_translations.fasta --report ${params.projtag}_ASV_translations_report + cp ${fasta} ${params.projtag}_ASV_nucleotide.fasta + """ } - if (!params.skipAminoTyping) { - - process Report_AminoTypes { + process Generate_pcASVs { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV", mode: "copy", overwrite: true, pattern: '*pcASV*.{fasta}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{clstr,csv,gc}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/pcASV/Problematic", mode: "copy", overwrite: true, pattern: '*problem*.{fasta}' input: - file(counts) from aminocounts_plot - file(taxonomy) from taxplot2 - file(matrix) from aminotype_heatmap - file(phylogeny) from amino_rax_plot - file(readsstats) from fastp_csv5 + each x from 1..naa + file(fasta) from clustering_aa + file(asvs) from asvfastaforaaclust output: - file("*.html") into report_summaryE + tuple nid, file("${params.projtag}_nucleotide_pcASV*.fasta") into ( pcASV_ntDiamond_ch, pcASV_nt_counts_ch, pcASV_ntmatrix_ch, pcASV_ntmafft_ch ) + tuple nid, file("*_aminoacid_pcASV*_noTaxonomy.fasta") into ( pcASV_aaMatrix_ch, pcASV_aaDiamond_ch, pcASV_aaMafft_ch, pcASV_aaCounts_ch, pcASVEMBOSS ) + tuple nid, file("*.fasta"), file("*.clstr"), file("*.csv"), file("*.gc") into ( pcASVsupplementalfiles ) script: + // add awk script to count seqs + nid=slist2.get(x-1) + mtag="ID=" + slist2.get(x-1) """ - name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_AminoType_Report.html')" \${name} \ - ${readsstats} \ - ${counts} \ - ${params.metadata} \ - ${params.minimumCounts} ${matrix} \ - ${taxonomy} \ - ${phylogeny} \ - ${params.trymax} \ - ${params.stats} + set +e + cp ${params.vampdir}/bin/rename_seq.py . + awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta + cd-hit -i ${params.projtag}_filtered_proteins.fasta -c .${nid} -o ${params.projtag}_pcASV${nid}.fasta + sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV${nid}.fasta.clstr >${params.projtag}_pcASV${nid}.clstr + grep ">Cluster_" ${params.projtag}_pcASV${nid}.clstr >temporaryclusters.list + y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV${nid}.clstr) + echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV${nid}.clstr + t=1 + b=1 + for x in \$(cat temporaryclusters.list);do + echo "Extracting \$x" + name="\$( echo \$x | awk -F ">" '{print \$2}')" + clust="pcASV"\${t}"" + echo "\${name}" + awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV${nid}.clstr > "\${name}"_"\${clust}"_tmp.list + t=\$(( \${t}+1 )) + b=\$(( \${b}+1 )) + done + + ls *_tmp.list + u=1 + for x in *_tmp.list;do + name="\$(echo \$x | awk -F "_p" '{print \$1}')" + echo "\${name}" + cluster="\$(echo \$x | awk -F "_" '{print \$3}')" + echo "\${cluster}" + grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list + seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta + vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta + grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list + for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do + echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders + u=\$(( \${u}+1 )) + done + u=1 + ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta + done + cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV${nid}_noTaxonomy.fasta + grep -w "*" ${params.projtag}_pcASV${nid}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list + grep -w "*" ${params.projtag}_pcASV${nid}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list + paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv + grep ">" ${params.projtag}_pcASV${nid}.fasta >lala.list + j=1 + for x in \$(cat lala.list);do + echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list + echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv + j=\$(( \${j}+1 )) + done + rm lala.list + awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list + for x in \$(cat tmporder.list);do + grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list + done + paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster${nid}_summary.csv + ./rename_seq.py ${params.projtag}_pcASV${nid}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV${nid}_noTaxonomy.fasta + stats.sh in=${params.projtag}_aminoacid_pcASV${nid}_noTaxonomy.fasta gc=${params.projtag}_pcASV${nid}_aminoacid_clustered.gc gcformat=4 + stats.sh in=${params.projtag}_nucleotide_pcASV${nid}_noTaxonomy.fasta gc=${params.projtag}_pcASV${nid}_nucleotide_clustered.gc gcformat=4 + awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV${nid}_problematic_translations.fasta + if [ `wc -l ${params.projtag}_pcASV${nid}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then + grep ">" ${params.projtag}_pcASV${nid}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list + seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV${nid}_problematic_nucleotides.fasta + else + rm ${params.projtag}_pcASV${nid}_problematic_translations.fasta + fi + rm *.list + rm Cluster* + rm *types* + rm *tmp* + rm ${params.projtag}_pcASV${nid}.fast* """ } - } - } else { - process Report_ASVs { + if (!params.skipTaxonomy) { - label 'norm_cpus' + if (params.headers == "RefSeq") { + + process pcASV_Nucleotide_Taxonomy_Inference_RefSeq { - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true + label 'high_cpus' + + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' input: - file(counts) from asv_counts_plots - file(taxonomy) from taxplot1 - file(matrix) from asv_heatmap - file(phylogeny) from nucl_phyl_plot - file(readsstats) from fastp_csv1 + tuple nid, file(asvs) from pcASV_ntDiamond_ch output: - file("*.html") into report_summaryA + file("*.fasta") into ( pcASV_labeled ) + tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond + tuple nid, file("*_summary_for_plot.csv") into taxplot3 + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvnt script: + mtag="ID=" + nid """ - name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_ASV_Report.html')" \${name} \ - ${readsstats} \ - ${counts} \ - ${params.metadata} \ - ${params.minimumCounts} \ - ${matrix} \ - ${taxonomy} \ - ${phylogeny} \ - ${params.trymax} \ - ${params.stats} + set +e + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[pcASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo "\$s done." + fi + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list """ - } - - if (!params.skipAminoTyping) { - - process Report_AminoType { - - label 'norm_cpus' - - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport", mode: "copy", overwrite: true - - input: - file(counts) from aminocounts_plot - file(taxonomy) from taxplot2 - file(matrix) from aminotype_heatmap - file(phylogeny) from amino_rax_plot - file(readsstats) from fastp_csv5 - - output: - file("*.html") into report_summaryE - - script: - """ - name=\$( echo ${taxonomy} | awk -F "_summary_for_plot.csv" '{print \$1}') - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_AminoType_Report.html')" \${name} \ - ${readsstats} \ - ${counts} \ - ${params.metadata} \ - ${params.minimumCounts} ${matrix} \ - ${taxonomy} \ - ${phylogeny} \ - ${params.trymax} \ - ${params.stats} - """ } + } else if (params.headers == "RVDB") { + + process pcASV_Nucleotide_Taxonomy_Inference_RVDB { + + label 'high_cpus' + + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' + + input: + tuple nid, file(asvs) from pcASV_ntDiamond_ch + + output: + file("*.fasta") into ( pcASV_labeled ) + tuple file("*_phyloformat.csv"), file("*_summaryTable.tsv"), file("*dmd.out") into summary_AAdiamond + tuple nid, file("*_summary_for_plot.csv") into taxplot3 + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvnt + + script: + mtag="ID=" + nid + """ + set +e + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[pcASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lca} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Classification]" > classfication.list + else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + echo "[Classification]" > classfication.list + fi + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> classfication.list + fi + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then echo "N/A" >> classfication.list + fi + echo "\$s done." + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + if [[ "${params.lca}" == "T" ]] + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + fi + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ } } + } - if (params.pcASV) { - process Report_pcASV_AminoAcid { + process Generate_Nucleotide_pcASV_Counts { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/pcASV/Aminoacid", mode: "copy", overwrite: true + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Counts", mode: "copy", overwrite: true, pattern: '*.{biome,csv,txt}' input: - file(counts) from potu_Acounts - file(taxonomy) from taxplot4 - file(matrix) from potu_aa_heatmap - file(phylogeny) from potu_Atree_plot - file(readsstats) from fastp_csv3 + tuple nid, file(potus) from pcASV_nt_counts_ch + file(merged) from pcASV_mergedreads_ch output: - file("*.html") into report_summaryC + tuple file("*_counts.txt"), file("*_counts.biome") into pcASVcounts_vsearch + tuple nid, file("*.csv") into potu_Ncounts_for_report script: + mtag="ID=" + nid """ - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - for x in *_summary_for_plot.csv;do - name=\$( echo \${x} | awk -F "_noTaxonomy_summary_for_plot.csv" '{print \$1}') - id=\$( echo \${x} | awk -F "_noTaxonomy_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_pcASVaa\${id}_Report.html')" \${name} \ - ${readsstats} \ - \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ - ${params.metadata} \ - ${params.minimumCounts} \ - \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ - ${params.trymax} \ - ${params.stats} - done + name=\$( echo ${potus} | awk -F ".fasta" '{print \$1}') + vsearch --usearch_global ${merged} --db ${potus} --id .${nid} --threads ${task.cpus} --otutabout \${name}_counts.txt --biomout \${name}_counts.biome + cat \${name}_counts.txt | tr "\t" "," >\${name}_count.csv + sed 's/#OTU ID/OTU_ID/g' \${name}_count.csv >\${name}_counts.csv + rm \${name}_count.csv """ - } + } - process Report_pcASV_Nucleotide { + process Generate_pcASV_Nucleotide_Matrix { - label 'norm_cpus' + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReport/pcASV/Nucleotide", mode: "copy", overwrite: true + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Matrix", mode: "copy", overwrite: true input: - file(counts) from potu_Ncounts_for_report - file(taxonomy) from taxplot3 - file(matrix) from potu_nucl_heatmap - file(phylogeny) from potu_Ntree_plot - file(readsstats) from fastp_csv4 + tuple nid, file(potus) from pcASV_ntmatrix_ch output: - file("*.html") into report_summaryD + file("*.matrix") into pcASVclustmatrices + tuple nid, file("*PercentID.matrix") into potu_nucl_heatmap script: + //check --percent-id second clustalo + mtag="ID=" + nid """ - cp ${params.vampdir}/bin/vAMPirus_ReportB.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - for x in *_summary_for_plot.csv;do - name=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}') - id=\$( echo \${x} | awk -F "_summary_for_plot.csv" '{print \$1}' | cut -f 2 -d "." ) - Rscript -e "rmarkdown::render('vAMPirus_ReportB.Rmd',output_file='\${name}_pcASVnt\${id}_Report.html')" \${name} \ - ${readsstats} \ - \$( echo ${counts} | tr " " "\\n" | grep "\${id}" ) \ - ${params.metadata} \ - ${params.minimumCounts} \ - \$( echo ${matrix} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${taxonomy} | tr " " "\\n" | grep "\${id}" ) \ - \$( echo ${phylogeny} | tr " " "\\n" | grep "\${id}" ) \ - ${params.trymax} \ - ${params.stats} - done + name=\$( echo ${potus} | awk -F ".fasta" '{print \$1}') + clustalo -i ${potus} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} + clustalo -i ${potus} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + cat \${name}_PercentIDq.matrix | tr " " "," | grep "," >\${name}_PercentID.matrix + rm \${name}_PercentIDq.matrix """ } - } - } - -} else if (params.DataCheck) { - - println("\n\tRunning vAMPirus DataCheck \n") - - process QualityCheck_1DC { - - label 'low_cpus' - - tag "${sample_id}" - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/FastQC/PreClean", mode: "copy", overwrite: true - - input: - tuple sample_id, file(reads) from reads_qc_ch - - output: - tuple sample_id, file("*_fastqc.{zip,html}") into fastqc_results_OAS - - script: - """ - fastqc --quiet --threads ${task.cpus} ${reads} - """ - } - - process Adapter_Removal_DC { - - label 'norm_cpus' - - tag "${sample_id}" - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/AdapterRemoval", mode: "copy", overwrite: true, pattern: "*.filter.fq" - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/AdapterRemoval/fastpOut", mode: "copy", overwrite: true, pattern: "*.fastp.{json,html}" - - input: - tuple sample_id, file(reads) from reads_ch - - output: - tuple sample_id, file("*.fastp.{json,html}") into fastp_results - tuple sample_id, file("*.filter.fq") into reads_fastp_ch - file("*.csv") into fastp_csv - - script: - """ - echo ${sample_id} - - fastp -i ${reads[0]} -I ${reads[1]} -o left-${sample_id}.filter.fq -O right-${sample_id}.filter.fq --detect_adapter_for_pe \ - --average_qual 25 -c --overrepresentation_analysis --html ${sample_id}.fastp.html --json ${sample_id}.fastp.json --thread ${task.cpus} \ - --report_title ${sample_id} - - bash get_readstats.sh ${sample_id}.fastp.json - """ - } - - process Primer_Removal_DC { - label 'norm_cpus' - - tag "${sample_id}" - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/PrimerRemoval", mode: "copy", overwrite: true - - input: - tuple sample_id, file(reads) from reads_fastp_ch - - output: - tuple sample_id, file("*bbduk*.fastq.gz") into ( reads_bbduk_ch, readsforqc2 ) - - script: - // add cocktail primer removal, easy, set a list, line by line seperated by , in a for loop - if ( params.fwd == "" && params.rev == "" && !params.multi) { - """ - bbduk.sh in1=${reads[0]} out=${sample_id}_bb_R1.fastq.gz ftl=${params.defaultFwdTrim} t=${task.cpus} - bbduk.sh in=${reads[1]} out=${sample_id}_bb_R2.fastq.gz ftl=${params.defaultRevTrim} t=${task.cpus} - repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz minlength=${params.minilen} outs=sing.fq repair - """ - } else if ( params.GlobTrim && !params.GlobTrim == "" ) { - """ - FTRIM=\$( echo ${GlobTrim} | cut -f 1 -d "," ) - RTRIM=\$( echo ${GlobTrim} | cut -f 2 -d "," ) - bbduk.sh in=${reads[0]} out=${sample_id}_bb_R1.fastq.gz ftl=\${FTRIM} t=${task.cpus} - bbduk.sh in=${reads[1]} out=${sample_id}_bb_R2.fastq.gz ftl=\${RTRIM} t=${task.cpus} - repair.sh in1=${sample_id}_bb_R1.fastq.gz in2=${sample_id}_bb_R2.fastq.gz out1=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz minlength=${params.minilen} outs=sing.fq repair - """ - } else if ( params.multi && params.primers ) { - """ - bbduk.sh in=${reads[0]} in2=${reads[1]} out=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz ref=${params.primers} copyundefined=t t=${task.cpus} restrictleft=${params.primerLength} k=${params.maxkmer} ordered=t mink=${params.minkmer} ktrim=l ecco=t rcomp=t minlength=${params.minilen} tbo tpe - """ - } else { - """ - bbduk.sh in=${reads[0]} in2=${reads[1]} out=${sample_id}_bbduk_R1.fastq.gz out2=${sample_id}_bbduk_R2.fastq.gz literal=${params.fwd},${params.rev} copyundefined=t t=${task.cpus} restrictleft=${params.primerLength} k=${params.maxkmer} ordered=t mink=${params.minkmer} ktrim=l ecco=t rcomp=t minlength=${params.minilen} tbo tpe - """ - } - } - - process QualityCheck_2_DC { - - label 'low_cpus' - - tag "${sample_id}" - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/FastQC/PostClean", mode: "copy", overwrite: true - - input: - tuple sample_id, file(reads) from readsforqc2 - - output: - tuple sample_id, file("*_fastqc.{zip,html}") into fastqc2_results_OAS - - script: - """ - fastqc --quiet --threads ${task.cpus} ${reads} - """ - } - - process Read_Merging_DC { - - label 'norm_cpus' - - tag "${sample_id}" - - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Individual", mode: "copy", overwrite: true, pattern: "*mergedclean.fastq" - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Individual/notmerged", mode: "copy", overwrite: true, pattern: "*notmerged*.fastq" - - input: - tuple sample_id, file(reads) from reads_bbduk_ch + if (!params.skipPhylogeny) { - output: - file("*_mergedclean.fastq") into reads_vsearch1_ch - file("*.name") into names - file("*notmerged*.fastq") into notmerged - - script: - """ - vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxee ${params.maxEE} --relabel ${sample_id}. - echo ${sample_id} > ${sample_id}.name - """ - - } + process pcASV_Nucleotide_Phylogeny { - process Compile_Reads_DC { + label 'norm_cpus' - label 'low_cpus' + tag "${mtag}" - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - input: - file(reads) from reads_vsearch1_ch - .collect() + input: + tuple nid, file(reads) from pcASV_ntmafft_ch - output: - file("*_all_merged_preFilt_preClean.fastq") into collect_samples_ch + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_nucleotide_phylogeny_results + tuple nid, file("*iq.treefile") into potu_Ntree_plot - script: - """ - cat ${reads} >>${params.projtag}_all_merged_preFilt_preClean.fastq - """ - } + script: + mtag="ID=" + nid + """ + pre=\$( echo ${reads} | awk -F "_noTax" '{print \$1}' ) + mafft --maxiterate 5000 --auto ${reads} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta + mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta + # pcASV_Nucleotide_ModelTest + modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_noTaxonomy_mt -d nt -s 203 --disable-checkpoint - process Compile_Names_DC { + # pcASV_Nucleotide_Phylogeny + if [ "${params.iqCustomnt}" != "" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq --redo -T auto ${params.iqCustomnt} - label 'low_cpus' + elif [[ "${params.ModelTnt}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo-nt auto -b ${params.boots} - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging", mode: "copy", overwrite: true + elif [[ "${params.ModelTnt}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - input: - file(names) from names - .collect() + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -b ${params.boots} - output: - file("*sample_ids.list") into ( samplelist, samplistpotu ) + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - script: - """ - cat ${names} >>${params.projtag}_sample_ids.list - """ - } + else + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_noTaxonomy_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } + } - process Length_Filtering_DC { + process pcASV_AminoAcid_Matrix { - label 'norm_cpus' + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/LengthFiltering", mode: "copy", overwrite: true, pattern: "*_merged_preFilt*.fasta" - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging", mode: "copy", overwrite: true, pattern: "*Lengthfiltered.fastq" - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Histograms/pre_length_filtering", mode: "copy", overwrite: true, pattern: "*preFilt_*st.txt" - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Histograms/post_length_filtering", mode: "copy", overwrite: true, pattern: "*postFilt_*st.txt" + tag "${mtag}" - input: - file(reads) from collect_samples_ch + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Matrix", mode: "copy", overwrite: true - output: - file("*_merged_preFilt_clean.fasta") into ( nuclCounts_mergedreads_ch, pcASV_mergedreads_ch ) - file("*_merged_clean_Lengthfiltered.fastq") into reads_vsearch2_ch - - file("*preFilt_preClean_baseFrequency_hist.csv") into prefilt_basefreq - file("*preFilt_preClean_qualityScore_hist.csv") into prefilt_qualityscore - file("*preFilt_preClean_gcContent_hist.csv") into prefilt_gccontent - file("*preFilt_preClean_averageQuality_hist.csv") into prefilt_averagequality - file("*preFilt_preClean_length_hist.csv") into prefilt_length - - file("*postFilt_baseFrequency_hist.csv") into postFilt_basefreq - file("*postFilt_qualityScore_hist.csv") into postFilt_qualityscore - file("*postFilt_gcContent_hist.csv") into postFilt_gccontent - file("*postFilt_averageQuaulity_hist.csv") into postFilt_averagequality - file("*postFilt_length_hist.csv") into postFilt_length - - file("reads_per_sample_preFilt_preClean.csv") into reads_per_sample_preFilt - file("read_per_sample_postFilt_postClean.csv") into reads_per_sample_postFilt - script: - """ - bbduk.sh in=${reads} bhist=${params.projtag}_all_merged_preFilt_preClean_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_preFilt_preClean_qualityScore_hist.txt gchist=${params.projtag}_all_merged_preFilt_preClean_gcContent_hist.txt aqhist=${params.projtag}_all_merged_preFilt_preClean_averageQuality_hist.txt lhist=${params.projtag}_all_merged_preFilt_preClean_length_hist.txt gcbins=auto - for x in *preFilt*hist.txt;do - pre=\$(echo \$x | awk -F ".txt" '{print \$1}') - cat \$x | tr "\t" "," > \${pre}.csv - rm \$x - done - reformat.sh in=${reads} out=${params.projtag}_preFilt_preclean.fasta t=${task.cpus} - echo "sample,reads" >> reads_per_sample_preFilt_preClean.csv - grep ">" ${params.projtag}_preFilt_preclean.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> reads_per_sample_preFilt_preClean.csv - rm ${params.projtag}_preFilt_preclean.fasta - fastp -i ${reads} -o ${params.projtag}_merged_preFilt_clean.fastq -b ${params.maxLen} -l ${params.minLen} --thread ${task.cpus} -n 1 - reformat.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_preFilt_clean.fasta t=${task.cpus} - bbduk.sh in=${params.projtag}_merged_preFilt_clean.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fastq minlength=${params.maxLen} maxlength=${params.maxLen} t=${task.cpus} - bbduk.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq bhist=${params.projtag}_all_merged_postFilt_baseFrequency_hist.txt qhist=${params.projtag}_all_merged_postFilt_qualityScore_hist.txt gchist=${params.projtag}_all_merged_postFilt_gcContent_hist.txt aqhist=${params.projtag}_all_merged_postFilt_averageQuaulity_hist.txt lhist=${params.projtag}_all_merged_postFilt_length_hist.txt gcbins=auto - for x in *postFilt*hist.txt;do - pre=\$(echo \$x | awk -F ".txt" '{print \$1}') - cat \$x | tr "\t" "," > \${pre}.csv - rm \$x - done - reformat.sh in=${params.projtag}_merged_clean_Lengthfiltered.fastq out=${params.projtag}_merged_clean_Lengthfiltered.fasta t=${task.cpus} - echo "sample,reads" >> read_per_sample_postFilt_postClean.csv - grep ">" ${params.projtag}_merged_clean_Lengthfiltered.fasta | awk -F ">" '{print \$2}' | awk -F "." '{print \$1}' | sort --parallel=${task.cpus} | uniq -c | sort -brg --parallel=${task.cpus} | awk '{print \$2","\$1}' >> read_per_sample_postFilt_postClean.csv - """ - } + input: + tuple nid, file(prot) from pcASV_aaMatrix_ch - process Extract_Uniques_DC { + output: + file("*.matrix") into pcASVaaMatrix + tuple nid, file("*PercentID.matrix") into potu_aa_heatmap - label 'norm_cpus' + script: + mtag="ID=" + nid + """ + name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') + clustalo -i ${prot} --distmat-out=\${name}_PairwiseDistanceq.matrix --full --force --threads=${task.cpus} + clustalo -i ${prot} --distmat-out=\${name}_PercentIDq.matrix --percent-id --full --force --threads=${task.cpus} + cat \${name}_PercentIDq.matrix | tr " " "," | grep "," >\${name}_PercentID.matrix + rm \${name}_PercentIDq.matrix + """ + } - publishDir "${params.workingdir}/${params.outdir}/DataCheck/ReadProcessing/ReadMerging/Uniques", mode: "copy", overwrite: true + if (!params.skipEMBOSS) { - input: - file(reads) from reads_vsearch2_ch + process pcASV_EMBOSS_Analyses { - output: - file("*unique_sequences.fasta") into reads_vsearch3_ch + label 'low_cpus' - script: - """ - vsearch --derep_fulllength ${reads} --sizeout --relabel_keep --output ${params.projtag}_unique_sequences.fasta - """ - } + tag "${mtag}" - process Identify_ASVs_DC { + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure", mode: "copy", overwrite: true, pattern: '*.{garnier}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/HydrophobicMoment", mode: "copy", overwrite: true, pattern: '*HydrophobicMoments.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/IsoelectricPoint", mode: "copy", overwrite: true, pattern: '*IsoelectricPoint.{iep,svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties", mode: "copy", overwrite: true, pattern: '*.{pepstats,pepinfo}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/ProteinProperties/Plots", mode: "copy", overwrite: true, pattern: '*PropertiesPlot.{svg}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/EMBOSS/2dStructure/Plots", mode: "copy", overwrite: true, pattern: '*Helical*.{svg}' - label 'norm_cpus' + input: + tuple nid, file(prot) from pcASVEMBOSS - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/ASVs/ChimeraCheck", mode: "copy", overwrite: true + output: + tuple file("*.garnier"), file("*HydrophobicMoments.svg"), file("*IsoelectricPoint*"), file("*.pepstats"), file("*PropertiesPlot*"), file("*Helical*") into pcASV_emboss - input: - file(reads) from reads_vsearch3_ch + script: + // check do I need for loop + mtag="ID=" + nid + """ + name=\$( echo ${prot} | awk -F ".fasta" '{print \$1}') + garnier -sequence ${prot} -outfile \${name}_2dStructures.garnier + hmoment -seqall ${prot} -graph svg -plot + mv hmoment.svg ./"\${name}"_HydrophobicMoments.svg + iep -sequence ${prot} -graph svg -plot -outfile "\${name}"_IsoelectricPoint.iep + mv iep.svg ./"\${name}"_IsoelectricPoint.svg + pepstats -sequence ${prot} -outfile \${name}_ProteinProperties.pepstats + grep ">" ${prot} | awk -F ">" '{print \$2}' > tmpsequence.list + for x in \$(cat tmpsequence.list);do + echo \$x > tmp1.list + seqtk subseq ${prot} tmp1.list > tmp2.fasta + len=\$(tail -1 tmp2.fasta | awk '{print length}') + pepinfo -sequence tmp2.fasta -graph svg -outfile "\$x"_PropertiesPlot.pepinfo + mv pepinfo.svg ./"\$x"_PropertiesPlot.svg + cat "\$x"_PropertiesPlot.pepinfo >> "\${name}"_PropertiesPlot.pepinfo + rm "\$x"_PropertiesPlot.pepinfo + pepnet -sask -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepnet.svg ./"\$x"_HelicalNet.svg + pepwheel -sequence tmp2.fasta -graph svg -sbegin1 1 -send1 \$len + mv pepwheel.svg ./"\$x"_HelicalWheel.svg + rm tmp1.list tmp2.fasta + done + rm tmpsequence.list + """ + } + } - output: - file("*notChecked.fasta") into reads_vsearch4_ch + if (!params.skipTaxonomy) { - script: - """ - vsearch --cluster_unoise ${reads} --unoise_alpha ${params.alpha} --relabel ASV --centroids ${params.projtag}_notChecked.fasta --minsize ${params.minSize} - """ - } + if (params.headers == "RefSeq") { - process Chimera_Check_DC { + process pcASV_AminoAcid_Taxonomy_Inference_RefSeq { - label 'norm_cpus' + label 'high_cpus' - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/ASVs", mode: "copy", overwrite: true + tag "${mtag}" - input: - file(fasta) from reads_vsearch4_ch + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' - output: - file("*ASVs.fasta") into ( reads_vsearch5_ch, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) + input: + tuple nid, file(asvs) from pcASV_aaDiamond_ch - script: - """ - vsearch --uchime3_denovo ${fasta} --relabel ASV --nonchimeras ${params.projtag}_ASVs.fasta - """ - } + output: + file("*.fasta") into ( pcASV_labeledAA ) + tuple file("*phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond + tuple nid, file("*_summary_for_plot.csv") into taxplot4 + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvaa - process NucleotideBased_ASV_clustering_DC { + script: + mtag="ID=" + nid + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[pcASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Checking for \$s hit in diamond output" + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "." '{ print \$2 }' | awk -F "[" '{ print \$1 }' | awk -F " " print substr(\$0, index(\$0,\$2)) | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + echo "\$s done." + fi + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ + } + } else if (params.headers == "RVDB") { + + process pcASV_AminoAcid_Taxonomy_Inference_RVDB { + + label 'high_cpus' + + tag "${mtag}" + + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/SummaryFiles", mode: "copy", overwrite: true, pattern: '*.{csv,tsv}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy/DiamondOutput", mode: "copy", overwrite: true, pattern: '*dmd.{out}' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Taxonomy", mode: "copy", overwrite: true, pattern: '*.{fasta}' + + input: + tuple nid, file(asvs) from pcASV_aaDiamond_ch + + output: + file("*.fasta") into ( pcASV_labeledAA ) + tuple file("*phyloformat.csv"), file("*summaryTable.tsv"), file("*dmd.out") into summary_potuaadiamond + tuple nid, file("*_summary_for_plot.csv") into taxplot4 + tuple nid, file("*_quick_Taxbreakdown.csv") into tax_table_pcasvaa + + script: + mtag="ID=" + nid + """ + cp ${params.vampdir}/bin/rename_seq.py . + virdb=${params.dbdir}/${params.dbname} + grep ">" \${virdb} > headers.list + headers="headers.list" + name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + echo "Preparing lists to generate summary .csv's" + echo "[Best hit accession number]" > access.list + echo "[e-value]" > evalue.list + echo "[Bitscore]" > bit.list + echo "[Percent ID (aa)]" > pid.list + echo "[Organism ID]" > "\$name"_virus.list + echo "[Gene]" > "\$name"_genes.list + echo "[pcASV#]" > otu.list + echo "[Sequence length]" > length.list + grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lca} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Classification]" > classfication.list + else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + echo "[Classification]" > classfication.list + fi + echo "extracting genes and names" + touch new_"\$name"_asvnames.txt + for s in \$(cat seqids.lst);do + echo "Using RVDB headers." + if [[ "\$(grep -wc "\$s" "\$name"_dmd.out)" -eq 1 ]];then + echo "Yep, there was a hit for \$s" + echo "Extracting the information now:" + acc=\$(grep -w "\$s" "\$name"_dmd.out | awk '{print \$3}' | awk -F "|" '{print \$3}') + echo "\$s" >> otu.list + echo "\$acc" >> access.list + line="\$(grep -w "\$s" "\$name"_dmd.out)" + echo "\$line" | awk '{print \$10}' >> evalue.list + echo "\$line" | awk '{print \$11}' >> bit.list + echo "\$line" | awk '{print \$12}' >> pid.list + echo "\$line" | awk '{print \$2}' >> length.list + echo "Extracting virus and gene ID for \$s now" + gene=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$1 }' | sed 's/ /_/g') && + echo "\$gene" | sed 's/_/ /g' >> "\$name"_genes.list + virus=\$(grep -w "\$acc" "\$headers" | awk -F "|" '{ print \$6 }' | awk -F "[" '{ print \$2 }' | awk -F "]" '{print \$1}' | sed 's/ /_/g') && + echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> classfication.list + fi + echo "\$s done." + else + echo "Ugh, there was no hit for \$s .." + echo "We still love \$s though and we will add it to the final fasta file" + echo "\$s" >> otu.list + echo "NO_HIT" >> access.list + echo "NO_HIT" >> "\$name"_genes.list + echo "NO_HIT" >> "\$name"_virus.list + echo "NO_HIT" >> evalue.list + echo "NO_HIT" >> bit.list + echo "NO_HIT" >> pid.list + echo "NO_HIT" >> length.list + virus="NO" + gene="HIT" + echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then echo "N/A" >> classfication.list + fi + echo "\$s done." + fi + echo "Done with \$s" + done + echo "Now editing "\$name" fasta headers" + ###### rename_seq.py + ./rename_seq.py ${asvs} new_"\$name"_asvnames.txt "\$name"_TaxonomyLabels.fasta + awk 'BEGIN {RS=">";FS="\\n";OFS=""} NR>1 {print ">"\$1; \$1=""; print}' "\$name"_TaxonomyLabels.fasta >"\$name"_tmpssasv.fasta + echo "[Sequence header]" > newnames.list + cat new_"\$name"_asvnames.txt >> newnames.list + touch sequence.list + echo " " > sequence.list + grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list + rm "\$name"_tmpssasv.fasta + if [[ "${params.lca}" == "T" ]] + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + fi + for x in *phyloformat.csv;do + echo "\$x" + lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) + tail -"\$lin" \$x | awk -F "," '{print \$2}' > tmpcol.list; + sed 's/ /_/g' tmpcol.list > tmp2col.list; + cat tmp2col.list | sort | uniq -c | sort -nr | awk '{print \$2","\$1}' > \${name}_summary_for_plot.csv; + rm tmpcol.list tmp2col.list + done + rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list + """ + } + } + } - label 'norm_cpus' + if (!params.skipPhylogeny) { - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Nucleotide", mode: "copy", overwrite: true, pattern: '*{.csv}' + process pcASV_Protein_Phylogeny { - input: - file(fasta) from reads_vsearch5_ch + label 'norm_cpus' - output: - file("number_per_percentage_nucl.csv") into number_per_percent_nucl_plot + tag "${mtag}" - script: - if (params.datacheckntIDlist) { - """ - for id in `echo ${params.datacheckntIDlist} | tr "," "\\n"`;do - vsearch --cluster_fast ${fasta} --centroids ${params.projtag}_ncASV\${id}.fasta --threads ${task.cpus} --relabel OTU --id \${id} - done - for x in *ncASV*.fasta;do - id=\$( echo \$x | awk -F "_ncASV" '{print \$2}' | awk -F ".fasta" '{print \$1}') - numb=\$( grep -c ">" \$x ) - echo "\${id},\${numb}" >> number_per_percentage_nucl.csv - done - yo=\$(grep -c ">" ${fasta}) - echo "1.0,\${yo}" >> number_per_percentage_nucl.csv - """ - } - } + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Alignment", mode: "copy", overwrite: true, pattern: '*aln.*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' + input: + tuple nid, file(prot) from pcASV_aaMafft_ch - if (params.sing) { + output: + tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_protein_phylogeny_results + tuple nid, file("*iq.treefile") into potu_Atree_plot - process Translating_For_ProteinClustering_DC { + script: + mtag="ID=" + nid + """ + pre=\$( echo ${prot} | awk -F ".fasta" '{print \$1}' ) + mafft --maxiterate 5000 --auto ${prot} >\${pre}_ALN.fasta + trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html + o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta + mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta + # pcASV_Protein_ModelTest + modeltest-ng -i \${pre}_Aligned_informativeonly.fasta -p ${task.cpus} -o \${pre}_mt -d aa -s 203 --disable-checkpoint - label 'low_cpus' + # pcASV_Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq --redo -T auto ${params.iqCustomaa} - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -b ${params.boots} - input: - file(fasta) from nucl2aa + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 \${pre}_Aligned_informativeonly.fasta.log | head -1 | awk '{print \$6}') + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - output: - file("*ASVprotforclust.fasta") into clustering_aa - file("*_translation_report") into reportaa_VR - file("*_ASV_all.fasta") into asvfastaforaaclust + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} - script: - """ - conda init && source activate virtualribosome + elif [ "${params.parametric}" != "false" ];then + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report - cp ${fasta} ${params.projtag}_ASV_all.fasta + else + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } + } - """ + process Generate_pcASV_Protein_Counts { - } + label 'high_cpus' - } else { + tag "${mtag}" - process Translation_For_ProteinBased_Clustering_DC { + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Aminoacid/Counts", mode: "copy", overwrite: true - label 'norm_cpus' + input: + tuple nid, file(fasta) from pcASV_aaCounts_ch + file(merged) from mergeforpcASVaacounts + file(samplist) from samplistpotu - conda 'python=2.7' + output: + tuple file("*_counts.csv"), file("*dmd.out") into potuaacounts_summary + tuple nid, file("*counts.csv") into potu_Acounts - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid/translation", mode: "copy", overwrite: true + script: + // check do I need for loop + mtag="ID=" + nid + """ + set +e + potu="\$( echo ${fasta} | awk -F "_" '{print \$3}')" + diamond makedb --in ${fasta} --db ${fasta} + diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_\${potu}_Counts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 + echo "OTU_ID" >tmp.col1.txt + echo "Generating sample id list" + grep ">" ${fasta} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list + cat otuid.list >> tmp.col1.txt + echo "Beginning them counts tho my g" + for y in \$( cat ${samplist} );do + echo "Starting with \$y now ..." + grep "\$y" ${params.projtag}_\${potu}_Counts_dmd.out > tmp."\$y".out + echo "Isolated hits" + echo "Created uniq subject id list" + echo "\$y" > "\$y"_col.txt + echo "Starting my counts" + for z in \$(cat otuid.list);do + echo "Counting \$z hits" + echo "grep -wc "\$z" >> "\$y"_col.txt" + grep -wc "\$z" tmp."\$y".out >> "\$y"_col.txt + echo "\$z counted" + done + done + paste -d "," tmp.col1.txt *col.txt > ${params.projtag}_aminoacid_\${potu}_noTaxonomy_counts.csv + rm tmp* + rm *col.txt + """ + } + } - input: - file(fasta) from nucl2aa + if (!params.skipReport) { - output: - file("*ASVprotforclust.fasta") into clustering_aa - file("*_translation_report") into reportaa_VR - file("*_ASV_all.fasta") into asvfastaforaaclust + if (!params.skipAdapterRemoval || !params.skipReadProcessing || !params.skipMerging) { - script: - """ - ${tools}/virtualribosomev2/dna2pep.py ${fasta} -r all -x -o none --fasta ${params.projtag}_ASVprotforclust.fasta --report ${params.projtag}_translation_report - cp ${fasta} ${params.projtag}_ASV_all.fasta - """ - } - } + process combine_csv { - process Protein_clustering_DC { + input: + file(csv) from fastp_csv_in2 + .collect() - label 'norm_cpus' + output: + file("final_reads_stats.csv") into fastp_csv_in - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Clustering/Aminoacid", mode: "copy", overwrite: true, pattern: '*{.csv}' + script: + """ + cat ${csv} >all_reads_stats.csv + head -n1 all_reads_stats.csv >tmp.names.csv + cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv + cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv + rm tmp.names.csv tmp.reads.stats.csv + """ + } + } else { - input: - file(fasta) from clustering_aa - file(asvs) from asvfastaforaaclust + process skip_combine_csv { - output: - file("number_per_percentage_prot.csv") into number_per_percent_prot_plot + output: + file("filter_reads.txt") into fastp_csv_in - script: - // add awk script to count seqs - """ - set +e - cp ${params.vampdir}/bin/rename_seq.py . - for id in `echo ${params.datacheckaaIDlist} | tr "," "\\n"`;do - if [ \${id} == ".55" ];then - word=3 - elif [ \${id} == ".65" ];then - word=4 - else - word=5 - fi - awk 'BEGIN{RS=">";ORS=""}length(\$2)>="${params.minAA}"{print ">"\$0}' ${fasta} > ${params.projtag}_filtered_proteins.fasta - cd-hit -i ${params.projtag}_filtered_proteins.fasta -n \${word} -c \${id} -o ${params.projtag}_pcASV\${id}.fasta - sed 's/>Cluster />Cluster_/g' ${params.projtag}_pcASV\${id}.fasta.clstr >${params.projtag}_pcASV\${id}.clstr - grep ">Cluster_" ${params.projtag}_pcASV\${id}.clstr >temporaryclusters.list - y=\$(grep -c ">Cluster_" ${params.projtag}_pcASV\${id}.clstr) - echo ">Cluster_"\${y}"" >> ${params.projtag}_pcASV\${id}.clstr - t=1 - b=1 - for x in \$(cat temporaryclusters.list);do - echo "Extracting \$x" - name="\$( echo \$x | awk -F ">" '{print \$2}')" - clust="pcASV"\${t}"" - echo "\${name}" - awk '/^>'\${name}'\$/,/^>Cluster_'\${b}'\$/' ${params.projtag}_pcASV\${id}.clstr > "\${name}"_"\${clust}"_tmp.list - t=\$(( \${t}+1 )) - b=\$(( \${b}+1 )) - done - ls *_tmp.list - u=1 - for x in *_tmp.list;do - name="\$(echo \$x | awk -F "_p" '{print \$1}')" - echo "\${name}" - cluster="\$(echo \$x | awk -F "_" '{print \$3}')" - echo "\${cluster}" - grep "ASV" \$x | awk -F ", " '{print \$2}' | awk -F "_" '{print \$1}' | awk -F ">" '{print \$2}' > \${name}_\${cluster}_seqs_tmps.list - seqtk subseq ${asvs} \${name}_\${cluster}_seqs_tmps.list > \${name}_\${cluster}_nucleotide_sequences.fasta - vsearch --cluster_fast \${name}_\${cluster}_nucleotide_sequences.fasta --id 0.2 --centroids \${name}_\${cluster}_centroids.fasta - grep ">" \${name}_\${cluster}_centroids.fasta >> \${name}_\${cluster}_tmp_centroids.list - for y in \$( cat \${name}_\${cluster}_tmp_centroids.list );do - echo ">\${cluster}_type"\$u"" >> \${name}_\${cluster}_tmp_centroid.newheaders - u=\$(( \${u}+1 )) - done - u=1 - ./rename_seq.py \${name}_\${cluster}_centroids.fasta \${name}_\${cluster}_tmp_centroid.newheaders \${cluster}_types_labeled.fasta - done - cat *_types_labeled.fasta >> ${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$3}' | awk -F "." '{print \$1}' >tmphead.list - grep -w "*" ${params.projtag}_pcASV\${id}.clstr | awk '{print \$2}' | awk -F "," '{print \$1}' >tmplen.list - paste -d"," temporaryclusters.list tmphead.list >tmp.info.csv - grep ">" ${params.projtag}_pcASV\${id}.fasta >lala.list - j=1 - for x in \$(cat lala.list);do - echo ">${params.projtag}_pcASV\${j}" >>${params.projtag}_aminoheaders.list - echo "\${x},>${params.projtag}_pcASV\${j}" >>tmpaminotype.info.csv - j=\$(( \${j}+1 )) - done - rm lala.list - awk -F "," '{print \$2}' tmp.info.csv >>tmporder.list - for x in \$(cat tmporder.list);do - grep -w "\$x" tmpaminotype.info.csv | awk -F "," '{print \$2}' >>tmpder.list - done - paste -d "," temporaryclusters.list tmplen.list tmphead.list tmpder.list >${params.projtag}_pcASVCluster\${id}_summary.csv - ./rename_seq.py ${params.projtag}_pcASV\${id}.fasta ${params.projtag}_aminoheaders.list ${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta - stats.sh in=${params.projtag}_aminoacid_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_aminoacid_clustered.gc gcformat=4 overwrite=true - stats.sh in=${params.projtag}_nucleotide_pcASV\${id}_noTaxonomy.fasta gc=${params.projtag}_pcASV\${id}_nucleotide_clustered.gc gcformat=4 overwrite=true - awk 'BEGIN{RS=">";ORS=""}length(\$2)<"${params.minAA}"{print ">"\$0}' ${fasta} >${params.projtag}_pcASV\${id}_problematic_translations.fasta - if [ `wc -l ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk '{print \$1}'` -gt 1 ];then - grep ">" ${params.projtag}_pcASV\${id}_problematic_translations.fasta | awk -F ">" '{print \$2}' > problem_tmp.list - seqtk subseq ${asvs} problem_tmp.list > ${params.projtag}_pcASV\${id}_problematic_nucleotides.fasta - else - rm ${params.projtag}_pcASV\${id}_problematic_translations.fasta - fi - rm *.list - rm Cluster* - rm *types* - rm *tmp* - rm ${params.projtag}_pcASV\${id}.fast* - done - for x in *aminoacid*noTaxonomy.fasta;do - id=\$( echo \$x | awk -F "_noTax" '{print \$1}' | awk -F "pcASV" '{print \$2}') - numb=\$( grep -c ">" \$x) - echo "\${id},\${numb}" >> number_per_percentage_protz.csv - done - yesirr=\$( wc -l number_per_percentage_protz.csv | awk '{print \$1}') - tail -\$(( \${yesirr}-1 )) number_per_percentage_protz.csv > number_per_percentage_prot.csv - head -1 number_per_percentage_protz.csv >> number_per_percentage_prot.csv - rm number_per_percentage_protz.csv - """ - } + script: + """ + echo "Read processing steps skipped." >filter_reads.txt + """ + } + } - process combine_csv_DC { + //NEW REPORT !!!!!!!!!!!!!!!!! + /*Report_ASV + asv_counts_plots -> ${params.projtag}_ASV_counts.csv + taxplot1 -> ${params.projtag}_ASV_summary_for_plot.csv + asv_heatmap -> ${params.projtag}_ASV_PercentID.matrix + nucl_phyl_plot -> ${params.projtag}_ASV_iq.treefile + file("*_ASV_Grouping.csv") into asvgroupscsv + "${params.projtag}_ASV_Groupingcounts.csv") into asvgroupcounts + *_quick_Taxbreakdown.csv") into tax_table_asv + \\${params.projtag}_ASV_Group_Reps_iq.treefile + */ + + report_asv = Channel.create() + asv_counts_plots.mix(taxplot_asv, asv_heatmap, nucl_phyl_plot_asv, asvgroupscsv, asvgroupcounts, asv_group_rep_tree, tax_table_asv).flatten().buffer(size:8).dump(tag:'asv').into(report_asv) + + if (params.ncASV) { + report_ncasv = Channel.create() + notu_counts_plots.mix(taxplot_ncasv, notu_heatmap, nucl_phyl_plot_ncasv, tax_table_ncasv).groupTuple(by:0, size:5).dump(tag:'ncasv').into(report_ncasv) + /* + notu_counts_plots -> ${params.projtag}_ncASV${id}_counts.csv + taxplot1a -> ${params.projtag}_ncASV${id}_summary_for_plot.csv + notu_heatmap -> ${params.projtag}_ncASV${id}_PercentID.matrix + nucl_phyl_plot -> ${params.projtag}_ncASV${id}_iq.treefile + ${params.projtag}_ncASV${id}_quick_Taxbreakdown.csv + */ + } else { + report_ncasv = Channel.empty() + } - input: - file(csv) from fastp_csv - .collect() + if (params.pcASV) { + report_pcasv_aa = Channel.create() + potu_Acounts.mix(taxplot4, potu_aa_heatmap, potu_Atree_plot, tax_table_pcasvaa).groupTuple(by:0, size:5).dump(tag:'pcasv1').into(report_pcasv_aa) + /*Report_pcASV_AminoAcid + potu_Acounts -> ${params.projtag}_pcASV${id}_noTaxonomy_counts.csv + taxplot4 -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_summary_for_plot.csv + potu_aa_heatmap -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_PercentID.matrix + potu_Atree_plot -> ${params.projtag}_aminoacid_pcASV${id}_noTaxonomy_iq.treefile + tax_table_pcasvaa -> ${params.projtag}_aminoacid_pcASV${id}_quick_Taxbreakdown.csv + */ + report_pcasv_nucl = Channel.create() + potu_Ncounts_for_report.mix(taxplot3, potu_nucl_heatmap, potu_Ntree_plot, tax_table_pcasvnt).groupTuple(by:0, size:5).dump(tag:'pcasv2').into(report_pcasv_nucl) + /*Report_pcASV_Nucleotide + potu_Ncounts_for_report -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_counts.csv + taxplot3 -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_summary_for_plot.csv + potu_nucl_heatmap -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_PercentID.matrix + potu_Ntree_plot -> ${params.projtag}_nucleotide_pcASV${id}_noTaxonomy_iq.treefile + tax_table_pcasvnt -> ${params.projtag}_nucleotide_pcASV${id}_quick_Taxbreakdown.csv + */ + } else { + report_pcasv_aa = Channel.empty() + report_pcasv_nucl = Channel.empty() + } - output: - file("final_reads_stats.csv") into fastp_csv1 + if (!params.skipAminoTyping) { + report_aminotypes = Channel.create() + aminocounts_plot.mix(taxplot2, aminotype_heatmap, amino_rax_plot, atygroupscsv, amino_group_rep_tree, amino_groupcounts, tax_table_amino).flatten().buffer(size:8).dump(tag:'amino').into(report_aminotypes) + /* + Report_AminoTypes + aminocounts_plot -> ${params.projtag}_AminoType_counts.csv + taxplot2 -> ${params.projtag}_AminoTypes_summary_for_plot.csv + aminotype_heatmap -> ${params.projtag}_AminoTypes_PercentID.matrix + amino_rax_plot -> ${params.projtag}_AminoTypes_iq.treefile + atygroupscsv -> *_AminoType_Grouping.csv + amino_group_rep_tree -> ${params.projtag}_AminoType_Group_Reps_iq.treefile + params.projtag}_AminoType_Groupingcounts.csv") into amino_groupcounts + *_quick_Taxbreakdown.csv") into tax_table_amino + */ + } else { + report_aminotypes = Channel.empty() + } - script: - """ - cat ${csv} >all_reads_stats.csv - head -n1 all_reads_stats.csv >tmp.names.csv - cat all_reads_stats.csv | grep -v ""Sample,Total_"" >tmp.reads.stats.csv - cat tmp.names.csv tmp.reads.stats.csv >final_reads_stats.csv - rm tmp.names.csv tmp.reads.stats.csv - """ + report_all_ch = Channel.create() + report_asv.mix(report_ncasv, report_pcasv_aa, report_pcasv_nucl, report_aminotypes).map{it.flatten()}.dump(tag:'report').into(report_all_ch) - } + process Report { - process Report_DataCheck { + label 'norm_cpus' - label 'norm_cpus' + publishDir "${params.workingdir}/${params.outdir}/Analyze/FinalReports", mode: "copy", overwrite: true - publishDir "${params.workingdir}/${params.outdir}/DataCheck/Report", mode: "copy", overwrite: true, pattern: '*.{html}' + input: + file(csv) from fastp_csv_in + file(files) from report_all_ch - input: - file(fastpcsv) from fastp_csv1 - file(reads_per_sample_preFilt) from reads_per_sample_preFilt - file(read_per_sample_postFilt) from reads_per_sample_postFilt - file(preFilt_baseFrequency) from prefilt_basefreq - file(postFilt_baseFrequency) from postFilt_basefreq - file(preFilt_qualityScore) from prefilt_qualityscore - file(postFilt_qualityScore) from postFilt_qualityscore - file(preFilt_gcContent) from prefilt_gccontent - file(postFilt_gcContent) from postFilt_gccontent - file(preFilt_averageQuality) from prefilt_averagequality - file(postFilt_averageQuaulity) from postFilt_averagequality - file(preFilt_length) from prefilt_length - file(postFilt_length) from postFilt_length - file(number_per_percentage_nucl) from number_per_percent_nucl_plot - file(number_per_percentage_prot) from number_per_percent_prot_plot + output: + file("*.html") into report_all_out - output: - file("*.html") into datacheckreport + script: + """ + name=\$( ls *summary_for_plot.csv | awk -F "_summary_for_plot.csv" '{print \$1}') + cp ${params.vampdir}/bin/vAMPirus_Report.Rmd . + cp ${params.vampdir}/example_data/conf/vamplogo.png . + Rscript -e "rmarkdown::render('vAMPirus_Report.Rmd',output_file='\${name}_Report.html')" \${name} \ + ${params.skipReadProcessing} \ + ${params.skipMerging} \ + ${params.skipAdapterRemoval} \ + ${params.skipTaxonomy} \ + ${params.skipPhylogeny} \ + ${params.trymax} \ + ${params.stats} \ + ${params.metadata} \ + ${params.minimumCounts} + """ + } - script: - """ - cp ${params.vampdir}/bin/vAMPirus_DC_Report.Rmd . - cp ${params.vampdir}/example_data/conf/vamplogo.png . - Rscript -e "rmarkdown::render('vAMPirus_DC_Report.Rmd',output_file='${params.projtag}_DataCheck_Report.html')" ${params.projtag} \ - ${fastpcsv} \ - ${reads_per_sample_preFilt} \ - ${read_per_sample_postFilt} \ - ${preFilt_baseFrequency} \ - ${postFilt_baseFrequency} \ - ${preFilt_qualityScore} \ - ${postFilt_qualityScore} \ - ${preFilt_averageQuality} \ - ${postFilt_averageQuaulity} \ - ${preFilt_length} \ - ${postFilt_length} \ - ${number_per_percentage_nucl} \ - ${number_per_percentage_prot} - """ - } + } + } } else { println("\n\t\033[0;31mMandatory argument not specified. For more info use `nextflow run vAMPirus.nf --help`\n\033[0m") exit 0 } - -workflow.onComplete { - log.info ( workflow.success ? \ - "---------------------------------------------------------------------------------" \ - + "\n\033[0;32mDone! Open the following reports in your browser\033[0m" \ - + "\n\033[0;32mPipeline performance report: ${params.workingdir}/${params.outdir}/${params.tracedir}/vampirus_report.html\033[0m" \ - + "\n\033[0;32mvAMPirus --DataCheck interactive report: ${params.workingdir}/${params.outdir}/DataCheck/*.hmtl\033[0m" \ - + "\n\033[0;32mvAMPirus --Analyze interactive report: ${params.workingdir}/${params.outdir}/Analyze/*.hmtl\033[0m" \ - : \ - "---------------------------------------------------------------------------------" \ - + "\n\033[0;31mSomething went wrong. Check error message below and/or log files.\033[0m" ) +if (params.DataCheck) { + workflow.onComplete { + log.info ( workflow.success ? \ + "---------------------------------------------------------------------------------" \ + + "\n\033[0;32mDone! Open the following reports in your browser\033[0m" \ + + "\n\033[0;32mPipeline performance report: ${params.workingdir}/${params.outdir}/${params.tracedir}/vampirus_report.html\033[0m" \ + + "\n\033[0;32mvAMPirus --DataCheck interactive report: ${params.workingdir}/${params.outdir}/DataCheck/Report/*.hmtl\033[0m" \ + : \ + "---------------------------------------------------------------------------------" \ + + "\n\033[0;31mSomething went wrong. Check error message below and/or log files.\033[0m" ) + } +} else if (params.Analyze) { + workflow.onComplete { + log.info ( workflow.success ? \ + "---------------------------------------------------------------------------------" \ + + "\n\033[0;32mDone! Open the following reports in your browser\033[0m" \ + + "\n\033[0;32mPipeline performance report: ${params.workingdir}/${params.outdir}/${params.tracedir}/vampirus_report.html\033[0m" \ + + "\n\033[0;32mvAMPirus --Analyze interactive report: ${params.workingdir}/${params.outdir}/Analyze/*.hmtl\033[0m" \ + : \ + "---------------------------------------------------------------------------------" \ + + "\n\033[0;31mSomething went wrong. Check error message below and/or log files.\033[0m" ) + } } From f5c083dc8815589ae28e300f8f56aa6b34dccfd6 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Mon, 3 May 2021 17:40:19 -0500 Subject: [PATCH 110/223] Corrected aminoMED in help --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 3af44b5..d82a494 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -61,7 +61,7 @@ def helpMessage() { --asvMED Set this option to perform Minimum Entropy Decomposition on ASV sequences, see manual for more information. You will need to set a value for --asvC to perform this analysis - --amino_med Set this option to perform Minimum Entropy Decomposition on AminoType sequences, see manual for more information. You will need to set a value for --aminoC to perform this analysis + --aminoMED Set this option to perform Minimum Entropy Decomposition on AminoType sequences, see manual for more information. You will need to set a value for --aminoC to perform this analysis --Skip options-- From 06da69920764c548653bc1fb283ff06ab2cf5b4d Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 5 May 2021 16:05:04 -0500 Subject: [PATCH 111/223] Added skip phylogeny to MED phylogeny steps --- vAMPirus.nf | 225 +++++++++++++++++++++++++++------------------------- 1 file changed, 115 insertions(+), 110 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index d82a494..9aa37cb 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2074,49 +2074,52 @@ if (params.DataCheck || params.Analyze) { """ } - process ASV_MED_Reps_phylogeny { + if (!params.skipPhylogeny) { - label 'low_cpus' + process ASV_MED_Reps_phylogeny { - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' + label 'low_cpus' - input: - file(reps) from groupreps + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny/ModelTest", mode: "copy", overwrite: true, pattern: '*ASV*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/ASVs/MED/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*ASV*iq*' - output: - file("*_ASV_Group_Reps*") into align_results_asvmed - file("*iq.treefile") into asv_group_rep_tree + input: + file(reps) from groupreps - script: - """ - # Protein_ModelTest - modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.projtag}_ASV_Group_Reps_mt -d aa -s 203 --disable-checkpoint + output: + file("*_ASV_Group_Reps*") into align_results_asvmed + file("*iq.treefile") into asv_group_rep_tree + + script: + """ + # Protein_ModelTest + modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.projtag}_ASV_Group_Reps_mt -d aa -s 203 --disable-checkpoint - # Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq --redo -T auto ${params.iqCustomaa} + # Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq --redo -T auto ${params.iqCustomaa} - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.parametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ + else + iqtree -s ${reps} --prefix ${params.projtag}_ASV_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } } - + process Adding_ASV_MED_Info { label 'low_cpus' @@ -2616,107 +2619,109 @@ if (params.DataCheck || params.Analyze) { } } - if (params.aminoMED) { + if (params.aminoMED) { - process AminoType_Minimum_Entropy_Decomposition { + process AminoType_Minimum_Entropy_Decomposition { - label 'low_cpus' + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/MED", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/Analyze/Clustering/AminoTypes/MED", mode: "copy", overwrite: true - input: - file(aminos) from aminos_for_med + input: + file(aminos) from aminos_for_med - output: - file("*_AminoType_Grouping.csv") into atygroupscsv - file("${params.projtag}_AminoType_group_reps_aligned.fasta") into atygroupreps + output: + file("*_AminoType_Grouping.csv") into atygroupscsv + file("${params.projtag}_AminoType_group_reps_aligned.fasta") into atygroupreps - script: - """ - #alignment - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta - #trimming - trimal -in ${params.projtag}_AminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 - rm ${params.projtag}_AminoTypes_mafftAlign.fasta - o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_mafftAligned.fasta - mv ${params.projtag}_AminoTypes_mafftAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta - #entopy analysis - entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta - #Decomposition - oligotype ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_AminoTypeMED_${params.aminoC} -M 1 -c ${params.aminoC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html - #generatemaps - cd ./${params.projtag}_AminoTypeMED_${params.aminoC}/OLIGO-REPRESENTATIVES/ - echo "AminoType,Group,IDPattern" - j=1 - for x in *_unique; - do gid=\$(echo \$x | awk -F "_" '{print \$1}') - uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') - grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list - seqtk subseq ../../${aminos} asv.list > Group"\${j}"_sequences.fasta - for z in \$( cat asv.list) - do echo ""\$z",Group"\$j","\$uni"" >> ${params.projtag}_AminoType_Grouping.csv + script: + """ + #alignment + mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta + #trimming + trimal -in ${params.projtag}_AminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_AminoTypes_mafftAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_mafftAligned.fasta + mv ${params.projtag}_AminoTypes_mafftAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta + #entopy analysis + entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta + #Decomposition + oligotype ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_AminoTypeMED_${params.aminoC} -M 1 -c ${params.aminoC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + #generatemaps + cd ./${params.projtag}_AminoTypeMED_${params.aminoC}/OLIGO-REPRESENTATIVES/ + echo "AminoType,Group,IDPattern" + j=1 + for x in *_unique; + do gid=\$(echo \$x | awk -F "_" '{print \$1}') + uni=\$(echo \$x | awk -F ""\${gid}"_" '{print \$2}' | awk -F "_uni" '{print \$1}') + grep ">" "\$gid"_"\$uni" | awk -F ">" '{print \$2}' > asv.list + seqtk subseq ../../${aminos} asv.list > Group"\${j}"_sequences.fasta + for z in \$( cat asv.list) + do echo ""\$z",Group"\$j","\$uni"" >> ${params.projtag}_AminoType_Grouping.csv - done - rm asv.list - echo ">Group\${j}" >> ${params.projtag}_AminoType_group_reps_aligned.fasta - echo "\$uni" > group.list - seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta - tail -1 group.fasta >> ${params.projtag}_AminoType_group_reps_aligned.fasta - mv "\$gid"_"\$uni" ./Group"\$j"_"\$uni"_aligned.fasta - mv "\$gid"_"\$uni"_unique ./Group"\$j"_"\$uni"_unqiues_aligned.fasta - rm "\$gid"*.cPickle - j=\$((\$j+1)) - done - mv ${params.projtag}_AminoType_Grouping.csv ../../ - mv ${params.projtag}_AminoType_group_reps_aligned.fasta ../../ - cd .. + done + rm asv.list + echo ">Group\${j}" >> ${params.projtag}_AminoType_group_reps_aligned.fasta + echo "\$uni" > group.list + seqtk subseq ../OLIGO-REPRESENTATIVES.fasta group.list > group.fasta + tail -1 group.fasta >> ${params.projtag}_AminoType_group_reps_aligned.fasta + mv "\$gid"_"\$uni" ./Group"\$j"_"\$uni"_aligned.fasta + mv "\$gid"_"\$uni"_unique ./Group"\$j"_"\$uni"_unqiues_aligned.fasta + rm "\$gid"*.cPickle + j=\$((\$j+1)) + done + mv ${params.projtag}_AminoType_Grouping.csv ../../ + mv ${params.projtag}_AminoType_group_reps_aligned.fasta ../../ + cd .. - """ + """ + } } + if (!params.skipPhylogeny) { - process AminoType_MED_Reps_phylogeny { + process AminoType_MED_Reps_phylogeny { - label 'low_cpus' + label 'low_cpus' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' - publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/Phylogeny/Modeltest", mode: "copy", overwrite: true, pattern: '*mt*' + publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/AminoTypes/MED/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' - input: - file(reps) from atygroupreps + input: + file(reps) from atygroupreps - output: - file("*_AminoType_Group_Reps*") into align_results_aminmed - file("*iq.treefile") into amino_group_rep_tree + output: + file("*_AminoType_Group_Reps*") into align_results_aminmed + file("*iq.treefile") into amino_group_rep_tree - script: - """ - # Protein_ModelTest - modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.projtag}_AminoType_Group_Reps_mt -d aa -s 203 --disable-checkpoint + script: + """ + # Protein_ModelTest + modeltest-ng -i ${reps} -p ${task.cpus} -o ${params.projtag}_AminoType_Group_Reps_mt -d aa -s 203 --disable-checkpoint - # Protein_Phylogeny - if [ "${params.iqCustomaa}" != "" ];then - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq --redo -T auto ${params.iqCustomaa} + # Protein_Phylogeny + if [ "${params.iqCustomaa}" != "" ];then + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq --redo -T auto ${params.iqCustomaa} - elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} + elif [[ "${params.ModelTaa}" != "false" && "${params.nonparametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -b ${params.boots} - elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then - mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni + elif [[ "${params.ModelTaa}" != "false" && "${params.parametric}" != "false" ]];then + mod=\$(tail -12 ${reps}.log | head -1 | awk '{print \$6}') + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m \${mod} --redo -nt auto -bb ${params.boots} -bnni - elif [ "${params.nonparametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} + elif [ "${params.nonparametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -b ${params.boots} - elif [ "${params.parametric}" != "false" ];then - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + elif [ "${params.parametric}" != "false" ];then + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - else - iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni - fi - """ + else + iqtree -s ${reps} --prefix ${params.projtag}_AminoType_Group_Reps_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + fi + """ + } } - process Adding_AminoType_MED_Info { label 'low_cpus' From 221411faf6531d6285309b073c9197da5ed36897 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Sun, 27 Jun 2021 11:46:52 -0500 Subject: [PATCH 112/223] updated diamond version in yaml and removed line in nf --- vAMPirus.nf | 1 - vampirus_env.yml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 9aa37cb..6c6b967 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2119,7 +2119,6 @@ if (params.DataCheck || params.Analyze) { """ } } - process Adding_ASV_MED_Info { label 'low_cpus' diff --git a/vampirus_env.yml b/vampirus_env.yml index fa80f48..92ee9d5 100644 --- a/vampirus_env.yml +++ b/vampirus_env.yml @@ -10,7 +10,7 @@ channels: dependencies: - python=3.6 - blast=2.11.0 - - diamond=0.9.30 + - diamond=2.0.9 - fastqc=0.11.9 - fastp=0.20.1 - clustalo=1.2.4 From 42b17e2aa63c71dc07b6404df0006e83d9bf9e3d Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 28 Jul 2021 15:49:14 -0500 Subject: [PATCH 113/223] replaced mafft with muscle v5 --- bin/muscle5.0.1278_linux64 | Bin 0 -> 3805336 bytes vAMPirus.nf | 68 ++++++++++++++++++++++--------------- vampirus_env.yml | 1 - vampirus_startup.sh | 2 +- 4 files changed, 42 insertions(+), 29 deletions(-) create mode 100644 bin/muscle5.0.1278_linux64 diff --git a/bin/muscle5.0.1278_linux64 b/bin/muscle5.0.1278_linux64 new file mode 100644 index 0000000000000000000000000000000000000000..53f3e8f38063b2b65ce5da492440d85ab47220d9 GIT binary patch literal 3805336 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ⅈZw9 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%0AUz2W4PQmw2r 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%0A8na|V4!>ytETlvk*=*{|( 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 cx<26I*`;IHE5$s&JVJYW>QraP9f?xE#ez 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

    R;NM|>X*cgVFPRgDijvYn=MPgfTxSQ0-~ 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 z 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 OIgJk*E@=F?@qYoSx%p%O literal 0 HcmV?d00001 diff --git a/vAMPirus.nf b/vAMPirus.nf index 6c6b967..8b6a27b 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1,4 +1,4 @@ -#!/usr/bin/env nextflow +muscle#!/usr/bin/env nextflow /* ======================================================================================== @@ -1106,11 +1106,12 @@ if (params.DataCheck || params.Analyze) { """ set +e #alignment - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_mafftAlign.fasta + ${tools}/muscle5.0.1278_linux64 -in ${asvs} -out ${params.projtag}_ASVs_muscleAlign.fasta -thread ${task.cpus} -quiet + #mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_muscleAlign.fasta #trimming - trimal -in ${params.projtag}_ASVs_mafftAlign.fasta -out ${params.projtag}_ASVs_mafftAligned.fasta -keepheader -fasta -automated1 - rm ${params.projtag}_ASVs_mafftAlign.fasta - o-trim-uninformative-columns-from-alignment ${params.projtag}_ASVs_mafftAligned.fasta + trimal -in ${params.projtag}_ASVs_mafftAlign.fasta -out ${params.projtag}_ASVs_muscleAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_ASVs_muscleAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_ASVs_muscleAligned.fasta mv ${params.projtag}_ASVs_mafftAligned.fasta-TRIMMED ./${params.projtag}_ASVs_Aligned_informativeonly.fasta #entopy analysis entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta @@ -1187,12 +1188,14 @@ if (params.DataCheck || params.Analyze) { script: """ #alignment - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta + if [[ $(grep -c ">" ${aminos}) -gt 499 ]]; then algo="super5"; else algo="mpc"; fi + ${tools}/muscle5.0.1278_linux64 -"\${algo}" ${aminos} -out ${params.projtag}_AminoTypes_muscleAlign.fasta -thread ${task.cpus} -quiet + #mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_muscleAlign.fasta #trimming - trimal -in ${params.projtag}_AminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 - rm ${params.projtag}_AminoTypes_mafftAlign.fasta - o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_mafftAligned.fasta - mv ${params.projtag}_AminoTypes_mafftAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta + trimal -in ${params.projtag}_AminoTypes_muscleAlign.fasta -out ${params.projtag}_AminoTypes_muscleAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_AminoTypes_muscleAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_muscleAligned.fasta + mv ${params.projtag}_AminoTypes_muscleAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta #entropy analysis entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta --amino-acid-sequences #summarize entropy peaks @@ -1644,7 +1647,8 @@ if (params.DataCheck || params.Analyze) { mtag="ID=" + nid """ pre=\$(echo ${asvs} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta + ${tools}/muscle5.0.1278_linux64 -in ${asvs} -out \${pre}_ALN.fasta -thread ${task.cpus} -quiet + #mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta @@ -1990,7 +1994,8 @@ if (params.DataCheck || params.Analyze) { script: """ pre=\$(echo ${asvs} | awk -F ".fasta" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta + ${tools}/muscle5.0.1278_linux64 -in ${asvs} -out \${pre}_ALN.fasta -thread ${task.cpus} -quiet + #mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} >\${pre}_ALN.fasta trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta @@ -2035,12 +2040,13 @@ if (params.DataCheck || params.Analyze) { script: """ #alignment - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_mafftAlign.fasta + ${tools}/muscle5.0.1278_linux64 -in ${asvs} -out -thread ${task.cpus} -quiet + #mafft --thread ${task.cpus} --maxiterate 15000 --auto ${asvs} > ${params.projtag}_ASVs_muscleAlign.fasta #trimming - trimal -in ${params.projtag}_ASVs_mafftAlign.fasta -out ${params.projtag}_ASVs_mafftAligned.fasta -keepheader -fasta -automated1 - rm ${params.projtag}_ASVs_mafftAlign.fasta - o-trim-uninformative-columns-from-alignment ${params.projtag}_ASVs_mafftAligned.fasta - mv ${params.projtag}_ASVs_mafftAligned.fasta-TRIMMED ./${params.projtag}_ASVs_Aligned_informativeonly.fasta + trimal -in ${params.projtag}_ASVs_muscleAlign.fasta -out ${params.projtag}_ASVs_muscleAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_ASVs_muscleAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_ASVs_muscleAligned.fasta + mv ${params.projtag}_ASVs_muscleAligned.fasta-TRIMMED ./${params.projtag}_ASVs_Aligned_informativeonly.fasta #entopy analysis entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta #Decomposition @@ -2540,7 +2546,9 @@ if (params.DataCheck || params.Analyze) { """ # Protein_Alignment pre=\$(echo ${prot} | awk -F "_noTax" '{print \$1}' ) - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${prot} >\${pre}_ALN.fasta + if [[ $(grep -c ">" ${prot}) -gt 499 ]]; then algo="super5"; else algo="mpc"; fi + ${tools}/muscle5.0.1278_linux64 -"\${algo}" ${prot} -out \${pre}_ALN.fasta -thread ${task.cpus} -quiet + #mafft --thread ${task.cpus} --maxiterate 15000 --auto ${prot} >\${pre}_ALN.fasta trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta @@ -2636,12 +2644,14 @@ if (params.DataCheck || params.Analyze) { script: """ #alignment - mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta + if [[ $(grep -c ">" ${aminos}) -gt 499 ]]; then algo="super5"; else algo="mpc"; fi + ${tools}/muscle5.0.1278_linux64 -"\${algo}" ${aminos} -out ${params.projtag}_AminoTypes_muscleAlign.fasta -thread ${task.cpus} -quiet + #mafft --thread ${task.cpus} --maxiterate 15000 --auto ${aminos} > ${params.projtag}_AminoTypes_mafftAlign.fasta #trimming - trimal -in ${params.projtag}_AminoTypes_mafftAlign.fasta -out ${params.projtag}_AminoTypes_mafftAligned.fasta -keepheader -fasta -automated1 - rm ${params.projtag}_AminoTypes_mafftAlign.fasta - o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_mafftAligned.fasta - mv ${params.projtag}_AminoTypes_mafftAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta + trimal -in ${params.projtag}_AminoTypes_muscleAlign.fasta -out ${params.projtag}_AminoTypes_muscleAligned.fasta -keepheader -fasta -automated1 + rm ${params.projtag}_AminoTypes_muscleAlign.fasta + o-trim-uninformative-columns-from-alignment ${params.projtag}_AminoTypes_muscleAligned.fasta + mv ${params.projtag}_AminoTypes_muscleAligned.fasta-TRIMMED ./${params.projtag}_AminoTypes_Aligned_informativeonly.fasta #entopy analysis entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta #Decomposition @@ -3168,7 +3178,7 @@ if (params.DataCheck || params.Analyze) { publishDir "${params.workingdir}/${params.outdir}/Analyze/Analyses/pcASV/Nucleotide/Phylogeny/IQ-TREE", mode: "copy", overwrite: true, pattern: '*iq*' input: - tuple nid, file(reads) from pcASV_ntmafft_ch + tuple nid, file(prots) from pcASV_ntmafft_ch output: tuple file("*_aln.fasta"), file("*_aln.html"), file("*.tree"), file("*.log"), file("*iq*"), file("*mt*") into pcASV_nucleotide_phylogeny_results @@ -3177,8 +3187,10 @@ if (params.DataCheck || params.Analyze) { script: mtag="ID=" + nid """ - pre=\$( echo ${reads} | awk -F "_noTax" '{print \$1}' ) - mafft --maxiterate 5000 --auto ${reads} >\${pre}_ALN.fasta + pre=\$( echo ${prots} | awk -F "_noTax" '{print \$1}' ) + if [[ $(grep -c ">" ${prots}) -gt 499 ]]; then algo="super5"; else algo="mpc"; fi + ${tools}/muscle5.0.1278_linux64 -"\${algo}" ${prots} -out \${pre}_ALN.fasta -thread ${task.cpus} -quiet + #mafft --maxiterate 5000 --auto ${reads} >\${pre}_ALN.fasta trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta @@ -3540,7 +3552,9 @@ if (params.DataCheck || params.Analyze) { mtag="ID=" + nid """ pre=\$( echo ${prot} | awk -F ".fasta" '{print \$1}' ) - mafft --maxiterate 5000 --auto ${prot} >\${pre}_ALN.fasta + if [[ $(grep -c ">" ${prots}) -gt 499 ]]; then algo="super5"; else algo="mpc"; fi + ${tools}/muscle5.0.1278_linux64 -"\${algo}" ${prots} -out \${pre}_ALN.fasta -thread ${task.cpus} -quiet + #mafft --maxiterate 5000 --auto ${prot} >\${pre}_ALN.fasta trimal -in \${pre}_ALN.fasta -out \${pre}_aln.fasta -keepheader -fasta -automated1 -htmlout \${pre}_aln.html o-trim-uninformative-columns-from-alignment \${pre}_aln.fasta mv \${pre}_aln.fasta-TRIMMED ./\${pre}_Aligned_informativeonly.fasta diff --git a/vampirus_env.yml b/vampirus_env.yml index 92ee9d5..9edfd7b 100644 --- a/vampirus_env.yml +++ b/vampirus_env.yml @@ -16,7 +16,6 @@ dependencies: - clustalo=1.2.4 - iqtree=2.0.3 - modeltest-ng=0.1.6 - - mafft=7.464 - vsearch=2.14.2 - biopython=1.76 - bbmap=38.90 diff --git a/vampirus_startup.sh b/vampirus_startup.sh index 0c3f1f3..67fc100 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -262,7 +262,7 @@ echo "-------------------------------------------------------------------------- cd "$mypwd" echo "Ok, everything downloaded. To test installation, check out the STARTUP_HELP.txt file within "$mypwd" for instructions for testing the installation and running vAMPirus with your own data." chmod a+x "$mypwd"/bin/virtualribosomev2/* - +chmod a+x "$mypwd"/bin/muscle5.0.1278_linux64 if [[ $(ls "$mypwd"| grep -wc "STARTUP_HELP.txt") -eq 0 ]] then touch STARTUP_HELP.txt From a03978b3f7280575b20675479cb05912940b7276 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 28 Jul 2021 15:50:15 -0500 Subject: [PATCH 114/223] added sensitivty argument to diamond command --- vAMPirus.nf | 24 ++++++++++++------------ vampirus.config | 3 ++- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 8b6a27b..1e1c086 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1373,7 +1373,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -1474,7 +1474,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -1707,7 +1707,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -1805,7 +1805,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -2331,7 +2331,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -2429,7 +2429,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -2599,7 +2599,7 @@ if (params.DataCheck || params.Analyze) { """ set +e diamond makedb --in ${fasta} --db ${fasta} - diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_protCounts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 + diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --${sensitivity} -o ${params.projtag}_protCounts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 echo "OTU_ID" >tmp.col1.txt echo "Generating sample id list" grep ">" ${fasta} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list @@ -2911,7 +2911,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -3014,7 +3014,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -3331,7 +3331,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -3433,7 +3433,7 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --more-sensitive -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -3610,7 +3610,7 @@ if (params.DataCheck || params.Analyze) { set +e potu="\$( echo ${fasta} | awk -F "_" '{print \$3}')" diamond makedb --in ${fasta} --db ${fasta} - diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --more-sensitive -o ${params.projtag}_\${potu}_Counts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 + diamond blastx -q ${merged} -d ${fasta} -p ${task.cpus} --min-score ${params.ProtCountsBit} --id ${params.ProtCountID} -l ${params.ProtCountsLength} --${sensitivity} -o ${params.projtag}_\${potu}_Counts_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 --max-hsps 1 echo "OTU_ID" >tmp.col1.txt echo "Generating sample id list" grep ">" ${fasta} | awk -F ">" '{print \$2}' | sort | uniq > otuid.list diff --git a/vampirus.config b/vampirus.config index c1610aa..831f90f 100644 --- a/vampirus.config +++ b/vampirus.config @@ -109,7 +109,8 @@ params { minID="40" // Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment minaln="30" - + // Set sensitivity parameters for DIAMOND aligner (read more here: https://github.com/bbuchfink/diamond/wiki; default = ultra-sensitive) + sensitivity="ultra-sensitive" // Phylogeny analysis parameters From f8bed36f9dc76cf5e5e23fb88f322aca31bf8d49 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 28 Jul 2021 15:50:49 -0500 Subject: [PATCH 115/223] removed mafft and updated diamond version to be downloaded --- vampirus_env.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vampirus_env.yml b/vampirus_env.yml index 9edfd7b..cb10503 100644 --- a/vampirus_env.yml +++ b/vampirus_env.yml @@ -10,7 +10,7 @@ channels: dependencies: - python=3.6 - blast=2.11.0 - - diamond=2.0.9 + - diamond=2.0.11 - fastqc=0.11.9 - fastp=0.20.1 - clustalo=1.2.4 From d9ee754911a607d52ccd473309647c43a858facd Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 30 Jul 2021 11:14:22 -0500 Subject: [PATCH 116/223] added ncbi tax map files to nf and startup --- vAMPirus.nf | 5 ++++- vampirus.config | 4 +++- vampirus_env.yml | 1 + vampirus_startup.sh | 21 ++++++++++++++++++--- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 1e1c086..f5cfab9 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -566,7 +566,10 @@ if (params.DataCheck || params.Analyze) { cp ${params.vampdir}/Databases/${params.dbname}* ${params.dbdir}/ if [ ! -e ${params.dbdir}/${params.dbname}.dmnd ];then echo "It needs to be built upp, doing it now" - diamond makedb --in ${params.dbdir}/${params.dbname} -d ${params.dbdir}/${params.dbname} + if [[ ${ncbitax} == "true" ]] + then diamond makedb --in ${params.dbdir}/${params.dbname} -d ${params.dbdir}/${params.dbname} --taxonmap ${params.dbdir}/NCBItaxonomy/prot.accession2taxid.FULL --taxonnodes ${params.dbdir}/NCBItaxonomy/nodes.dmp --taxonnames ${params.dbdir}/NCBItaxonomy/names.dmp + else diamond makedb --in ${params.dbdir}/${params.dbname} -d ${params.dbdir}/${params.dbname} + fi export virdb=${params.dbdir}/${params.dbname} else echo "Database looks to be present and built." diff --git a/vampirus.config b/vampirus.config index 831f90f..eaecc9b 100644 --- a/vampirus.config +++ b/vampirus.config @@ -101,7 +101,9 @@ params { headers="HEAD" // Path to directory hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. dbanno="DATABASEANNOT" - // Set lca="T" if you would like to add taxonomic classification to taxonomy results - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" + // DIAMOND taxonomy inference using NCBI taxmap files (can be downloaded using the startup script using the option -t); set to "true" for this to run + ncbitax="false" + // Set lca="T" if you would like to add taxonomic classification to taxonomy results using annotation information provided by - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" lca="LCAT" // Set minimum bitscore for best hit in taxonomy assignment bitscore="50" diff --git a/vampirus_env.yml b/vampirus_env.yml index cb10503..0957c96 100644 --- a/vampirus_env.yml +++ b/vampirus_env.yml @@ -10,6 +10,7 @@ channels: dependencies: - python=3.6 - blast=2.11.0 + - blast-legacy=2.2.26 - diamond=2.0.11 - fastqc=0.11.9 - fastp=0.20.1 diff --git a/vampirus_startup.sh b/vampirus_startup.sh index 67fc100..3fda920 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -25,15 +25,18 @@ vampirus_startup.sh -h [-d 1|2|3|4] [-s] [ -s ] Set this option to skip conda installation and environment set up (you can use if you plan to run with Singularity and the vAMPirus Docker container) + [ -t ] Set this option to download NCBI taxonomy files needed for DIAMOND to assign taxonomic classification to sequences + " } -while getopts "hsd:" OPTION; do +while getopts "hstd:" OPTION; do case $OPTION in h) usage; exit;; d) DATABASE=${OPTARG};; s) CONDA="no";; + t) TAX="yes";; esac done shift $((OPTIND-1)) # required, to "eat" the options that have been processed @@ -189,8 +192,8 @@ then mkdir "$mypwd"/Databases cd "$mypwd"/Databases dir="$(pwd)" echo "Database installation: RVDB version 21.0 (latest as of 2021-02)" - curl -o U-RVDBv21.0-prot.fasta.bz2 https://rvdb-prot.pasteur.fr/files/U-RVDBv21.0-prot.fasta.bz2 - bunzip2 U-RVDBv21.0-prot.fasta.bz2 + curl -o U-RVDBv21.0-prot.fasta.xz https://rvdb-prot.pasteur.fr/files/U-RVDBv21.0-prot.fasta.xz + xz -d U-RVDBv21.0-prot.fasta.xz curl -o U-RVDBv21.0-prot-hmm-txt.zip https://rvdb-prot.pasteur.fr/files/U-RVDBv21.0-prot-hmm-txt.zip unzip U-RVDBv21.0-prot-hmm-txt.zip mv annot ./RVDBannot @@ -257,12 +260,24 @@ elif [[ $DATABASE != "" ]] then echo "Error: Database download signaled but not given a value between 1-4" exit 1 fi + +if [[ "$TAX" == "yes" ]] +then mkdir "$mypwd"/Databases/NCBItaxonomy + cd "$mypwd"/Databases/NCBItaxonomy + curl -o prot.accession2taxid.FULL.gz ftp://ftp.ncbi.nlm.nih.gov/pub/taxonomy/accession2taxid/prot.accession2taxid.FULL.gz + gunzip prot.accession2taxid.FULL.gz + curl -o taxdmp.zip ftp://ftp.ncbi.nlm.nih.gov/pub/taxonomy/taxdmp.zip + unzip taxdmp.zip +fi + echo "-------------------------------------------------------------------------------- Database loop done" cd "$mypwd" echo "Ok, everything downloaded. To test installation, check out the STARTUP_HELP.txt file within "$mypwd" for instructions for testing the installation and running vAMPirus with your own data." chmod a+x "$mypwd"/bin/virtualribosomev2/* chmod a+x "$mypwd"/bin/muscle5.0.1278_linux64 + + if [[ $(ls "$mypwd"| grep -wc "STARTUP_HELP.txt") -eq 0 ]] then touch STARTUP_HELP.txt From f13a14f3e53186c62f440bf57d1e7fa044fe7061 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Mon, 2 Aug 2021 16:31:27 -0500 Subject: [PATCH 117/223] Added ncbi taconomy based assigment and LCA from RVDB to all taxonomy processes --- vAMPirus.nf | 392 ++++++++++++++++++++++++++++++++++++-------- vampirus.config | 46 +++--- vampirus_startup.sh | 17 +- 3 files changed, 358 insertions(+), 97 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index f5cfab9..3f73bb5 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -566,7 +566,7 @@ if (params.DataCheck || params.Analyze) { cp ${params.vampdir}/Databases/${params.dbname}* ${params.dbdir}/ if [ ! -e ${params.dbdir}/${params.dbname}.dmnd ];then echo "It needs to be built upp, doing it now" - if [[ ${ncbitax} == "true" ]] + if [[ ${ncbitax} == "true" && ${dbtype} == "NCBI" ]] then diamond makedb --in ${params.dbdir}/${params.dbname} -d ${params.dbdir}/${params.dbname} --taxonmap ${params.dbdir}/NCBItaxonomy/prot.accession2taxid.FULL --taxonnodes ${params.dbdir}/NCBItaxonomy/nodes.dmp --taxonnames ${params.dbdir}/NCBItaxonomy/names.dmp else diamond makedb --in ${params.dbdir}/${params.dbname} -d ${params.dbdir}/${params.dbname} fi @@ -1348,7 +1348,7 @@ if (params.DataCheck || params.Analyze) { if (!params.skipTaxonomy) { - if (params.headers == "RefSeq") { + if (params.dbtype == "NCBI") { process ncASV_Taxonomy_Inference_RefSeq { /////// editttt @@ -1376,7 +1376,10 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + if [[ ${ncbitax} == "true" ]] + then diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 + else diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + fi echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -1387,6 +1390,15 @@ if (params.DataCheck || params.Analyze) { echo "[ncASV#]" > otu.list echo "[Sequence length]" > length.list grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lca} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list + else + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list + fi + if [[ ${ncbitax} == "true" ]] + then echo "[NCBI Taxonomy ID],[Taxonomic classification from NCBI]" > ncbi_classification.list + fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt for s in \$(cat seqids.lst);do @@ -1408,6 +1420,17 @@ if (params.DataCheck || params.Analyze) { virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then if [[ \$(grep -w "\$acc" ${params.dbanno}/*.txt | wc -l) -eq 1 ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> lca_classification.list + else echo "Viruses::unclassified" >> lca_classification.list + fi + fi + if [[ ${ncbitax} == "true" ]] + then echo "\$line" | awk -F "\t" '{print \$14","\$16"::"\$18"::"\$17}' >> ncbi_classification.list + fi echo "\$s done." else echo "Ugh, there was no hit for \$s .." @@ -1423,6 +1446,12 @@ if (params.DataCheck || params.Analyze) { virus="NO" gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then echo "N/A" >> lca_classification.list + fi + if [[ "${ncbitax}" == "true" ]] + then echo "N/A" >> ncbi_classification.list + fi echo "\$s done." fi done @@ -1436,8 +1465,26 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + if [[ "${params.lca}" == "T" && "${ncbitax}" == "true" ]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list ncbi_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list ncbi_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list ncbi_classification.list >> \${name}_quick_Taxbreakdown.csv + elif [[ "${params.lca}" == "T" && "${ncbitax}" != "true" ]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list >> \${name}_quick_Taxbreakdown.csv + elif [[ "${ncbitax}" == "true" && "${params.lca}" != "T"]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list ncbi_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list ncbi_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list ncbi_classification.list >> \${name}_quick_Taxbreakdown.csv + else + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + echo "skipped" >> \${name}_quick_Taxbreakdown.csv + fi for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) @@ -1449,7 +1496,7 @@ if (params.DataCheck || params.Analyze) { rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list """ } - } else if (params.headers == "RVDB") { + } else if (params.dbtype== "RVDB") { process ncASV_Taxonomy_Inference_RVDB { /////// editttt @@ -1490,9 +1537,9 @@ if (params.DataCheck || params.Analyze) { grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst if [[ ${params.lca} == "T" ]] then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list - echo "[Classification]" > classfication.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv - echo "[Classification]" > classfication.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt @@ -1516,9 +1563,12 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') - lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') - echo "\$lcla" >> classfication.list + then if [[ \$(grep -w "\$acc" ${params.dbanno}/*.txt | wc -l) -eq 1 ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> lca_classification.list + else echo "Viruses::unclassified" >> lca_classification.list + fi fi echo "\$s done." else @@ -1536,7 +1586,7 @@ if (params.DataCheck || params.Analyze) { gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then echo "N/A" >> classfication.list + then echo "N/A" >> lca_classification.list fi echo "\$s done." fi @@ -1553,9 +1603,9 @@ if (params.DataCheck || params.Analyze) { grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta if [[ "${params.lca}" == "T" ]] - then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list >> \${name}_quick_Taxbreakdown.csv else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv fi @@ -1685,7 +1735,7 @@ if (params.DataCheck || params.Analyze) { if (!params.skipTaxonomy) { - if (params.headers == "RefSeq") { + if (params.dbtype == "NCBI") { process ASV_Taxonomy_Inference_RefSeq { /////// editttt @@ -1710,7 +1760,10 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + if [[ ${ncbitax} == "true" ]] + then diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 + else diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + fi echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -1721,6 +1774,15 @@ if (params.DataCheck || params.Analyze) { echo "[ASV#]" > otu.list echo "[Sequence length]" > length.list grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lca} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list + else + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list + fi + if [[ ${ncbitax} == "true" ]] + then echo "[NCBI Taxonomy ID],[Taxonomic classification from NCBI]" > ncbi_classification.list + fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt for s in \$(cat seqids.lst);do @@ -1742,6 +1804,17 @@ if (params.DataCheck || params.Analyze) { virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then if [[ \$(grep -w "\$acc" ${params.dbanno}/*.txt | wc -l) -eq 1 ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> lca_classification.list + else echo "Viruses::unclassified" >> lca_classification.list + fi + fi + if [[ ${ncbitax} == "true" ]] + then echo "\$line" | awk -F "\t" '{print \$14","\$16"::"\$18"::"\$17}' >> ncbi_classification.list + fi echo "\$s done." else echo "Ugh, there was no hit for \$s .." @@ -1757,6 +1830,12 @@ if (params.DataCheck || params.Analyze) { virus="NO" gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then echo "N/A" >> lca_classification.list + fi + if [[ "${ncbitax}" == "true" ]] + then echo "N/A" >> ncbi_classification.list + fi echo "\$s done." fi done @@ -1770,8 +1849,26 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + if [[ "${params.lca}" == "T" && "${ncbitax}" == "true" ]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list ncbi_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list ncbi_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list ncbi_classification.list >> \${name}_quick_Taxbreakdown.csv + elif [[ "${params.lca}" == "T" && "${ncbitax}" != "true" ]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list >> \${name}_quick_Taxbreakdown.csv + elif [[ "${ncbitax}" == "true" && "${params.lca}" != "T"]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list ncbi_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list ncbi_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list ncbi_classification.list >> \${name}_quick_Taxbreakdown.csv + else + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + echo "skipped" >> \${name}_quick_Taxbreakdown.csv + fi for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) @@ -1783,7 +1880,7 @@ if (params.DataCheck || params.Analyze) { rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list """ } - } else if (params.headers == "RVDB") { + } else if (params.dbtype== "RVDB") { process ASV_Taxonomy_Inference_RVDB { /////// editttt @@ -1821,9 +1918,9 @@ if (params.DataCheck || params.Analyze) { grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst if [[ ${params.lca} == "T" ]] then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list - echo "[Classification]" > classfication.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv - echo "[Classification]" > classfication.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt @@ -1847,9 +1944,12 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') - lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') - echo "\$lcla" >> classfication.list + then if [[ \$(grep -w "\$acc" ${params.dbanno}/*.txt | wc -l) -eq 1 ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> lca_classification.list + else echo "Viruses::unclassified" >> lca_classification.list + fi fi echo "\$s done." else @@ -1867,7 +1967,7 @@ if (params.DataCheck || params.Analyze) { gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then echo "N/A" >> classfication.list + then echo "N/A" >> lca_classification.list fi echo "\$s done." fi @@ -1884,9 +1984,9 @@ if (params.DataCheck || params.Analyze) { grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta if [[ "${params.lca}" == "T" ]] - then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list >> \${name}_quick_Taxbreakdown.csv else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv fi @@ -2309,7 +2409,7 @@ if (params.DataCheck || params.Analyze) { if (!params.skipTaxonomy) { - if (params.headers == "RefSeq") { + if (params.dbtype == "NCBI") { process AminoType_Taxonomy_Inference_RefSeq { @@ -2334,7 +2434,10 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + if [[ ${ncbitax} == "true" ]] + then diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 + else diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + fi echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -2345,6 +2448,15 @@ if (params.DataCheck || params.Analyze) { echo "[AminoType#]" > otu.list echo "[Sequence length]" > length.list grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lca} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list + else + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list + fi + if [[ ${ncbitax} == "true" ]] + then echo "[NCBI Taxonomy ID],[Taxonomic classification from NCBI]" > ncbi_classification.list + fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt for s in \$(cat seqids.lst);do @@ -2366,6 +2478,17 @@ if (params.DataCheck || params.Analyze) { virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then if [[ \$(grep -w "\$acc" ${params.dbanno}/*.txt | wc -l) -eq 1 ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> lca_classification.list + else echo "Viruses::unclassified" >> lca_classification.list + fi + fi + if [[ ${ncbitax} == "true" ]] + then echo "\$line" | awk -F "\t" '{print \$14","\$16"::"\$18"::"\$17}' >> ncbi_classification.list + fi echo "\$s done." else echo "Ugh, there was no hit for \$s .." @@ -2381,6 +2504,12 @@ if (params.DataCheck || params.Analyze) { virus="NO" gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then echo "N/A" >> lca_classification.list + fi + if [[ "${ncbitax}" == "true" ]] + then echo "N/A" >> ncbi_classification.list + fi echo "\$s done." fi done @@ -2394,8 +2523,26 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + if [[ "${params.lca}" == "T" && "${ncbitax}" == "true" ]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list ncbi_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list ncbi_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list ncbi_classification.list >> \${name}_quick_Taxbreakdown.csv + elif [[ "${params.lca}" == "T" && "${ncbitax}" != "true" ]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list >> \${name}_quick_Taxbreakdown.csv + elif [[ "${ncbitax}" == "true" && "${params.lca}" != "T"]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list ncbi_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list ncbi_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list ncbi_classification.list >> \${name}_quick_Taxbreakdown.csv + else + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + echo "skipped" >> \${name}_quick_Taxbreakdown.csv + fi for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) @@ -2407,7 +2554,7 @@ if (params.DataCheck || params.Analyze) { rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list """ } - } else if (params.headers == "RVDB") { + } else if (params.dbtype== "RVDB") { process AminoType_Taxonomy_Inference_RVDB { @@ -2445,9 +2592,9 @@ if (params.DataCheck || params.Analyze) { grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst if [[ ${params.lca} == "T" ]] then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list - echo "[Classification]" > classfication.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv - echo "[Classification]" > classfication.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt @@ -2471,9 +2618,12 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') - lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') - echo "\$lcla" >> classfication.list + then if [[ \$(grep -w "\$acc" ${params.dbanno}/*.txt | wc -l) -eq 1 ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> lca_classification.list + else echo "Viruses::unclassified" >> lca_classification.list + fi fi echo "\$s done." else @@ -2491,7 +2641,7 @@ if (params.DataCheck || params.Analyze) { gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then echo "N/A" >> classfication.list + then echo "N/A" >> lca_classification.list fi echo "\$s done." fi @@ -2508,9 +2658,9 @@ if (params.DataCheck || params.Analyze) { grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta if [[ "${params.lca}" == "T" ]] - then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list >> \${name}_quick_Taxbreakdown.csv else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv fi @@ -2884,7 +3034,7 @@ if (params.DataCheck || params.Analyze) { if (!params.skipTaxonomy) { - if (params.headers == "RefSeq") { + if (params.dbtype == "NCBI") { process pcASV_Nucleotide_Taxonomy_Inference_RefSeq { @@ -2914,7 +3064,10 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + if [[ ${ncbitax} == "true" ]] + then diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 + else diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + fi echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -2925,6 +3078,15 @@ if (params.DataCheck || params.Analyze) { echo "[pcASV#]" > otu.list echo "[Sequence length]" > length.list grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lca} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list + else + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list + fi + if [[ ${ncbitax} == "true" ]] + then echo "[NCBI Taxonomy ID],[Taxonomic classification from NCBI]" > ncbi_classification.list + fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt for s in \$(cat seqids.lst);do @@ -2946,6 +3108,17 @@ if (params.DataCheck || params.Analyze) { virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then if [[ \$(grep -w "\$acc" ${params.dbanno}/*.txt | wc -l) -eq 1 ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> lca_classification.list + else echo "Viruses::unclassified" >> lca_classification.list + fi + fi + if [[ ${ncbitax} == "true" ]] + then echo "\$line" | awk -F "\t" '{print \$14","\$16"::"\$18"::"\$17}' >> ncbi_classification.list + fi echo "\$s done." else echo "Ugh, there was no hit for \$s .." @@ -2961,6 +3134,12 @@ if (params.DataCheck || params.Analyze) { virus="NO" gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then echo "N/A" >> lca_classification.list + fi + if [[ "${ncbitax}" == "true" ]] + then echo "N/A" >> ncbi_classification.list + fi echo "\$s done." fi done @@ -2974,8 +3153,26 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + if [[ "${params.lca}" == "T" && "${ncbitax}" == "true" ]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list ncbi_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list ncbi_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list ncbi_classification.list >> \${name}_quick_Taxbreakdown.csv + elif [[ "${params.lca}" == "T" && "${ncbitax}" != "true" ]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list >> \${name}_quick_Taxbreakdown.csv + elif [[ "${ncbitax}" == "true" && "${params.lca}" != "T"]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list ncbi_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list ncbi_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list ncbi_classification.list >> \${name}_quick_Taxbreakdown.csv + else + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + echo "skipped" >> \${name}_quick_Taxbreakdown.csv + fi for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) @@ -2987,7 +3184,7 @@ if (params.DataCheck || params.Analyze) { rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list """ } - } else if (params.headers == "RVDB") { + } else if (params.dbtype== "RVDB") { process pcASV_Nucleotide_Taxonomy_Inference_RVDB { @@ -3030,9 +3227,9 @@ if (params.DataCheck || params.Analyze) { grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst if [[ ${params.lca} == "T" ]] then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list - echo "[Classification]" > classfication.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv - echo "[Classification]" > classfication.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt @@ -3056,9 +3253,12 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') - lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') - echo "\$lcla" >> classfication.list + then if [[ \$(grep -w "\$acc" ${params.dbanno}/*.txt | wc -l) -eq 1 ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> lca_classification.list + else echo "Viruses::unclassified" >> lca_classification.list + fi fi echo "\$s done." else @@ -3076,7 +3276,7 @@ if (params.DataCheck || params.Analyze) { gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then echo "N/A" >> classfication.list + then echo "N/A" >> lca_classification.list fi echo "\$s done." fi @@ -3093,9 +3293,9 @@ if (params.DataCheck || params.Analyze) { grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta if [[ "${params.lca}" == "T" ]] - then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list >> \${name}_quick_Taxbreakdown.csv else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv fi @@ -3305,7 +3505,7 @@ if (params.DataCheck || params.Analyze) { if (!params.skipTaxonomy) { - if (params.headers == "RefSeq") { + if (params.dbtype == "NCBI") { process pcASV_AminoAcid_Taxonomy_Inference_RefSeq { @@ -3334,7 +3534,10 @@ if (params.DataCheck || params.Analyze) { grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + if [[ ${ncbitax} == "true" ]] + then diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 + else diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + fi echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -3345,6 +3548,15 @@ if (params.DataCheck || params.Analyze) { echo "[pcASV#]" > otu.list echo "[Sequence length]" > length.list grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst + if [[ ${params.lca} == "T" ]] + then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list + else echo "skipped" >> \${name}_quick_Taxbreakdown.csv + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list + fi + if [[ ${ncbitax} == "true" ]] + then echo "[NCBI Taxonomy ID],[Taxonomic classification from NCBI]" > ncbi_classification.list + fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt for s in \$(cat seqids.lst);do @@ -3366,6 +3578,17 @@ if (params.DataCheck || params.Analyze) { virus=\$(grep -w "\$acc" "\$headers" | awk -F "[" '{ print \$2 }' | awk -F "]" '{ print \$1 }'| sed 's/ /_/g') echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">"\${s}"_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then if [[ \$(grep -w "\$acc" ${params.dbanno}/*.txt | wc -l) -eq 1 ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> lca_classification.list + else echo "Viruses::unclassified" >> lca_classification.list + fi + fi + if [[ ${ncbitax} == "true" ]] + then echo "\$line" | awk -F "\t" '{print \$14","\$16"::"\$18"::"\$17}' >> ncbi_classification.list + fi echo "\$s done." else echo "Ugh, there was no hit for \$s .." @@ -3381,6 +3604,12 @@ if (params.DataCheck || params.Analyze) { virus="NO" gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt + if [[ "${params.lca}" == "T" ]] + then echo "N/A" >> lca_classification.list + fi + if [[ "${ncbitax}" == "true" ]] + then echo "N/A" >> ncbi_classification.list + fi echo "\$s done." fi done @@ -3394,8 +3623,26 @@ if (params.DataCheck || params.Analyze) { echo " " > sequence.list grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta - paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + if [[ "${params.lca}" == "T" && "${ncbitax}" == "true" ]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list ncbi_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list ncbi_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list ncbi_classification.list >> \${name}_quick_Taxbreakdown.csv + elif [[ "${params.lca}" == "T" && "${ncbitax}" != "true" ]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list >> \${name}_quick_Taxbreakdown.csv + elif [[ "${ncbitax}" == "true" && "${params.lca}" != "T"]] + then + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list ncbi_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list ncbi_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list ncbi_classification.list >> \${name}_quick_Taxbreakdown.csv + else + paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + echo "skipped" >> \${name}_quick_Taxbreakdown.csv + fi for x in *phyloformat.csv;do echo "\$x" lin=\$(( \$(wc -l \$x | awk '{print \$1}')-1)) @@ -3407,7 +3654,7 @@ if (params.DataCheck || params.Analyze) { rm evalue.list sequence.list bit.list pid.list length.list seqids.lst otu.list *asvnames.txt "\$name"_virus.list "\$name"_genes.list newnames.list access.list headers.list """ } - } else if (params.headers == "RVDB") { + } else if (params.dbtype== "RVDB") { process pcASV_AminoAcid_Taxonomy_Inference_RVDB { @@ -3449,9 +3696,9 @@ if (params.DataCheck || params.Analyze) { grep ">" ${asvs} | awk -F ">" '{print \$2}' > seqids.lst if [[ ${params.lca} == "T" ]] then grep -w "LCA" ${params.dbanno}/*.txt > lcainfo.list - echo "[Classification]" > classfication.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list else echo "skipped" >> \${name}_quick_Taxbreakdown.csv - echo "[Classification]" > classfication.list + echo "[Taxonomic classification from RVDB annotations]" > lca_classification.list fi echo "extracting genes and names" touch new_"\$name"_asvnames.txt @@ -3475,9 +3722,12 @@ if (params.DataCheck || params.Analyze) { echo "\$virus" | sed 's/_/ /g' >> "\$name"_virus.list echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') - lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') - echo "\$lcla" >> classfication.list + then if [[ \$(grep -w "\$acc" ${params.dbanno}/*.txt | wc -l) -eq 1 ]] + then group=\$(grep -w "\$acc" ${params.dbanno}/*.txt | awk -F ":" '{print \$1}') + lcla=\$(grep -w "\$group" lcainfo.list | awk -F "\t" '{print \$2}') + echo "\$lcla" >> lca_classification.list + else echo "Viruses::unclassified" >> lca_classification.list + fi fi echo "\$s done." else @@ -3495,7 +3745,7 @@ if (params.DataCheck || params.Analyze) { gene="HIT" echo ">\${s}_"\$virus"_"\$gene"" >> new_"\$name"_asvnames.txt if [[ "${params.lca}" == "T" ]] - then echo "N/A" >> classfication.list + then echo "N/A" >> lca_classification.list fi echo "\$s done." fi @@ -3512,9 +3762,9 @@ if (params.DataCheck || params.Analyze) { grep -v ">" "\$name"_tmpssasv.fasta >> sequence.list rm "\$name"_tmpssasv.fasta if [[ "${params.lca}" == "T" ]] - then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list classfication.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv - paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv - paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list classfication.list >> \${name}_quick_Taxbreakdown.csv + then paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list lca_classification.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv + paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv + paste -d"," otu.list access.list "\$name"_virus.list "\$name"_genes.list lca_classification.list >> \${name}_quick_Taxbreakdown.csv else paste -d "," sequence.list "\$name"_virus.list "\$name"_genes.list otu.list newnames.list length.list bit.list evalue.list pid.list access.list >> "\$name"_phyloformat.csv paste -d"\t" otu.list access.list "\$name"_virus.list "\$name"_genes.list sequence.list length.list bit.list evalue.list pid.list >> "\$name"_summaryTable.tsv fi diff --git a/vampirus.config b/vampirus.config index eaecc9b..de3df9d 100644 --- a/vampirus.config +++ b/vampirus.config @@ -93,26 +93,32 @@ params { // Taxonomy inference parameters - // Specify name of database to use for analysis - dbname="DATABASENAME" - // Path to Directory where database is being stored - dbdir="DATABASEDIR" - // Set taxonomy database header format -> headers= "RefSeq" to toggle use of RefSeq header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers - headers="HEAD" - // Path to directory hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. - dbanno="DATABASEANNOT" - // DIAMOND taxonomy inference using NCBI taxmap files (can be downloaded using the startup script using the option -t); set to "true" for this to run - ncbitax="false" - // Set lca="T" if you would like to add taxonomic classification to taxonomy results using annotation information provided by - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" - lca="LCAT" - // Set minimum bitscore for best hit in taxonomy assignment - bitscore="50" - // Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment - minID="40" - // Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment - minaln="30" - // Set sensitivity parameters for DIAMOND aligner (read more here: https://github.com/bbuchfink/diamond/wiki; default = ultra-sensitive) - sensitivity="ultra-sensitive" + //Parameters for diamond command + // Set minimum bitscore for best hit in taxonomy assignment + bitscore="50" + // Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment + minID="40" + // Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment + minaln="30" + // Set sensitivity parameters for DIAMOND aligner (read more here: https://github.com/bbuchfink/diamond/wiki; default = ultra-sensitive) + sensitivity="ultra-sensitive" + + // Database information + // Specify name of database to use for analysis + dbname="DATABASENAME" + // Path to Directory where database is being stored - vAMPirus will look here to make sure the database with the name provided above is present and built + dbdir="DATABASEDIR" + // Set database type (NCBI or RVDB). Lets vAMPirus know which sequence header format is being used and must be set to NCBI when using RefSeq or Non-Redundant databases. -> dbtype="NCBI" to toggle use of RefSeq header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers (see manual) + dbtype="TYPE" + + // Classification settings - if planning on inferring LCA from RVDB annotation files OR using NCBI taxonomy files, confirm options below are accurate. + // Path to directory RVDB hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. + dbanno="DATABASEANNOT" + // Set lca="T" if you would like to add "Least Common Ancestor" classifications to taxonomy results using information provided by RVDB annotation files (works when using NCBI or RVDB databases) - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" + lca="LCAT" + // DIAMOND taxonomy inference using NCBI taxmap files (can be downloaded using the startup script using the option -t); set to "true" for this to run (ONLY WORKS WITH dbtype="NCBI") + ncbitax="false" + // Phylogeny analysis parameters diff --git a/vampirus_startup.sh b/vampirus_startup.sh index 3fda920..7730296 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -18,14 +18,13 @@ vampirus_startup.sh -h [-d 1|2|3|4] [-s] [ -d 1|2|3|4 ] Set this option to create a database directiory within the current working directory and download the following databases for taxonomy assignment: 1 - Download the proteic version of the Reference Viral DataBase (See the paper for more information on this database: https://f1000research.com/articles/8-530) - NOTE: need to use RVDB for sequence classification 2 - Download only NCBIs Viral protein RefSeq database 3 - Download only the complete NCBI NR protein database 4 - Download all three databases [ -s ] Set this option to skip conda installation and environment set up (you can use if you plan to run with Singularity and the vAMPirus Docker container) - [ -t ] Set this option to download NCBI taxonomy files needed for DIAMOND to assign taxonomic classification to sequences + [ -t ] Set this option to download NCBI taxonomy files needed for DIAMOND to assign taxonomic classification to sequences (works with NCBI type databases only, see manual for more information) " @@ -196,11 +195,11 @@ then mkdir "$mypwd"/Databases xz -d U-RVDBv21.0-prot.fasta.xz curl -o U-RVDBv21.0-prot-hmm-txt.zip https://rvdb-prot.pasteur.fr/files/U-RVDBv21.0-prot-hmm-txt.zip unzip U-RVDBv21.0-prot-hmm-txt.zip - mv annot ./RVDBannot + mv annot ./RVDBannot/ echo "Editing confiration file for you now..." sed 's/DATABASENAME/U-RVDBv21.0-prot.fasta/g' "$mypwd"/vampirus.config > tmp1.config sed "s|DATABASEDIR|${dir}|g" tmp1.config > tmp2.config - sed "s|DATABASEANNOT|${dir}/RVDBannot|g" tmp2.config | sed "s|LCAT|T|g" | sed 's/HEAD/RVDB/g' > tmp3.config + sed "s|DATABASEANNOT|${dir}/RVDBannot|g" tmp2.config | sed "s|LCAT|T|g" | sed 's/TYPE/RVDB/g' > tmp3.config rm tmp1.config rm tmp2.config cat tmp3.config > "$mypwd"/vampirus.config @@ -221,9 +220,12 @@ then mkdir "$mypwd"/Databases gunzip viral.3.protein.faa.gz cat viral.3.protein.faa >> complete_virus_refseq_prot.fasta rm viral.*.protein.faa + curl -o U-RVDBv21.0-prot-hmm-txt.zip https://rvdb-prot.pasteur.fr/files/U-RVDBv21.0-prot-hmm-txt.zip + unzip U-RVDBv21.0-prot-hmm-txt.zip + mv annot ./RVDBannot echo "Editing confiration file for you now..." sed 's/DATABASENAME/complete_virus_refseq_prot.fasta/g' "$mypwd"/vampirus.config > tmp1.config - sed "s|DATABASEDIR|${dir}|g" tmp1.config | sed 's/HEAD/RefSeq/g' > tmp2.config + sed "s|DATABASEDIR|${dir}|g" tmp1.config | sed "s|DATABASEANNOT|${dir}/RVDBannot|g" | sed 's/TYPE/NCBI/g' > tmp2.config rm tmp1.config cat tmp2.config > "$mypwd"/vampirus.config rm tmp2.config @@ -235,9 +237,12 @@ then mkdir "$mypwd"/Databases echo "Database installation: NCBI NR protein database (should be the most up to date at time of running this script)" curl -o NCBI_nr_proteindb.faa.gz https://ftp.ncbi.nlm.nih.gov/blast/db/FASTA/nr.gz gunzip NCBI_nr_proteindb.faa.gz + curl -o U-RVDBv21.0-prot-hmm-txt.zip https://rvdb-prot.pasteur.fr/files/U-RVDBv21.0-prot-hmm-txt.zip + unzip U-RVDBv21.0-prot-hmm-txt.zip + mv annot ./RVDBannot echo "Editing confiration file for you now..." sed 's/DATABASENAME/NCBI_nr_proteindb.faa/g' "$mypwd"/vampirus.config > tmp1.config - sed "s|DATABASEDIR|${dir}|g" tmp1.config | sed 's/HEAD/RefSeq/g' > tmp2.config + sed "s|DATABASEDIR|${dir}|g" tmp1.config | sed "s|DATABASEANNOT|${dir}/RVDBannot|g" | sed 's/TYPE/NCBI/g' > tmp2.config rm tmp1.config cat tmp2.config > "$mypwd"/vampirus.config rm tmp2.config From c8acefa4a3007588efd2122e4a52e9a503ca0e2a Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 3 Aug 2021 08:32:24 -0500 Subject: [PATCH 118/223] added by position MED analysis --- vAMPirus.nf | 30 +++++++++++++++++++++--------- vampirus.config | 4 ++-- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 3f73bb5..ee40f57 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -175,7 +175,7 @@ def helpMessage() { --dbdir Path to Directory where database is being stored - --headers Set taxonomy database header format -> headers= "RefSeq" to toggle use of RefSeq header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers + --headers Set taxonomy database header format -> headers= "NCBI" to toggle use of NCBI header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers --dbanno Path to directory hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. @@ -387,7 +387,7 @@ def fullHelpMessage() { --dbdir Path to Directory where database is being stored - --headers Set taxonomy database header format -> headers= "RefSeq" to toggle use of RefSeq header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers + --headers Set taxonomy database header format -> headers= "NCBI" to toggle use of NCBI header format; set to "RVDB" to signal the use of Reverence Viral DataBase (RVDB) headers --dbanno Path to directory hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. @@ -1350,7 +1350,7 @@ if (params.DataCheck || params.Analyze) { if (params.dbtype == "NCBI") { - process ncASV_Taxonomy_Inference_RefSeq { /////// editttt + process ncASV_Taxonomy_Inference_NCBI { /////// editttt label 'high_cpus' @@ -1737,7 +1737,7 @@ if (params.DataCheck || params.Analyze) { if (params.dbtype == "NCBI") { - process ASV_Taxonomy_Inference_RefSeq { /////// editttt + process ASV_Taxonomy_Inference_NCBI { /////// editttt label 'high_cpus' @@ -2153,7 +2153,13 @@ if (params.DataCheck || params.Analyze) { #entopy analysis entropy-analysis ${params.projtag}_ASVs_Aligned_informativeonly.fasta #Decomposition - oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.asvC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + if [[ \$(echo ${params.asvC} | grep -c ",") -eq 1 ]] + then + tag=$(echo ${params.asvC} | sed 's/,/_/g') + oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_"\$tag -M 1 -C ${params.asvC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + else + oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.asvC} -M 1 -c ${params.asvC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + fi #generatemaps cd ./${params.projtag}_asvMED_${params.asvC}/OLIGO-REPRESENTATIVES/ echo "ASV,GroupID,IDPattern" @@ -2411,7 +2417,7 @@ if (params.DataCheck || params.Analyze) { if (params.dbtype == "NCBI") { - process AminoType_Taxonomy_Inference_RefSeq { + process AminoType_Taxonomy_Inference_NCBI { label 'high_cpus' @@ -2808,7 +2814,13 @@ if (params.DataCheck || params.Analyze) { #entopy analysis entropy-analysis ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta #Decomposition - oligotype ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_AminoTypeMED_${params.aminoC} -M 1 -c ${params.aminoC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + if [[ \$(echo ${params.aminoC} | grep -c ",") -eq 1 ]] + then + tag=$(echo ${params.aminoC} | sed 's/,/_/g') + oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_"\$tag -M 1 -C ${params.aminoC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + else + oligotype ${params.projtag}_ASVs_Aligned_informativeonly.fasta ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY -o ${params.projtag}_asvMED_${params.aminoC} -M 1 -c ${params.aminoC} -N ${task.cpus} --skip-check-input --no-figures --skip-gen-html + fi #generatemaps cd ./${params.projtag}_AminoTypeMED_${params.aminoC}/OLIGO-REPRESENTATIVES/ echo "AminoType,Group,IDPattern" @@ -3036,7 +3048,7 @@ if (params.DataCheck || params.Analyze) { if (params.dbtype == "NCBI") { - process pcASV_Nucleotide_Taxonomy_Inference_RefSeq { + process pcASV_Nucleotide_Taxonomy_Inference_NCBI { label 'high_cpus' @@ -3507,7 +3519,7 @@ if (params.DataCheck || params.Analyze) { if (params.dbtype == "NCBI") { - process pcASV_AminoAcid_Taxonomy_Inference_RefSeq { + process pcASV_AminoAcid_Taxonomy_Inference_NCBI { label 'high_cpus' diff --git a/vampirus.config b/vampirus.config index de3df9d..4e99635 100644 --- a/vampirus.config +++ b/vampirus.config @@ -74,7 +74,7 @@ params { // Minimum Entropy Decomposition (MED) parameters for clustering (https://merenlab.org/2012/05/11/oligotyping-pipeline-explained/) - // If you plan to do MED on ASVs using the option "--asvMED" you can set here the number of positions for oligotyping to take into consideration + // If you plan to do MED on ASVs using the option "--asvMED" you can set here the number of entopy peak positions or a comma seperated list of biologically meaningful positons (e.g. 35,122,21) for oligotyping to take into consideration asvC="" // If you plan to do MED on ASVs using the option "--aminoMED" you can set here the number of positions for oligotyping to take into consideration aminoC="" @@ -112,7 +112,7 @@ params { dbtype="TYPE" // Classification settings - if planning on inferring LCA from RVDB annotation files OR using NCBI taxonomy files, confirm options below are accurate. - // Path to directory RVDB hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using. + // Path to directory RVDB hmm annotation .txt file - see manual for information on this. Leave as is if not planning on using RVDB LCA. dbanno="DATABASEANNOT" // Set lca="T" if you would like to add "Least Common Ancestor" classifications to taxonomy results using information provided by RVDB annotation files (works when using NCBI or RVDB databases) - example: "ASV1, Viruses::Duplodnaviria::Heunggongvirae::Peploviricota::Herviviricetes::Herpesvirales::Herpesviridae::Gammaherpesvirinae::Macavirus" lca="LCAT" From bc6efd549fbdd74aa395b7d6ac2308799542b5fd Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 3 Aug 2021 11:16:39 -0500 Subject: [PATCH 119/223] update --- docs/HelpDocumentation.md | 15 +++++++++++++-- vampirus_env.yml | 1 - vampirus_startup.sh | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/HelpDocumentation.md b/docs/HelpDocumentation.md index bcaa271..ab03987 100644 --- a/docs/HelpDocumentation.md +++ b/docs/HelpDocumentation.md @@ -44,13 +44,22 @@ The vAMPirus program contains two different pipelines: If you have a feature request or any feedback/questions, feel free to email vAMPirusHelp@gmail.com or you can open an Issue on GitHub. +## Changes in version 2.0.0 + +1. Added Minimum Entropy Decomposition analysis using the oligotyping program produced by the Meren Lab. This allows for sequence clustering based on sequence positions of interest (biologically meaningful) or top positions with the highest Shannon's Entropy (read more here: https://merenlab.org/software/oligotyping/ ; and below) + +2. Added more useful taxonomic classification of sequences leveraging the RVDB annotation database and/or NCBI taxonomy files (read more below) + +3. Replaced the used of MAFFT with muscle5 (Edgar 2021) for more accurate virus gene alignments (see https://www.biorxiv.org/content/10.1101/2021.06.20.449169v1.full) + + ## Who to cite If you do use vAMPirus for your analyses, please cite the following -> 1. vAMPirus - Veglia, A.J., Rivera Vicens, R., Grupstra, C., Howe-Kerr, L., and Correa A.M.S. (2020) vAMPirus: An automated virus amplicon sequencing analysis pipeline. Zenodo. *DOI:* -2. Diamond - Buchfink B, Xie C, Huson DH. (2015) Fast and sensitive protein alignment using DIAMOND. Nat Methods. 12(1):59-60. doi:10.1038/nmeth.3176 +2. DIAMOND - Buchfink B, Xie C, Huson DH. (2015) Fast and sensitive protein alignment using DIAMOND. Nat Methods. 12(1):59-60. doi:10.1038/nmeth.3176 3. FastQC - Andrews, S. (2010). FastQC: A Quality Control Tool for High Throughput Sequence Data [Online]. Available online at: http://www.bioinformatics.babraham.ac.uk/projects/fastqc/ @@ -62,7 +71,7 @@ If you do use vAMPirus for your analyses, please cite the following -> 7. ModelTest-NG - Darriba, D., Posada, D., Kozlov, A. M., Stamatakis, A., Morel, B., & Flouri, T. (2020). ModelTest-NG: a new and scalable tool for the selection of DNA and protein evolutionary models. Molecular biology and evolution, 37(1), 291-294. -8. MAFFT - Katoh, K., & Standley, D. M. (2013). MAFFT multiple sequence alignment software version 7: improvements in performance and usability. Molecular biology and evolution, 30(4), 772-780. +8. muscle v5 - R.C. Edgar (2021) "MUSCLE v5 enables improved estimates of phylogenetic tree confidence by ensemble bootstrapping" https://www.biorxiv.org/content/10.1101/2021.06.20.449169v1.full.pdf 9. vsearch - Rognes, T., Flouri, T., Nichols, B., Quince, C., & Mahé, F. (2016). VSEARCH: a versatile open source tool for metagenomics. PeerJ, 4, e2584. @@ -78,6 +87,8 @@ If you do use vAMPirus for your analyses, please cite the following -> 15. UNOISE algorithm - R.C. Edgar (2016). UNOISE2: improved error-correction for Illumina 16S and ITS amplicon sequencing, https://doi.org/10.1101/081257 +16. Oligotyping - A. Murat Eren, Gary G. Borisy, Susan M. Huse, Jessica L. Mark Welch (2014). Oligotyping analysis of the human oral microbiome. Proceedings of the National Academy of Sciences Jul 2014, 111 (28) E2875-E2884; DOI: 10.1073/pnas.1409644111 + # Getting started with vAMPirus diff --git a/vampirus_env.yml b/vampirus_env.yml index 0957c96..cb10503 100644 --- a/vampirus_env.yml +++ b/vampirus_env.yml @@ -10,7 +10,6 @@ channels: dependencies: - python=3.6 - blast=2.11.0 - - blast-legacy=2.2.26 - diamond=2.0.11 - fastqc=0.11.9 - fastp=0.20.1 diff --git a/vampirus_startup.sh b/vampirus_startup.sh index 7730296..28b00f5 100644 --- a/vampirus_startup.sh +++ b/vampirus_startup.sh @@ -270,6 +270,7 @@ if [[ "$TAX" == "yes" ]] then mkdir "$mypwd"/Databases/NCBItaxonomy cd "$mypwd"/Databases/NCBItaxonomy curl -o prot.accession2taxid.FULL.gz ftp://ftp.ncbi.nlm.nih.gov/pub/taxonomy/accession2taxid/prot.accession2taxid.FULL.gz + echo "Gunzipping accession2tax map, might take a moment.." gunzip prot.accession2taxid.FULL.gz curl -o taxdmp.zip ftp://ftp.ncbi.nlm.nih.gov/pub/taxonomy/taxdmp.zip unzip taxdmp.zip From 7500d1b8003b996d2ddc7f109b2339ee8b46a653 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 3 Aug 2021 11:44:28 -0500 Subject: [PATCH 120/223] fixed --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index ee40f57..8bec68a 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1,4 +1,4 @@ -muscle#!/usr/bin/env nextflow +#!/usr/bin/env nextflow /* ======================================================================================== From 1154871171b21ad55489e2ad942e9040968b0319 Mon Sep 17 00:00:00 2001 From: Ramon Rivera Date: Tue, 3 Aug 2021 18:58:16 +0200 Subject: [PATCH 121/223] Update vAMPirus_Report.Rmd --- bin/vAMPirus_Report.Rmd | 675 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 667 insertions(+), 8 deletions(-) diff --git a/bin/vAMPirus_Report.Rmd b/bin/vAMPirus_Report.Rmd index af10a49..9a86013 100644 --- a/bin/vAMPirus_Report.Rmd +++ b/bin/vAMPirus_Report.Rmd @@ -14,6 +14,9 @@ params: stats: !r commandArgs(trailingOnly=T)[8] metadata: !r commandArgs(trailingOnly=T)[9] minimumCounts: !r commandArgs(trailingOnly=T)[10] + asvMED: !r commandArgs(trailingOnly=T)[11] + aminoMED: !r commandArgs(trailingOnly=T)[12] + type: !r commandArgs(trailingOnly=T)[13] --- @@ -71,7 +71,7 @@ if (params$skipReadProcessing == "true" || params$skipMerging == "true" ) { reads_stats=read.csv("final_reads_stats.csv") #paged_table(reads_stats,options = list(rows.print = 20)) knitr::kable(reads_stats, digits = 2, align = 'c', booktabs = TRUE, caption = "Table 1: Read summary stats") %>% - kable_styling(font_size = 12, full_width = F)%>% + kable_styling(font_size = 12, full_width = F)%>% scroll_box(width = "100%", height = "100%") } else { writeLines("\n--------------------------------------------------------------\n") @@ -764,7 +764,7 @@ if (params$asvMED == "true" && params$type == "ASV"){ #paged_table(med_group,options = list(rows.print = 20)) med_group=read.csv("asv_medtable.csv", header = T) knitr::kable(med_group, digits = 2, align = 'c', booktabs = TRUE, caption = "Table: ASV MED Table") %>% - kable_styling(font_size = 12, full_width = F)%>% + kable_styling(font_size = 12, full_width = F)%>% scroll_box(width = "100%", height = "100%") } @@ -774,7 +774,7 @@ if (params$aminoMED == "true" && params$type == "AminoType"){ #paged_table(med_group,options = list(rows.print = 20)) med_group=read.csv("amino_medtable.csv", header = T) knitr::kable(med_group, digits = 2, align = 'c', booktabs = TRUE, caption = "Table: Aminotype MED Table") %>% - kable_styling(font_size = 12, full_width = F) %>% + kable_styling(font_size = 12, full_width = F) %>% scroll_box(width = "100%", height = "100%") } ``` From 575505f6b647d96b3026e27bc3ecbda2dbfcd203 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 10 Sep 2021 10:39:48 -0500 Subject: [PATCH 172/223] edits --- docs/HelpDocumentation.md | 2 +- example_data/conf/test.config | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/HelpDocumentation.md b/docs/HelpDocumentation.md index 036dc66..3e91cfe 100644 --- a/docs/HelpDocumentation.md +++ b/docs/HelpDocumentation.md @@ -1103,7 +1103,7 @@ Example launch command: In vAMPirus v2, we added the ability for the user to use the oligotyping program employing the Minimum Entropy Decomposition (MED) algorithm developed by Eren et al. 2015 (read more about MED here - https://www.nature.com/articles/ismej2014195#citeas) to cluster ASV or AminoType sequences. -The MED algorithm provides an alternative way of clustering marker gene sequences using "information theory-guided decomposition" - "By employing Shannon entropy, MED uses only the information-rich nucleotide positions across reads and iteratively partitions large datasets while omitting stochastic variation." -Ereb et al. 2015 +The MED algorithm provides an alternative way of clustering marker gene sequences using "information theory-guided decomposition" - "By employing Shannon entropy, MED uses only the information-rich nucleotide positions across reads and iteratively partitions large datasets while omitting stochastic variation." -Eren et al. 2015 When you run the DataCheck pipeline with your dataset, the report will include a figure and table that breakdown the Shannon Entropy analysis results for both ASVs and AminoTypes. The figure visualizes entropy values per sequence position revealing positions or regions of high entropy. The table beneath the figure breaks down the number of positions with entropy values above "0.x". Generally, you would want to decompose sequences using all high extropy positions (>0.1). Although, if you know the positions on your sequence that have the potential to contain biologically or ecologically meaningful mutations, you can specify decomposition based on these positions. diff --git a/example_data/conf/test.config b/example_data/conf/test.config index b68646b..c75ce75 100644 --- a/example_data/conf/test.config +++ b/example_data/conf/test.config @@ -18,5 +18,6 @@ params { clusterAAID="85" dbname="test_db.fasta" dbdir="${projectDir}/example_data/conf/" + dbtype="RVDB" stats = true } From d3dd6bf2acf9a7d2ffa436a6213905c4581f9ac1 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Fri, 10 Sep 2021 11:51:48 -0500 Subject: [PATCH 173/223] added info in help docs --- docs/HelpDocumentation.md | 60 +- .../ex_reports/example_Analyze_Report.html | 882 ------------------ .../ex_reports/example_DataCheck_Report.html | 391 -------- example_data/conf/test.config | 2 + 4 files changed, 33 insertions(+), 1302 deletions(-) delete mode 100644 example_data/conf/ex_reports/example_Analyze_Report.html delete mode 100644 example_data/conf/ex_reports/example_DataCheck_Report.html diff --git a/docs/HelpDocumentation.md b/docs/HelpDocumentation.md index 3e91cfe..35fcf4a 100644 --- a/docs/HelpDocumentation.md +++ b/docs/HelpDocumentation.md @@ -537,7 +537,7 @@ Analyze test => OR - nextflow run vAMPirus.nf -c vampirus.config -profile singularity,test --Analyze --ncASV --pcASV --stats + nextflow run vAMPirus.nf -c /path/to/vampirus.config -profile singularity,test --Analyze --ncASV --pcASV --asvMED --aminoMED --stats ### Resuming test analyses if you ran into an error @@ -1105,7 +1105,7 @@ In vAMPirus v2, we added the ability for the user to use the oligotyping program The MED algorithm provides an alternative way of clustering marker gene sequences using "information theory-guided decomposition" - "By employing Shannon entropy, MED uses only the information-rich nucleotide positions across reads and iteratively partitions large datasets while omitting stochastic variation." -Eren et al. 2015 -When you run the DataCheck pipeline with your dataset, the report will include a figure and table that breakdown the Shannon Entropy analysis results for both ASVs and AminoTypes. The figure visualizes entropy values per sequence position revealing positions or regions of high entropy. The table beneath the figure breaks down the number of positions with entropy values above "0.x". Generally, you would want to decompose sequences using all high extropy positions (>0.1). Although, if you know the positions on your sequence that have the potential to contain biologically or ecologically meaningful mutations, you can specify decomposition based on these positions. +When you run the DataCheck pipeline with your dataset, the report will include a figure and table that breakdown the Shannon Entropy analysis results for both ASVs and AminoTypes. The figure visualizes entropy values per sequence position revealing positions or regions of high entropy. The table beneath the figure breaks down the number of positions with entropy values above "0.x". Although, if you know the positions on your sequence that have the potential to contain biologically or ecologically meaningful mutations, you can specify decomposition based on these positions. If you decide to use MED, vAMPirus will run all the same analyses that would be done with the ASV or AminoType sequences (e.g. diversity analyses, statistics) and be appended results to the ASV or AminoType report. The ASV or AminoType sequence nodes on the phylogenetic tree will also be colored based on which MED group they were assigned to. @@ -1188,7 +1188,7 @@ By default IQTREE will determine the best model to use with ModelFinder Plus. ### Bootstrapping -IQ-TREE is capable of performing parametric or non-parametric bootstrapping. You can specify which one using "--parametric" or "--nonparametric" and to set how many boostraps to perform, you would use "--boots #ofbootstraps" or edit lime 114 in the vampirus.config file. +IQ-TREE is capable of performing parametric or non-parametric bootstrapping. You can specify which one using "--parametric" or "--nonparametric" and to set how many bootstraps to perform, you would use "--boots #ofbootstraps" or edit lime 114 in the vampirus.config file. Here is an example for creating a tree using the model determined by ModelTest-NG, non-parametric bootstrapping and 500 bootstraps: @@ -1236,7 +1236,7 @@ AminoType IQTREE command -> ## Taxonomy Inference -vAMPirus uses DIAMOND blastx/blastp and the provided protein database to infer taxonomy of amplicons to ASVs/cASVs/AminoTypes. There are summary files generated, one in the formated to process with phyloseq and the other as a .tsv with information in a different arrangement. Results are also visualized as a donut graph in the final reports. +vAMPirus uses DIAMOND blastx/blastp and the provided protein database to infer taxonomy of amplicons to ASVs/cASVs/AminoTypes. There are summary files generated, one in the format compatable with phyloseq and the other as a .tsv with information in a different arrangement. Results are also visualized as a donut graph in the final reports. First, lets take a look at the taxonomy section of the configuration file: @@ -1328,17 +1328,17 @@ NOTE=> Be sure that there is more than 1 sample in each treatment category or th There are several files created throughout the vAMPirus pipeline that are stored and organized in directories within the specified results/output directory (ex. ${working_directory}/results; lime 27 in the configuration file). We will go through the structure of the output directory and where to find which files here: -## Pipeline performance information - ${working_directory}/results/PipelinePerformance/ +## Pipeline performance information - ${working_directory}/${outdir}/PipelinePerformance/ Nextflow produces a couple files that breakdown how and what parts of the vAMPirus pipeline was ran. The first file is a report that contains information on how the pipeline performed along with other pipeline performance-related information like how much memory or CPUs were used during certain processes. You can use this information to alter how many resources you would request for a given task in the pipeline. For example, the counts table generation process may take a long time with the current amount of resources requested, you can see this in the report then edit the resources requested at lines 144-183 in the vAMPirus configuration file. The second file produced by Nextflow is just the visualization of the workflow and analyses ran as a flowchart. -## Output of "--DataCheck" - ${working_directory}/results/DataCheck +## Output of "--DataCheck" - ${working_directory}/${outdir}/DataCheck The DataCheck performed by vAMPirus includes "ReadProcessing", "Clustering", and "Report" generation. Here again is the launch command to run the DataCheck mode: `nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --DataCheck` -### ReadProcessing - ${working_directory}/results/DataCheck/ReadProcessing +### ReadProcessing - ${working_directory}/${outdir}/ReadProcessing Within the ReadProcessing directory you will find all files related to each step of read processing: @@ -1358,7 +1358,7 @@ Similar to the adapter removal directory, here you have the clean read libraries There is a little bit more going on in this directory compared to the others. The first major file to pay attention to here is the file \*\_merged_clean_Lengthfiltered.fastq. This is the "final" merged read file that contains all merged reads from each samples and is used to identify unique sequences and then ASVs. "Pre-filtered" and "pre-cleaned" combined merged read files can be found in "./LengthFiltering". If you would like to review or use the separate merged read files per sample, these fastq files are found in the "./Individual" directory. Finally, a fasta file with unique sequences are found in the "./Uniques" directory and the "./Histograms" directory is full of several different sequence property (length, per base quality, etc.) histogram files which can be visualized manually and reviewed in the DataCheck report. -### Clustering - ${working_directory}/results/DataCheck/Clustering +### Clustering - ${working_directory}/${outdir}/DataCheck/Clustering As the name would suggest, the files within this directory are related to the clustering process of "--DataCheck". There isn't too much in here, but here is the breakdown anyway: @@ -1368,13 +1368,13 @@ In this directory, there is the fasta file with the generated ASV sequences and 2. Nucleotide - ${working_directory}/results/DataCheck/Clustering/Nucleotide -This directory stores a .csv file that shows the number of clusters or ncASVs per clustering percentage. The file can be visualized manually or can be reviewed in the DataCheck report. +This directory stores a .csv file that shows the number of clusters or ncASVs per clustering percentage. The file can be visualized manually or can be reviewed in the DataCheck report. In this directory you will also find Shannon Entropy analysis results files. 3. Aminoacid - ${working_directory}/results/DataCheck/Clustering/Aminoacid -Similar to Nucleotide, the Aminoacid directory contained the .csv that shows the number of clusters or pcASVs per clustering percentage. The file can be visualized manually or can be reviewed in the DataCheck report. +Similar to Nucleotide, the Aminoacid directory contained the .csv that shows the number of clusters or pcASVs per clustering percentage. The file can be visualized manually or can be reviewed in the DataCheck report. In this directory you will also find Shannon Entropy analysis results files. -### Report - ${working_directory}/results/DataCheck/Report +### Report - ${working_directory}/${outdir}/DataCheck/Report In this directory, you will find a .html DataCheck report that can be opened in any browser. The report contains the following information and it meant to allow the user to tailor their vAMPirus pipeline run to their data (i.e. maximum read length, clustering percentage, etc.): @@ -1393,15 +1393,15 @@ In this section of the report, vAMPirus is showing the number of nucleotide- and NOTE: Most, if not all, plots in vAMPirus reports are interactive meaning you can select and zoom on certain parts of the plot or you can use the legend to remove certain samples. -## Output of "--Analyze" - ${working_directory}/results/Analyze +## Output of "--Analyze" - ${working_directory}/${outdir}/Analyze Depending on which optional arguments you add to your analyses (e.g. --pcASV, --ncASV, skip options), you will have different files produced, here we will go through the output of the full analysis stemming from this launch command: nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --Analyze --ncASV --pcASV --stats -### ReadProcessing - ${working_directory}/results/Analyze/ReadProcessing +### ReadProcessing - ${working_directory}/${outdir}/ReadProcessing -Very similar to the "ReadProcessing" directory created in DataCheck, you will find the following: +Contains the same files produced during DataCheck run (analyses will not be redone) 1. FastQC - ${working_directory}/results/Analyze/ReadProcessing/FastQC @@ -1419,33 +1419,33 @@ Similar to the adapter removal directory, here you have the clean read libraries There is a little bit more going on in this directory compared to the others. The first major file to pay attention to here is the file \*\_merged_clean_Lengthfiltered.fastq. This is the "final" merged read file that contains all merged reads from each samples and is used to identify unique sequences and then ASVs. "Pre-filtered" and "pre-cleaned" combined merged read files can be found in "./LengthFiltering". If you would like to review or use the separate merged read files per sample, these fastq files are found in the "./Individual" directory. Finally, a fasta file with unique sequences are found in the "./Uniques" directory and the "./Histograms" directory is full of several different sequence property (length, per base quality, etc.) histogram files which can be visualized manually and reviewed in the DataCheck report if ran before Analyze. -### Clustering - ${working_directory}/results/Analyze/Clustering +### Clustering - ${working_directory}/${outdir}/Analyze/Clustering The clustering directory will contain all files produced for whichever clustering technique you specified (with the launch command above, all are specified): -1. ASVs - ${working_directory}/results/Analyze/Clustering/ASVsIn this directory, there is the fasta file with the generated ASV sequences and there is another directory "./ChimeraCheck" where the pre-chimera filered ASV fasta sits. +1. ASVs -- ${working_directory}/results/Analyze/Clustering/ASVs -- In this directory, there is the fasta file with the generated ASV sequences and there is another directory "./ChimeraCheck" where the pre-chimera filered ASV fasta sits. In this directory, if --asvMED was set to run, you will be a MED/ directory containing all output files from oligotyping analyses. -2. AminoTypes - ${working_directory}/results/Analyze/Clustering/AminoTypesThe AminoTypes directory has a few different subdirectories, in the main directory, however, is the fasta file with the AminoTypes used in all subsequent analyses. The first subdirectory is called "Translation" which includes the raw ASV translation file along with a report spit out by VirtualRibosome. The next subdirectory is "Problematic", where any translations that were below the given "--minAA" length will be reported, if none were deemed "problematic" then the directory will be empty. All problematic amino acid sequence AND their corresponding ASVs are stored in fasta files for you to review. The final subdirectory is "SummaryFiles" where you can find a "map" of sorts to track which ASVs contributed to which AminoTypes and a .gc file containing information on length of translated sequences. +2. AminoTypes -- ${working_directory}/results/Analyze/Clustering/AminoTypes -- The AminoTypes directory has a few different subdirectories, in the main directory, however, is the fasta file with the AminoTypes used in all subsequent analyses. The first subdirectory is called "Translation" which includes the raw ASV translation file along with a report spit out by VirtualRibosome. The next subdirectory is "Problematic", where any translations that were below the given "--minAA" length will be reported, if none were deemed "problematic" then the directory will be empty. All problematic amino acid sequence AND their corresponding ASVs are stored in fasta files for you to review. The final subdirectory is "SummaryFiles" where you can find a "map" of sorts to track which ASVs contributed to which AminoTypes and a .gc file containing information on length of translated sequences. In this directory, if --aminoMED was set to run, you will be a MED/ directory containing all output files from oligotyping analyses. -3. ncASV - ${working_directory}/results/Analyze/Clustering/ncASVIn this directory, you will find the fasta files corresponding to the clustering percentage(s) you specified for the run. +3. ncASV -- ${working_directory}/results/Analyze/Clustering/ncASV -- In this directory, you will find the fasta files corresponding to the clustering percentage(s) you specified for the run. -4. pcASV - ${working_directory}/results/Analyze/Clustering/pcASVLooking in this directory, you probably notice some similar subdirectories. The pcASV directory also contains the Summary, Problematic, and Translation subsirectories we saw in the AminoType directory. The other important files in this directory is the nucleotide and amino acid versions of the pcASVs generated for whichever clustering percentage(s) specified.An important note for when creating pcASVs is that the subsequent analyses (phylogenies, taxonomy assignment, etc.) are run on both nucloetide and amino acid pcASV fastas. To create these files, vAMPirus translates the ASVs, checks for problematic sequences, then clusters the translated sequences by the given percentage(s). After clustering, vAMPirus will go pcASV by pcASV extracting the nucleotide sequences of the ASVs that clustered within a given pcASV. The extracted nucleotide sequences are then used to generate a consensus nucleotide sequence(s) per pcASV. +4. pcASV -- ${working_directory}/results/Analyze/Clustering/pcASV -- Looking in this directory, you probably notice some similar subdirectories. The pcASV directory also contains the Summary, Problematic, and Translation subsirectories we saw in the AminoType directory. The other important files in this directory is the nucleotide and amino acid versions of the pcASVs generated for whichever clustering percentage(s) specified.An important note for when creating pcASVs is that the subsequent analyses (phylogenies, taxonomy assignment, etc.) are run on both nucloetide and amino acid pcASV fastas. To create these files, vAMPirus translates the ASVs, checks for problematic sequences, then clusters the translated sequences by the given percentage(s). After clustering, vAMPirus will go pcASV by pcASV extracting the nucleotide sequences of the ASVs that clustered within a given pcASV. The extracted nucleotide sequences are then used to generate a consensus nucleotide sequence(s) per pcASV. -### Analyses - ${working_directory}/results/Analyze/Analyses +### Analyses - ${working_directory}/${outdir}/Analyze/Analyses For each clustering technique (i.e. ASVs, AminoTypes, ncASVs and pcASVs) performed in a given run, resulting taxonomic unit fastas will go through the following analyses (unless skip options are used): -1. Counts - ${working_directory}/results/Analyze/Analyses/${clustertechnique}/CountsThe Counts directory is where you can find the counts tables as .csv files (and .biome as well for nucleotide counts tables). +1. Counts -- ${working_directory}/results/Analyze/Analyses/${clustertechnique}/Counts -- The Counts directory is where you can find the counts tables as .csv files (and .biome as well for nucleotide counts tables). -2. Phylogeny - ${working_directory}/results/Analyze/Analyses/${clustertechnique}/PhylogenyUnless told otherwise, vAMPirus will produce phylogenetic trees for all taxonomic unit fastas using IQ-TREE. The options for this analysis was discussed in a previous section of the docs. In the phylogeny output directory, you will find three subdirectories: (i) ./Alignment - contains trimmed MAFFT alignment used for tree, (ii) ./ModelTest - contains output files from substitution model prediction with ModelTest-NG, and (iii) ./IQ-TREE - where you can find all output files from IQ-TREE with the file of (usual) interest is the ".treefile". +2. Phylogeny -- ${working_directory}/results/Analyze/Analyses/${clustertechnique}/Phylogeny -- Unless told otherwise, vAMPirus will produce phylogenetic trees for all taxonomic unit fastas using IQ-TREE. The options for this analysis was discussed in a previous section of the docs. In the phylogeny output directory, you will find three subdirectories: (i) ./Alignment - contains trimmed MAFFT alignment used for tree, (ii) ./ModelTest - contains output files from substitution model prediction with ModelTest-NG, and (iii) ./IQ-TREE - where you can find all output files from IQ-TREE with the file of (usual) interest is the ".treefile". -3. Taxonomy - ${working_directory}/results/Analyze/Analyses/${clustertechnique}/TaxonomyvAMPirus uses DIAMOND blastp/x and the supplied PROTEIN database for taxonomy assignment of sequences. In the Taxonomy directory, you will find (i) a subdirectory called "DIAMONDOutput" which contains the original output file produced by DIAMOND, (ii) a fasta file that has taxonomy assignments within the sequence headers, and (iii) three different summary files (one being a phyloseq object with taxonomic information, a tab-separated summary file for review by the user and a summary table looking at abundance of specific hits). +3. Taxonomy -- ${working_directory}/results/Analyze/Analyses/${clustertechnique}/Taxonomy -- vAMPirus uses DIAMOND blastp/x and the supplied PROTEIN database for taxonomy assignment of sequences. In the Taxonomy directory, you will find (i) a subdirectory called "DIAMONDOutput" which contains the original output file produced by DIAMOND, (ii) a fasta file that has taxonomy assignments within the sequence headers, and (iii) three different summary files (one being a phyloseq object with taxonomic information, a tab-separated summary file for review by the user and a summary table looking at abundance of specific hits). -4. Matrix - ${working_directory}/results/Analyze/Analyses/${clustertechnique}/MatrixThe Matric directory is where you can find all Percent Identity matrices for produced ASV/cASV/AmintoType fastas. +4. Matrix -- ${working_directory}/results/Analyze/Analyses/${clustertechnique}/Matrix -- The Matric directory is where you can find all Percent Identity matrices for produced ASV/cASV/AmintoType fastas. -5. EMBOSS - ${working_directory}/results/Analyze/Analyses/${clustertechnique}/EMBOSSSeveral different protein physiochemical properties for all amino acid sequences are assessed using EMBOSS scripts (http://emboss.sourceforge.net/apps/release/6.6/emboss/apps/groups.html). There are four different subdirectories within EMBOSS, these include (i) ./ProteinProperties - contains files and plots regarding multiple different physiochemical properties (http://emboss.sourceforge.net/apps/release/6.6/emboss/apps/pepstats.html), (ii) ./IsoelectricPoint - contains a text file and a .svg image with plots showing the isoelectric point of protein (http://emboss.sourceforge.net/apps/release/6.6/emboss/apps/iep.html), (iii) ./HydrophobicMoment - information related to hydrophobic moments of amino acid sequences (http://emboss.sourceforge.net/apps/release/6.6/emboss/apps/hmoment.html), and (iv) ./2dStructure - information about 2D structure of proteins (http://emboss.sourceforge.net/apps/release/6.6/emboss/apps/protein_2d_structure_group.html). +5. EMBOSS -- ${working_directory}/results/Analyze/Analyses/${clustertechnique}/EMBOSS -- Several different protein physiochemical properties for all amino acid sequences are assessed using EMBOSS scripts (http://emboss.sourceforge.net/apps/release/6.6/emboss/apps/groups.html). There are four different subdirectories within EMBOSS, these include (i) ./ProteinProperties - contains files and plots regarding multiple different physiochemical properties (http://emboss.sourceforge.net/apps/release/6.6/emboss/apps/pepstats.html), (ii) ./IsoelectricPoint - contains a text file and a .svg image with plots showing the isoelectric point of protein (http://emboss.sourceforge.net/apps/release/6.6/emboss/apps/iep.html), (iii) ./HydrophobicMoment - information related to hydrophobic moments of amino acid sequences (http://emboss.sourceforge.net/apps/release/6.6/emboss/apps/hmoment.html), and (iv) ./2dStructure - information about 2D structure of proteins (http://emboss.sourceforge.net/apps/release/6.6/emboss/apps/protein_2d_structure_group.html). -### FinalReport - ${working_directory}/results/Analyze/FinalReport +### FinalReport - ${working_directory}/${outdir}/Analyze/FinalReports vAMPirus produces final reports for all taxonomic unit fastas produced in the run. These reports contain the following information: @@ -1461,7 +1461,7 @@ This is a plot that looks at number of reads per sample, similar to what is seen 4. Diversity analyses box Plots -The plots in order are (i) Shannon Diversity, (ii) Simpson Diversity, (iii) Species Richness. +The plots in order are (i) Shannon Diversity, (ii) Simpson Diversity, (iii) Richness. Stats tests included with "--stats": @@ -1478,9 +1478,9 @@ Stats tests included with "--stats": 6. NMDS plots (2D and 3D) -7. Relative ASV/cASV abundance per sample bar chart +7. Relative sequence abundance per sample bar chart -8. Absolute ASV/cASV abundance per treatment bar chart +8. Absolute sequence abundance per treatment bar chart 9. Pairwise percent ID heatmap @@ -1488,6 +1488,8 @@ Stats tests included with "--stats": 11. Visualized phylogenetic tree +12. Post-Minimum Entropy Decomposition Analyses (combination of above) + # All of the options diff --git a/example_data/conf/ex_reports/example_Analyze_Report.html b/example_data/conf/ex_reports/example_Analyze_Report.html deleted file mode 100644 index bc65412..0000000 --- a/example_data/conf/ex_reports/example_Analyze_Report.html +++ /dev/null @@ -1,882 +0,0 @@ - - - - - - - - - - - - - -vAMPirus Analyze Report vAMPtest_ASVs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    - - - - - - - - -

    -
    -


    -
    -
    -

    NOTE: Most plots are interactive and you can use the legend to specify samples/treatment of interest. You can also download an .svg version of each figure within this report.

    -
    -
    -

    -  Pre- and Post-Adapter Removal Read Stats -

    -
    -
    -
    - -
    -



    -
    -

    Total number of reads before and after adapter removal

    -

    -

    -
    -
    -

    Forward (R1) and reverse (R2) read length before and after adapter removal

    -

    -


    -
    -

    -  Number of Reads Per Sample -

    -
    -

    -


    -






    -
    -

    -  Rarefaction -

    -
    -






    -
    -

    -  Diversity Analyses Plots -

    -
    -



    -
    -
    -

    Shannon diversty

    -


    -

    -
    ## [1] "Shapiro Test of normality - data is normal p-value > 0.05"
    -##
    -##  Shapiro-Wilk normality test
    -##
    -## data:  resid(shannonaov)
    -## W = 0.9291, p-value = 0.5732
    -##
    -##
    -## --------------------------------------------------------------
    -##
    -## [1] "Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05"
    -##
    -##  Bartlett test of homogeneity of variances
    -##
    -## data:  index by treatment
    -## Bartlett's K-squared = 1.0859, df = 1, p-value = 0.2974
    -##
    -##
    -## --------------------------------------------------------------
    -##
    -## [1] "ANOVA Results"
    -##             Df Sum Sq Mean Sq F value Pr(>F)
    -## treatment    1 0.0527  0.0527    0.15  0.718
    -## Residuals    4 1.4061  0.3515
    -##
    -## --------------------------------------------------------------
    -##
    -## [1] "Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05"
    -##   Tukey multiple comparisons of means
    -##     95% family-wise confidence level
    -##
    -## Fit: aov(formula = index ~ treatment, data = shannondata5_2)
    -##
    -## $treatment
    -##                     diff       lwr     upr     p adj
    -## Group2-Group1 -0.1874213 -1.531512 1.15667 0.7183604
    -##
    -##
    -## --------------------------------------------------------------
    -





    -
    -
    -

    Simpson diversty

    -


    -

    -
    ## [1] "Shapiro Test of normality - data is normal p-value > 0.05"
    -##
    -##  Shapiro-Wilk normality test
    -##
    -## data:  resid(simpsonaov)
    -## W = 0.88738, p-value = 0.3047
    -##
    -##
    -## --------------------------------------------------------------
    -##
    -## [1] "Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05"
    -##
    -##  Bartlett test of homogeneity of variances
    -##
    -## data:  index by treatment
    -## Bartlett's K-squared = 0.74903, df = 1, p-value = 0.3868
    -##
    -##
    -## --------------------------------------------------------------
    -##
    -## [1] "ANOVA Results"
    -##             Df Sum Sq Mean Sq F value Pr(>F)
    -## treatment    1 0.0052 0.00519   0.059   0.82
    -## Residuals    4 0.3506 0.08764
    -##
    -## --------------------------------------------------------------
    -##
    -## [1] "Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05"
    -##   Tukey multiple comparisons of means
    -##     95% family-wise confidence level
    -##
    -## Fit: aov(formula = index ~ treatment, data = simpsondata5_2)
    -##
    -## $treatment
    -##                      diff        lwr       upr     p adj
    -## Group2-Group1 -0.05883652 -0.7299494 0.6122763 0.8196598
    -##
    -##
    -## --------------------------------------------------------------
    -





    -
    -
    -

    Species Richness

    -


    -

    -
    ## [1] "Shapiro Test of normality - data is normal p-value > 0.05"
    -##
    -##  Shapiro-Wilk normality test
    -##
    -## data:  resid(richaov)
    -## W = 0.93289, p-value = 0.6026
    -##
    -##
    -## --------------------------------------------------------------
    -##
    -## [1] "Bartlett Test variance homogeneity - variance is homogeneous p-value > 0.05"
    -##
    -##  Bartlett test of homogeneity of variances
    -##
    -## data:  index by treatment
    -## Bartlett's K-squared = 3.2991, df = 1, p-value = 0.06932
    -##
    -##
    -## --------------------------------------------------------------
    -##
    -## [1] "ANOVA Results"
    -##             Df Sum Sq Mean Sq F value Pr(>F)
    -## treatment    1  7.288   7.288   1.561   0.28
    -## Residuals    4 18.670   4.667
    -##
    -## --------------------------------------------------------------
    -##
    -## [1] "Tukey HSD - Pairwise comparison - significant differences indicated by p-value < 0.05"
    -##   Tukey multiple comparisons of means
    -##     95% family-wise confidence level
    -##
    -## Fit: aov(formula = index ~ treatment, data = richdata5_2)
    -##
    -## $treatment
    -##                   diff       lwr      upr     p adj
    -## Group2-Group1 2.204189 -2.693449 7.101827 0.2795884
    -##
    -##
    -## --------------------------------------------------------------
    -






    -
    -

    -  Distance To Centroid -

    -
    -


    -

    -
    ##
    -## Call:
    -## adonis(formula = bray.distance ~ data5$treatment)
    -##
    -## Permutation: free
    -## Number of permutations: 719
    -##
    -## Terms added sequentially (first to last)
    -##
    -##                 Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
    -## data5$treatment  1   1.01309 1.01309  4.6942 0.53992    0.1
    -## Residuals        4   0.86326 0.21582         0.46008
    -## Total            5   1.87635                 1.00000
    -






    -
    -

    -  NMDS Plots -

    -
    -


    -
    -
    -

    2D NMDS

    -


    -
    ## Run 0 stress 4.35166e-05
    -## Run 1 stress 9.206128e-05
    -## ... Procrustes: rmse 0.2192141  max resid 0.4447335
    -## Run 2 stress 0
    -## ... New best solution
    -## ... Procrustes: rmse 0.1475603  max resid 0.2719593
    -## Run 3 stress 0.1967694
    -## Run 4 stress 0
    -## ... Procrustes: rmse 0.1503594  max resid 0.2805032
    -## Run 5 stress 0
    -## ... Procrustes: rmse 0.1890022  max resid 0.2367295
    -## Run 6 stress 0
    -## ... Procrustes: rmse 0.1525354  max resid 0.2259206
    -## Run 7 stress 0
    -## ... Procrustes: rmse 0.1446005  max resid 0.2074821
    -## Run 8 stress 0
    -## ... Procrustes: rmse 0.132074  max resid 0.2500861
    -## Run 9 stress 0
    -## ... Procrustes: rmse 0.1888654  max resid 0.3103119
    -## Run 10 stress 0
    -## ... Procrustes: rmse 0.1321098  max resid 0.2335853
    -## Run 11 stress 0
    -## ... Procrustes: rmse 0.1086904  max resid 0.198957
    -## Run 12 stress 0
    -## ... Procrustes: rmse 0.184796  max resid 0.2895882
    -## Run 13 stress 0
    -## ... Procrustes: rmse 0.1985743  max resid 0.2828424
    -## Run 14 stress 0
    -## ... Procrustes: rmse 0.1839276  max resid 0.339448
    -## Run 15 stress 0
    -## ... Procrustes: rmse 0.1569956  max resid 0.2738898
    -## Run 16 stress 0
    -## ... Procrustes: rmse 0.08147595  max resid 0.1293814
    -## Run 17 stress 0
    -## ... Procrustes: rmse 0.1231843  max resid 0.1929613
    -## Run 18 stress 0
    -## ... Procrustes: rmse 0.2154224  max resid 0.3725087
    -## Run 19 stress 0
    -## ... Procrustes: rmse 0.09658586  max resid 0.169947
    -## Run 20 stress 0
    -## ... Procrustes: rmse 0.1123304  max resid 0.1810664
    -## Run 21 stress 0
    -## ... Procrustes: rmse 0.07114148  max resid 0.08562701
    -## Run 22 stress 0
    -## ... Procrustes: rmse 0.1207696  max resid 0.2088403
    -## Run 23 stress 0
    -## ... Procrustes: rmse 0.1338395  max resid 0.2011499
    -## Run 24 stress 0
    -## ... Procrustes: rmse 0.2011198  max resid 0.2879716
    -## Run 25 stress 7.960692e-05
    -## ... Procrustes: rmse 0.1835879  max resid 0.3361377
    -## Run 26 stress 7.465245e-05
    -## ... Procrustes: rmse 0.1516833  max resid 0.21161
    -## Run 27 stress 4.134366e-05
    -## ... Procrustes: rmse 0.158652  max resid 0.1955455
    -## Run 28 stress 9.401493e-05
    -## ... Procrustes: rmse 0.1705531  max resid 0.3146807
    -## Run 29 stress 0
    -## ... Procrustes: rmse 0.140281  max resid 0.1899751
    -## Run 30 stress 0
    -## ... Procrustes: rmse 0.1569951  max resid 0.237474
    -## Run 31 stress 0
    -## ... Procrustes: rmse 0.21383  max resid 0.3404873
    -## Run 32 stress 0
    -## ... Procrustes: rmse 0.1831665  max resid 0.2903409
    -## Run 33 stress 0
    -## ... Procrustes: rmse 0.1862874  max resid 0.2430944
    -## Run 34 stress 0
    -## ... Procrustes: rmse 0.1398732  max resid 0.194408
    -## Run 35 stress 0
    -## ... Procrustes: rmse 0.08385465  max resid 0.1208572
    -## Run 36 stress 0
    -## ... Procrustes: rmse 0.1531769  max resid 0.2654934
    -## Run 37 stress 0.1420473
    -## Run 38 stress 0
    -## ... Procrustes: rmse 0.168821  max resid 0.2760271
    -## Run 39 stress 0
    -## ... Procrustes: rmse 0.2398039  max resid 0.4101748
    -## Run 40 stress 4.958545e-05
    -## ... Procrustes: rmse 0.1690092  max resid 0.224612
    -## Run 41 stress 0
    -## ... Procrustes: rmse 0.1763536  max resid 0.2979007
    -## Run 42 stress 8.50985e-05
    -## ... Procrustes: rmse 0.2037257  max resid 0.3652396
    -## Run 43 stress 0
    -## ... Procrustes: rmse 0.1373896  max resid 0.1978843
    -## Run 44 stress 0
    -## ... Procrustes: rmse 0.1721457  max resid 0.2384637
    -## Run 45 stress 8.338233e-06
    -## ... Procrustes: rmse 0.1350539  max resid 0.1826055
    -## Run 46 stress 8.733644e-05
    -## ... Procrustes: rmse 0.1864883  max resid 0.2843063
    -## Run 47 stress 0
    -## ... Procrustes: rmse 0.1287125  max resid 0.1800035
    -## Run 48 stress 1.294414e-05
    -## ... Procrustes: rmse 0.06488975  max resid 0.09540012
    -## Run 49 stress 0
    -## ... Procrustes: rmse 0.1123794  max resid 0.2193415
    -## Run 50 stress 0
    -## ... Procrustes: rmse 0.0873931  max resid 0.1388494
    -## Run 51 stress 0
    -## ... Procrustes: rmse 0.1836172  max resid 0.2892836
    -## Run 52 stress 0
    -## ... Procrustes: rmse 0.1349277  max resid 0.2496178
    -## Run 53 stress 0
    -## ... Procrustes: rmse 0.1597566  max resid 0.3010393
    -## Run 54 stress 0
    -## ... Procrustes: rmse 0.1578135  max resid 0.2739341
    -## Run 55 stress 0.1420473
    -## Run 56 stress 9.580941e-05
    -## ... Procrustes: rmse 0.2385671  max resid 0.3099702
    -## Run 57 stress 0
    -## ... Procrustes: rmse 0.1424363  max resid 0.203378
    -## Run 58 stress 0
    -## ... Procrustes: rmse 0.1498625  max resid 0.2312135
    -## Run 59 stress 0
    -## ... Procrustes: rmse 0.08465851  max resid 0.1346232
    -## Run 60 stress 0
    -## ... Procrustes: rmse 0.1430299  max resid 0.2610707
    -## Run 61 stress 0
    -## ... Procrustes: rmse 0.1369128  max resid 0.1816959
    -## Run 62 stress 0
    -## ... Procrustes: rmse 0.08119163  max resid 0.1444967
    -## Run 63 stress 0
    -## ... Procrustes: rmse 0.1710694  max resid 0.240634
    -## Run 64 stress 9.84601e-05
    -## ... Procrustes: rmse 0.1878078  max resid 0.2714905
    -## Run 65 stress 0
    -## ... Procrustes: rmse 0.05651144  max resid 0.09672819
    -## Run 66 stress 8.62831e-05
    -## ... Procrustes: rmse 0.0727498  max resid 0.09722458
    -## Run 67 stress 0
    -## ... Procrustes: rmse 0.1958305  max resid 0.2910121
    -## Run 68 stress 2.701363e-05
    -## ... Procrustes: rmse 0.2225825  max resid 0.3507306
    -## Run 69 stress 7.042554e-05
    -## ... Procrustes: rmse 0.173566  max resid 0.2626667
    -## Run 70 stress 2.745518e-05
    -## ... Procrustes: rmse 0.08284383  max resid 0.124135
    -## Run 71 stress 0
    -## ... Procrustes: rmse 0.1840454  max resid 0.3503948
    -## Run 72 stress 0
    -## ... Procrustes: rmse 0.1540941  max resid 0.2302387
    -## Run 73 stress 0
    -## ... Procrustes: rmse 0.07616243  max resid 0.1113843
    -## Run 74 stress 0
    -## ... Procrustes: rmse 0.1348955  max resid 0.2398141
    -## Run 75 stress 0
    -## ... Procrustes: rmse 0.1593818  max resid 0.2624199
    -## Run 76 stress 0
    -## ... Procrustes: rmse 0.1658679  max resid 0.2368498
    -## Run 77 stress 0
    -## ... Procrustes: rmse 0.1083634  max resid 0.1355875
    -## Run 78 stress 0
    -## ... Procrustes: rmse 0.173316  max resid 0.2188972
    -## Run 79 stress 2.412692e-05
    -## ... Procrustes: rmse 0.1513869  max resid 0.2559945
    -## Run 80 stress 0
    -## ... Procrustes: rmse 0.1286293  max resid 0.1708846
    -## Run 81 stress 8.249084e-05
    -## ... Procrustes: rmse 0.1600543  max resid 0.2790534
    -## Run 82 stress 0
    -## ... Procrustes: rmse 0.06425533  max resid 0.09782641
    -## Run 83 stress 0
    -## ... Procrustes: rmse 0.1859754  max resid 0.3306764
    -## Run 84 stress 1.218079e-05
    -## ... Procrustes: rmse 0.1579732  max resid 0.2679705
    -## Run 85 stress 0
    -## ... Procrustes: rmse 0.1373995  max resid 0.1704452
    -## Run 86 stress 0
    -## ... Procrustes: rmse 0.1135352  max resid 0.1456319
    -## Run 87 stress 3.345478e-06
    -## ... Procrustes: rmse 0.1136627  max resid 0.1526098
    -## Run 88 stress 7.30298e-05
    -## ... Procrustes: rmse 0.09087387  max resid 0.1523526
    -## Run 89 stress 0
    -## ... Procrustes: rmse 0.1294085  max resid 0.20968
    -## Run 90 stress 0
    -## ... Procrustes: rmse 0.2133609  max resid 0.307295
    -## Run 91 stress 0
    -## ... Procrustes: rmse 0.208796  max resid 0.3331994
    -## *** No convergence -- monoMDS stopping criteria:
    -##     88: stress < smin
    -##      1: stress ratio > sratmax
    -##      2: scale factor of the gradient < sfgrmin
    -
    ## [1] "No Convergence"
    -





    -
    -
    -

    3D NMDS

    -


    -
    ## Run 0 stress 9.179259e-05
    -## Run 1 stress 0
    -## ... New best solution
    -## ... Procrustes: rmse 0.1912644  max resid 0.3064663
    -## Run 2 stress 0
    -## ... Procrustes: rmse 0.1515697  max resid 0.1940969
    -## Run 3 stress 8.011522e-05
    -## ... Procrustes: rmse 0.2408658  max resid 0.3233412
    -## Run 4 stress 0
    -## ... Procrustes: rmse 0.1502567  max resid 0.2373834
    -## Run 5 stress 0
    -## ... Procrustes: rmse 0.1824273  max resid 0.2309358
    -## Run 6 stress 0
    -## ... Procrustes: rmse 0.2044446  max resid 0.3064849
    -## Run 7 stress 0
    -## ... Procrustes: rmse 0.1360824  max resid 0.1868316
    -## Run 8 stress 0
    -## ... Procrustes: rmse 0.224697  max resid 0.3889081
    -## Run 9 stress 1.601269e-06
    -## ... Procrustes: rmse 0.2017323  max resid 0.253622
    -## Run 10 stress 0
    -## ... Procrustes: rmse 0.2332277  max resid 0.2830118
    -## Run 11 stress 0
    -## ... Procrustes: rmse 0.2094351  max resid 0.3393129
    -## Run 12 stress 0
    -## ... Procrustes: rmse 0.1924744  max resid 0.2476726
    -## Run 13 stress 0
    -## ... Procrustes: rmse 0.1723438  max resid 0.2779048
    -## Run 14 stress 0
    -## ... Procrustes: rmse 0.231938  max resid 0.3082758
    -## Run 15 stress 0
    -## ... Procrustes: rmse 0.1591339  max resid 0.2941593
    -## Run 16 stress 1.844663e-05
    -## ... Procrustes: rmse 0.1367305  max resid 0.1893536
    -## Run 17 stress 0
    -## ... Procrustes: rmse 0.2432104  max resid 0.3742779
    -## Run 18 stress 0
    -## ... Procrustes: rmse 0.2021536  max resid 0.3190184
    -## Run 19 stress 8.261138e-05
    -## ... Procrustes: rmse 0.2661264  max resid 0.3395278
    -## Run 20 stress 0
    -## ... Procrustes: rmse 0.2050021  max resid 0.3470228
    -## Run 21 stress 0
    -## ... Procrustes: rmse 0.2349675  max resid 0.3899205
    -## Run 22 stress 0
    -## ... Procrustes: rmse 0.1743172  max resid 0.3327414
    -## Run 23 stress 0
    -## ... Procrustes: rmse 0.1805854  max resid 0.2484891
    -## Run 24 stress 0
    -## ... Procrustes: rmse 0.2214565  max resid 0.3735158
    -## Run 25 stress 6.602248e-05
    -## ... Procrustes: rmse 0.2633094  max resid 0.3328158
    -## Run 26 stress 0
    -## ... Procrustes: rmse 0.1989565  max resid 0.3402747
    -## Run 27 stress 0
    -## ... Procrustes: rmse 0.2434265  max resid 0.2853429
    -## Run 28 stress 0
    -## ... Procrustes: rmse 0.1437204  max resid 0.2008141
    -## Run 29 stress 0
    -## ... Procrustes: rmse 0.2207409  max resid 0.2922027
    -## Run 30 stress 0
    -## ... Procrustes: rmse 0.140996  max resid 0.2320052
    -## Run 31 stress 0
    -## ... Procrustes: rmse 0.1889331  max resid 0.2900138
    -## Run 32 stress 0
    -## ... Procrustes: rmse 0.1834047  max resid 0.2422162
    -## Run 33 stress 0
    -## ... Procrustes: rmse 0.2447367  max resid 0.3580808
    -## Run 34 stress 0
    -## ... Procrustes: rmse 0.2359379  max resid 0.3172238
    -## Run 35 stress 0
    -## ... Procrustes: rmse 0.2428633  max resid 0.3027342
    -## Run 36 stress 0
    -## ... Procrustes: rmse 0.2011346  max resid 0.344021
    -## Run 37 stress 0
    -## ... Procrustes: rmse 0.2398276  max resid 0.4186627
    -## Run 38 stress 6.012963e-05
    -## ... Procrustes: rmse 0.2290966  max resid 0.3002383
    -## Run 39 stress 0
    -## ... Procrustes: rmse 0.2681661  max resid 0.4893852
    -## Run 40 stress 2.102041e-05
    -## ... Procrustes: rmse 0.1696101  max resid 0.2438495
    -## Run 41 stress 0
    -## ... Procrustes: rmse 0.2461656  max resid 0.3874782
    -## Run 42 stress 8.813298e-05
    -## ... Procrustes: rmse 0.2458929  max resid 0.3572947
    -## Run 43 stress 1.301719e-06
    -## ... Procrustes: rmse 0.196147  max resid 0.322213
    -## Run 44 stress 0
    -## ... Procrustes: rmse 0.1521486  max resid 0.2327491
    -## Run 45 stress 7.430631e-05
    -## ... Procrustes: rmse 0.2806763  max resid 0.3795962
    -## Run 46 stress 0
    -## ... Procrustes: rmse 0.1268192  max resid 0.1828082
    -## Run 47 stress 0
    -## ... Procrustes: rmse 0.1656652  max resid 0.2345423
    -## Run 48 stress 0
    -## ... Procrustes: rmse 0.2071554  max resid 0.3748716
    -## Run 49 stress 8.899945e-05
    -## ... Procrustes: rmse 0.2411995  max resid 0.3239697
    -## Run 50 stress 8.49387e-05
    -## ... Procrustes: rmse 0.2235364  max resid 0.2957555
    -## Run 51 stress 8.946254e-05
    -## ... Procrustes: rmse 0.2411916  max resid 0.3239556
    -## Run 52 stress 0
    -## ... Procrustes: rmse 0.1024931  max resid 0.1772733
    -## Run 53 stress 0
    -## ... Procrustes: rmse 0.1805318  max resid 0.2266111
    -## Run 54 stress 0
    -## ... Procrustes: rmse 0.222073  max resid 0.3309312
    -## Run 55 stress 0
    -## ... Procrustes: rmse 0.1984136  max resid 0.2676206
    -## Run 56 stress 4.061045e-05
    -## ... Procrustes: rmse 0.1650274  max resid 0.2850801
    -## Run 57 stress 0
    -## ... Procrustes: rmse 0.2278851  max resid 0.350922
    -## Run 58 stress 0
    -## ... Procrustes: rmse 0.1401086  max resid 0.185101
    -## Run 59 stress 8.737338e-05
    -## ... Procrustes: rmse 0.2411935  max resid 0.3239583
    -## Run 60 stress 0
    -## ... Procrustes: rmse 0.2191345  max resid 0.3940798
    -## Run 61 stress 2.198444e-05
    -## ... Procrustes: rmse 0.2350082  max resid 0.3891647
    -## Run 62 stress 0
    -## ... Procrustes: rmse 0.2048775  max resid 0.265205
    -## Run 63 stress 0
    -## ... Procrustes: rmse 0.2213181  max resid 0.3503163
    -## Run 64 stress 0
    -## ... Procrustes: rmse 0.1501829  max resid 0.2294057
    -## Run 65 stress 0
    -## ... Procrustes: rmse 0.1411666  max resid 0.2546569
    -## Run 66 stress 0
    -## ... Procrustes: rmse 0.1464234  max resid 0.2116882
    -## Run 67 stress 0
    -## ... Procrustes: rmse 0.1652729  max resid 0.2477694
    -## Run 68 stress 9.870175e-05
    -## ... Procrustes: rmse 0.2505968  max resid 0.3328449
    -## Run 69 stress 0.07976986
    -## Run 70 stress 0
    -## ... Procrustes: rmse 0.194331  max resid 0.2432624
    -## Run 71 stress 6.941015e-05
    -## ... Procrustes: rmse 0.2130009  max resid 0.3004891
    -## Run 72 stress 7.615578e-05
    -## ... Procrustes: rmse 0.259831  max resid 0.34112
    -## Run 73 stress 0
    -## ... Procrustes: rmse 0.1647591  max resid 0.2388743
    -## Run 74 stress 0
    -## ... Procrustes: rmse 0.1644595  max resid 0.2847747
    -## Run 75 stress 0
    -## ... Procrustes: rmse 0.1906808  max resid 0.3100185
    -## Run 76 stress 0
    -## ... Procrustes: rmse 0.146477  max resid 0.2315368
    -## Run 77 stress 7.361458e-05
    -## ... Procrustes: rmse 0.2474006  max resid 0.3599023
    -## Run 78 stress 0
    -## ... Procrustes: rmse 0.1476474  max resid 0.2302322
    -## Run 79 stress 0
    -## ... Procrustes: rmse 0.1500008  max resid 0.1972427
    -## Run 80 stress 0
    -## ... Procrustes: rmse 0.2317812  max resid 0.3787597
    -## Run 81 stress 0
    -## ... Procrustes: rmse 0.2462261  max resid 0.3285394
    -## Run 82 stress 0
    -## ... Procrustes: rmse 0.1343457  max resid 0.1992015
    -## Run 83 stress 0
    -## ... Procrustes: rmse 0.1171339  max resid 0.2019657
    -## Run 84 stress 0
    -## ... Procrustes: rmse 0.1754114  max resid 0.255796
    -## Run 85 stress 0
    -## ... Procrustes: rmse 0.17915  max resid 0.2562237
    -## Run 86 stress 0
    -## ... Procrustes: rmse 0.2158695  max resid 0.2893261
    -## Run 87 stress 0
    -## ... Procrustes: rmse 0.1897326  max resid 0.3018936
    -## Run 88 stress 8.264709e-05
    -## ... Procrustes: rmse 0.2704232  max resid 0.3402092
    -## Run 89 stress 0
    -## ... Procrustes: rmse 0.1770887  max resid 0.2768628
    -## Run 90 stress 7.124833e-05
    -## ... Procrustes: rmse 0.2274275  max resid 0.3037865
    -## Run 91 stress 0
    -## ... Procrustes: rmse 0.2291196  max resid 0.3758455
    -## *** No convergence -- monoMDS stopping criteria:
    -##     90: stress < smin
    -##      1: stress ratio > sratmax
    -
    ## [1] "No Convergence"
    -






    -
    -

    -  OTU Abundance Per Sample -

    -
    -

    -




    -
    -

    -  OTU Abundance Per Treatment -

    -
    -

    -




    -
    -

    -  Pairwise Percent-ID Heatmap -

    -
    -



    -




    -
    -

    -  Taxonomy Result Visualization -

    -
    -



    -
    - -






    -
    -

    -  Phylogenetic Tree -

    -
    -



    -

    - This tree is a maximum likelihood tree made with IQTREE2 and the parameters you specified in the vampirus.config file. Also, this is an interactive tree, you can zoom in and hover on nodes to know the sequence ID. For a better visualization of this tree, you can find the *.treefile with bootstrap support values within the results directory and visualize using programs like FigTree or ITOL.








    -
    -
    - - - - -
    - - - - - - - - - - - - - - - diff --git a/example_data/conf/ex_reports/example_DataCheck_Report.html b/example_data/conf/ex_reports/example_DataCheck_Report.html deleted file mode 100644 index c903911..0000000 --- a/example_data/conf/ex_reports/example_DataCheck_Report.html +++ /dev/null @@ -1,391 +0,0 @@ - - - - - - - - - - - - - -vAMPirus DataCheck Report: vAMPtest - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - -

    -

    —————————————————————————————————————————————————————————————————————— NOTE: Plots are interactive and you can use the legend to specify samples/treatment of interest. You can also download an .svg version of each figure within this report. ——————————————————————————————————————————————————————————————————————
    -
    -

    -  Pre- and Post-Adapter Removal Read Stats -

    -
    -
    -
    - -
    -



    -
    -

    Total number of reads before and after adapter removal

    -

    -

    -
    -
    -

    Forward (R1) and reverse (R2) read length before and after adapter removal

    -
    -


    -
    -

    -  Post-Merging Read Stats -

    -
    -



    -
    -
    -

    Pre-filtering reads per sample

    -


    -
    - -


    -
    -
    -

    Post-filtering reads per sample

    -


    -
    - -


    -
    -
    -

    Pre-filtering base frequency per position on reads

    -


    -
    - -


    -
    -
    -

    Post-filtering base frequency per position on reads

    -


    -
    - -


    -
    -
    -

    Pre-filtering mean quality score per position on reads

    -


    -
    - -


    -
    -
    -

    Post-filtering mean quality score per position on reads

    -


    -
    - -


    -
    -
    -

    Pre-filtering read GC-content

    -


    -
    ## Mean,45.279
    -## Median,45.309
    -## Mode,45.110
    -## STDev,1.617
    -## GC,Count
    -
    - -


    -
    -
    -

    Post-filtering read GC-content

    -


    -
    ## Mean,45.656
    -## Median,45.476
    -## Mode,44.762
    -## STDev,1.219
    -## GC,Count
    -
    - -


    -
    -
    -

    Number of reads per quality score (pre-filtering)

    -


    -
    - -


    -
    -
    -

    Number of reads per quality score (post-filtering)

    -


    -
    - -


    -
    -
    -

    Number of reads per length (pre-filtering)

    -


    -
    - -


    -
    -
    -

    Number of reads per length (post-filtering)

    -


    -
    - -
    -
    -

    -  Clustering Statistics -

    -
    -


    -
    -
    -

    Number of ncASVs per clustering percentage – “1” represents number of ASVs

    -


    -

    - NOTE: The “1” on the x-axis represents number of ASVs identified by vsearch

    -
    -
    -

    Number of pcASVs per clustering percentage

    -


    -

    - NOTE: The “1” represents the number of AminoTypes which are unique amino acid sequences in your dataset








    -
    - - - - -
    - - - - - - - - - - - - - - - diff --git a/example_data/conf/test.config b/example_data/conf/test.config index c75ce75..7149b5d 100644 --- a/example_data/conf/test.config +++ b/example_data/conf/test.config @@ -19,5 +19,7 @@ params { dbname="test_db.fasta" dbdir="${projectDir}/example_data/conf/" dbtype="RVDB" + aminoC=5 + asvC=5 stats = true } From c969d278601fe20b50b02a9ddd2ce339c76fd785 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Tue, 21 Sep 2021 16:10:23 -0500 Subject: [PATCH 174/223] added filtering processes and added the use of evalue in taxonomy step --- docs/HelpDocumentation.md | 16 ++-- vAMPirus.nf | 182 ++++++++++++++++++++++++++++++++++---- vampirus.config | 37 ++++++-- 3 files changed, 205 insertions(+), 30 deletions(-) diff --git a/docs/HelpDocumentation.md b/docs/HelpDocumentation.md index 35fcf4a..689d892 100644 --- a/docs/HelpDocumentation.md +++ b/docs/HelpDocumentation.md @@ -412,7 +412,7 @@ General execution: vampirus_startup.sh -h [-d 1|2|3|4] [-s] [-t] - Command lime options: + Command line options: [ -h ] Print help information @@ -449,7 +449,7 @@ RVDB format -> ">acc|GENBANK|AYD68780.1|GENBANK|MH171300|structural polyprotein NCBI NR/RefSeq format -> ">KJX92028.1 hypothetical protein TI39_contig5958g00003 [Zymoseptoria brevis]" -To set/inform vAMPirus of which header format for the reference database is being used, you can edit the vampirus.config file at lime 112 "dbtype="NCBI"" for NCBI header format or "dbtype="RVDB"" for RVDB format. +To set/inform vAMPirus of which header format for the reference database is being used, you can edit the vampirus.config file at line 122 "dbtype="NCBI"" for NCBI header format or "dbtype="RVDB"" for RVDB format. An example of custom headers in RVDB format if you plan to use a custom database: @@ -636,7 +636,7 @@ Nextflow deployment of vAMPirus relies on the use of the configuration file (vam Furthermore, the configuration file contains analysis-specific parameters AND resource-specific Nextflow launching parameters. A benefit of Nextflow integration, is that you can run the vAMPirus workflow on a large HPC just as easily as you could on your local machine. -If you look at lime 151 and greater in the vampirus.config file, you will see resource-specific parameters that you can alter before any run. Nexflow is capable of submitting jobs automatically using slurm and PBS, check out the Nextflow docs to learn more (https://www.nextflow.io/docs/latest/executor.html)! +If you look at line 233 and greater in the vampirus.config file, you will see resource-specific parameters that you can alter before any run. Nexflow is capable of submitting jobs automatically using slurm and PBS, check out the Nextflow docs to learn more (https://www.nextflow.io/docs/latest/executor.html)! ### Setting parameter values @@ -672,15 +672,15 @@ Instead of editing the configuration file directly, you could set parameters wit nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --Analyze --ncASV --clusterNuclID .95 -Here we use the "--Analyze" option that tells vAMPirus that we are ready to analyze some data. Then the "--ncASV" argument with the "--clisterNuclID .95" tells vAMPirus we would like to cluster our ASVs based on 95% nucleotide similarity. The default ID value is stored at lime 51 in the vampirus.config file (currently 85%), but as soon as you specify and provide a value in the command, the value within the config file is ignored. +Here we use the "--Analyze" option that tells vAMPirus that we are ready to analyze some data. Then the "--ncASV" argument with the "--clisterNuclID .95" tells vAMPirus we would like to cluster our ASVs based on 95% nucleotide similarity. The default ID value is stored at line 66 in the vampirus.config file (currently 85%), but as soon as you specify and provide a value in the command, the value within the config file is ignored. NOTE: Nextflow also has options in the launch command. To tell them apart, Nextflow options uses a single dash (e.g. -with-conda or -profile) while vAMPirus options are always with a double dash (e.g. --Analyze) -### Setting computing resource parameters - Edit in lines 151-171 in vampirus.config +### Setting computing resource parameters - Edit in lines 241-261 in vampirus.config Each process within the vAMPirus workflow is tagged with either "low_cpus", "norm_cpus", or "high_cpus" (see below) which let's Nextflow know the amount of cpus and memory required for each process, which will then be used for when Nextflow submits a given job or task. Nexflow actively assesses the amount of available resources on your machine and will submit tasks only when the proper amount of resources can be requested. -From lime 203-217 in the vAMPirus.config file is where you can edit these values for whichever machine you plan to run the workflow on. +From line 241-261 in the vAMPirus.config file is where you can edit these values for whichever machine you plan to run the workflow on. process { withLabel: low_cpus { @@ -763,7 +763,7 @@ This launch command will run all aspects of the vAMPirus workflow on your data a ### Sequencing reads -Input can be raw or processed compressed or non-compressed fastq files with names containing "\_R1" or "\_R2". You can specify the directory containing your reads in lime 25 of the vampirus.config file. +Input can be raw or processed compressed or non-compressed fastq files with names containing "\_R1" or "\_R2". You can specify the directory containing your reads in line 20 of the vampirus.config file. NOTE: Sample names are extracted from read library names by using the string to the left of the "\_R" in the filename automatically. @@ -1326,7 +1326,7 @@ NOTE=> Be sure that there is more than 1 sample in each treatment category or th # vAMPirus output -There are several files created throughout the vAMPirus pipeline that are stored and organized in directories within the specified results/output directory (ex. ${working_directory}/results; lime 27 in the configuration file). We will go through the structure of the output directory and where to find which files here: +There are several files created throughout the vAMPirus pipeline that are stored and organized in directories within the specified results/output directory (ex. ${working_directory}/results; line 24 in the configuration file). We will go through the structure of the output directory and where to find which files here: ## Pipeline performance information - ${working_directory}/${outdir}/PipelinePerformance/ diff --git a/vAMPirus.nf b/vAMPirus.nf index b65d710..4170216 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -756,7 +756,7 @@ if (params.DataCheck || params.Analyze) { script: """ - vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxdiffs ${params.diffs} --fastq_maxns ${params.maxn} --fastq_allowmergestagger --fastq_maxee ${params.maxEE} --relabel ${sample_id}. + vsearch --fastq_mergepairs ${reads[0]} --reverse ${reads[1]} --threads ${task.cpus} --fastqout ${sample_id}_mergedclean.fastq --fastqout_notmerged_fwd ${sample_id}_notmerged_fwd.fastq --fastqout_notmerged_rev ${sample_id}_notmerged_rev.fastq --fastq_maxdiffs ${params.diffs} --fastq_maxns ${params.maxn} --fastq_allowmergestagger --fastq_maxee ${params.maxEE} --fastq_minovlen ${params.minoverlap} --relabel ${sample_id}. echo ${sample_id} > ${sample_id}.name """ @@ -914,7 +914,8 @@ if (params.DataCheck || params.Analyze) { file(fasta) from reads_vsearch4_ch output: - file("*ASVs.fasta") into ( reads_vsearch5_ch, asv_med, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) + file("*ASVs.fasta") into asvforfilt + script: """ @@ -923,6 +924,93 @@ if (params.DataCheck || params.Analyze) { } // UNTIL HERE DEFAULT + if (params.filter) { + + process Filtering { + + label 'norm_cpus' + + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/FilterCont", mode: "copy", overwrite: true, pattern: '*.fasta' + + input: + file(asv) from asvforfilt + + output: + file("*ASV.fasta") into ( reads_vsearch5_ch, asv_med, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) + + script: + """ + cp ${params.vampdir}/bin/rename_seq.py . + + #create and rename filter database + grep ">" ${params.filtDB} | awk -F ">" '{print \$2}' >> filt.head + j=1 + for y in \$( cat filt.head );do + echo ">Filt"\$j"" >> filt.headers + j=\$(( \${j}+1 )) + done + ./rename_seq.py ${params.filtDB} filt.headers filterdatabaserenamed.fasta + cat filterdatabase.fasta >> combodatabase.fasta + paste -d',' filt.head filt.headers > filtername_map.csv + rm filterdatabaserenamed.fasta + + #create and rename keep database + grep ">" ${params.keepDB} | awk -F ">" '{print \$2}' >> keep.head + d=1 + for y in \$( cat keep.head );do + echo ">keep"\$d"" >> keep.headers + d=\$(( \${d}+1 )) + done + ./rename_seq.py ${params.keepDB} keep.headers keepdatabaserenamed.fasta + cat keepdatabaserenamed.fasta >> combodatabase.fasta + paste -d',' keep.head keep.headers > keepername_map.csv + rm filterdatabaserenamed.fasta + #index database + diamond makedb --in combodatabase.fasta --db combodatabase.fasta + #run diamond_db + diamond blastx -q ${asv} -d combodatabase.fasta -p ${task.cpus} --id ${params.filtminID} -l ${params.filtminaln} -e ${params.filtevalue} --${params.filtsensitivity} -o ${params.projtag}_diamondfilter.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident --max-target-seqs 1 --max-hsps 1 + #get asvs + grep ">" ${asv} | awk -F ">" '{print \$2}' > asv.list + for x in $(cat asv.list) + do #check for a hit + if [[ \$(grep -c "\$x" ${params.projtag}_diamondfilter.out) -eq 1 ]] + then #check if hit is to filter + hit=\$(grep "\$x" ${params.projtag}_diamondfilter.out | awk '{print \$3}') + if [[ \$(grep -c "\$hit" filt.headers) -eq 1 ]] + then echo "\$x,\$hit >> filtered_asvs_summary.csv + elif [[ \$(grep -c "\$hit" keep.headers) -eq 1 ]] + then echo "\$x" >> kep.list + fi + else echo \$x >> nohit.list + fi + done + if [[ ${params.keepnohit} == "true" ]] + then echo nohit.list >> kep.list + cat kep.list | sort > keep.list + seqtk subseq ${asv} keep.list > kept.fasta + u=1 + for y in \$( cat keep.list );do + echo ">ASV"\$u"" >> asvrename.list + u=\$(( \${u}+1 )) + done + ./rename_seq.py ${asv} asvrename.list ${params.projtag}_ASV.fasta + else + cat kep.list | sort > keep.list + seqtk subseq ${asv} keep.list > kept.fasta + u=1 + for y in \$( cat keep.list );do + echo ">ASV"\$u"" >> asvrename.list + u=\$(( \${u}+1 )) + done + ./rename_seq.py ${asv} asvrename.list ${params.projtag}_ASV.fasta + fi + """ + } + + } else { + asvforfilt + .into{ reads_vsearch5_ch, asv_med, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck } + } if (params.DataCheck) { @@ -1367,12 +1455,18 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} + if [[ ${params.measurement} == "bitscore"]] + then measure="--min-score ${params.bitscore}" + elif [[ ${params.measurement} == "evalue"]] + then measure="-e ${params.evalue}" + else measure="--min-score ${params.bitscore}" + fi grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') if [[ ${params.ncbitax} == "true" ]] - then diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 - else diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + then diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 + else diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 fi echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list @@ -1515,10 +1609,16 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} + if [[ ${params.measurement} == "bitscore"]] + then measure="--min-score ${params.bitscore}" + elif [[ ${params.measurement} == "evalue"]] + then measure="-e ${params.evalue}" + else measure="--min-score ${params.bitscore}" + fi grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -1750,12 +1850,18 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} + if [[ ${params.measurement} == "bitscore"]] + then measure="--min-score ${params.bitscore}" + elif [[ ${params.measurement} == "evalue"]] + then measure="-e ${params.evalue}" + else measure="--min-score ${params.bitscore}" + fi grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') if [[ ${params.ncbitax} == "true" ]] - then diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 - else diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + then diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 + else diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 fi echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list @@ -1896,9 +2002,15 @@ if (params.DataCheck || params.Analyze) { cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} grep ">" \${virdb} > headers.list + if [[ ${params.measurement} == "bitscore"]] + then measure="--min-score ${params.bitscore}" + elif [[ ${params.measurement} == "evalue"]] + then measure="-e ${params.evalue}" + else measure="--min-score ${params.bitscore}" + fi headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -2431,12 +2543,18 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} + if [[ ${params.measurement} == "bitscore"]] + then measure="--min-score ${params.bitscore}" + elif [[ ${params.measurement} == "evalue"]] + then measure="-e ${params.evalue}" + else measure="--min-score ${params.bitscore}" + fi grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') if [[ ${params.ncbitax} == "true" ]] - then diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 - else diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + then diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 + else diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 fi echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list @@ -2576,10 +2694,16 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} + if [[ ${params.measurement} == "bitscore"]] + then measure="--min-score ${params.bitscore}" + elif [[ ${params.measurement} == "evalue"]] + then measure="-e ${params.evalue}" + else measure="--min-score ${params.bitscore}" + fi grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -3070,12 +3194,18 @@ if (params.DataCheck || params.Analyze) { set +e cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} + if [[ ${params.measurement} == "bitscore"]] + then measure="--min-score ${params.bitscore}" + elif [[ ${params.measurement} == "evalue"]] + then measure="-e ${params.evalue}" + else measure="--min-score ${params.bitscore}" + fi grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') if [[ ${params.ncbitax} == "true" ]] - then diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 - else diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + then diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 + else diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 fi echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list @@ -3220,10 +3350,16 @@ if (params.DataCheck || params.Analyze) { set +e cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} + if [[ ${params.measurement} == "bitscore"]] + then measure="--min-score ${params.bitscore}" + elif [[ ${params.measurement} == "evalue"]] + then measure="-e ${params.evalue}" + else measure="--min-score ${params.bitscore}" + fi grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastx -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list @@ -3539,12 +3675,18 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} + if [[ ${params.measurement} == "bitscore"]] + then measure="--min-score ${params.bitscore}" + elif [[ ${params.measurement} == "evalue"]] + then measure="-e ${params.evalue}" + else measure="--min-score ${params.bitscore}" + fi grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') if [[ ${params.ncbitax} == "true" ]] - then diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 - else diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + then diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop staxids sskingdoms skingdoms sphylums --max-target-seqs 1 --max-hsps 1 + else diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 fi echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list @@ -3688,10 +3830,16 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} + if [[ ${params.measurement} == "bitscore"]] + then measure="--min-score ${params.bitscore}" + elif [[ ${params.measurement} == "evalue"]] + then measure="-e ${params.evalue}" + else measure="--min-score ${params.bitscore}" + fi grep ">" \${virdb} > headers.list headers="headers.list" name=\$( echo ${asvs} | awk -F ".fasta" '{print \$1}') - diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} --min-score ${params.bitscore} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 + diamond blastp -q ${asvs} -d \${virdb} -p ${task.cpus} --id ${params.minID} -l ${params.minaln} \${measure} --${params.sensitivity} -o "\$name"_dmd.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident btop --max-target-seqs 1 --max-hsps 1 echo "Preparing lists to generate summary .csv's" echo "[Best hit accession number]" > access.list echo "[e-value]" > evalue.list diff --git a/vampirus.config b/vampirus.config index a892240..8c34321 100644 --- a/vampirus.config +++ b/vampirus.config @@ -55,6 +55,8 @@ params { diffs="20" // Maximum number of "N"'s in a sequence - if above the specified value, sequence will be discarded maxn="20" + // Minimum overlap for sequence merging + minoverlap="10" // ASV generation and clustering parameters @@ -73,6 +75,27 @@ params { // Minimum length of amino acid translation to be considered during protein clustered ASV (pcASV) generation. Recommended to put this at the expected amino acid sequence length based on your maximum read length (e.g. if maxLen="420", then minAA should be 420/3 so 140) minAA="140" + // Filtering parameters - You can set the filtering to run with the command --filter + + // Path to database + filtDB="" + // Path to database of + keepDB="" + // Keep any sequences without hits - for yes, set keepnohit to ="true" + keepnohit="true" + + //Parameters for diamond command for filtering + + // Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment + filtminID="80" + // Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment + filtminaln="30" + // Set sensitivity parameters for DIAMOND aligner (read more here: https://github.com/bbuchfink/diamond/wiki; default = ultra-sensitive) + filtsensitivity="ultra-sensitive" + // Set the max e-value for best hit to be recorded + filtevalue="0.001" + + // Minimum Entropy Decomposition (MED) parameters for clustering (https://merenlab.org/2012/05/11/oligotyping-pipeline-explained/) // If you plan to do MED on ASVs using the option "--asvMED" you can set here the number of entopy peak positions or a comma seperated list of biologically meaningful positons (e.g. 35,122,21) for oligotyping to take into consideration. If you want to use a single specific position, make "asvSingle="true"". @@ -97,8 +120,12 @@ params { // Taxonomy inference parameters //Parameters for diamond command - // Set minimum bitscore for best hit in taxonomy assignment - bitscore="50" + // Set which measurement to use for a minimum threshold in taxonomy inference - must be either "evalue" or "bitscore" + measurement="bitscore" + // Set maximum e-value for hits to be counted + evalue="0.001" + // Set minimum bitscore for best hit in taxonomy assignment (default = 30) + bitscore="30" // Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment minID="40" // Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment @@ -122,7 +149,6 @@ params { // DIAMOND taxonomy inference using NCBI taxmap files (can be downloaded using the startup script using the option -t); set to "true" for this to run (ONLY WORKS WITH dbtype="NCBI") ncbitax="false" - // Phylogeny analysis parameters // Customs options for IQ-TREE (Example: "-option1 A -option2 B -option3 C -option4 D") @@ -166,7 +192,7 @@ params { // Manadotory arguments Analyze=false DataCheck=false -// Non-Mandatory Clustering options +// Non-Mandatory options // Cluster nucleotide sequences (ncASVs) ncASV = false // Cluster by aminoacid translations and generate protein-based OTUs (pcASVs) @@ -175,7 +201,8 @@ params { asvMED = false // Generate virus types with MED of ASV sequences aminoMED = false - + // Filtr ASVs + filter = false // Skip options // Skip all Read Processing steps skipReadProcessing=false From fd354888b68bcec6b93371003ae65b6c75dc76d7 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 09:39:08 -0500 Subject: [PATCH 175/223] revised y axis label for clustering curves --- bin/vAMPirus_DC_Report.Rmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/vAMPirus_DC_Report.Rmd b/bin/vAMPirus_DC_Report.Rmd index 5cb0384..327b044 100644 --- a/bin/vAMPirus_DC_Report.Rmd +++ b/bin/vAMPirus_DC_Report.Rmd @@ -374,7 +374,7 @@ nn=read.csv("number_per_percentage_nucl.csv", header=TRUE) #nn=read.csv("number_per_percentage_nucl.csv", header=T) nnp <- plot_ly(nn, x=nn[,1], y=nn[,2], type="scatter", mode = 'lines+markers', marker=list(color='#088da5', line=list(color = 'black', width = .1)), hovertemplate = paste('ID%: %{x}','
    Number of ncASVs: %{y}','')) -nnp <- nnp %>% layout(yaxis = list(title = "Number of nOTU")) +nnp <- nnp %>% layout(yaxis = list(title = "Number of ncASVs")) nnp <- nnp %>% layout(xaxis = list(title = "Clustering ID %")) nnp <- nnp %>% config(toImageButtonOptions=list(format='svg',filename='NuclClustresults', height= 500, width= 800, scale= 1)) nnp @@ -391,7 +391,7 @@ pn=read.csv("number_per_percentage_prot.csv", header=TRUE) #pn=read.csv("number_per_percentage_prot.csv", header=T) pnp <- plot_ly(pn, x=pn[,1], y=pn[,2], type="scatter", mode = 'lines+markers', marker=list(color='#088da5', line=list(color = 'black', width = .1)), hovertemplate = paste('ID%: %{x}','
    Number of pcASVs: %{y}','')) -pnp <- pnp %>% layout(yaxis = list(title = "Number of pOTU")) +pnp <- pnp %>% layout(yaxis = list(title = "Number of pcASVs")) pnp <- pnp %>% layout(xaxis = list(title = "Clustering ID %")) pnp <- pnp %>% config(toImageButtonOptions=list(format='svg',filename='Protclustresults', height= 500, width= 800, scale= 1)) pnp From af04eb504ffb27f36d66c00b45f1c0036c8fac00 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 09:40:22 -0500 Subject: [PATCH 176/223] added med options to test config --- example_data/conf/test.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/example_data/conf/test.config b/example_data/conf/test.config index 7149b5d..cbc63e1 100644 --- a/example_data/conf/test.config +++ b/example_data/conf/test.config @@ -22,4 +22,6 @@ params { aminoC=5 asvC=5 stats = true + aminoMED = true + asvMED = true } From f4e787147843375e0ef78082c679831b1f244c2d Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 10:32:40 -0500 Subject: [PATCH 177/223] Added ASV filtering options and help info --- docs/HelpDocumentation.md | 36 ++++++++++++++++++++++++++++++++++-- vampirus.config | 6 +++--- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/docs/HelpDocumentation.md b/docs/HelpDocumentation.md index 689d892..5c085c8 100644 --- a/docs/HelpDocumentation.md +++ b/docs/HelpDocumentation.md @@ -319,7 +319,7 @@ After running the above you should now have Nextflow installed. Now, build the S then test the Analyze pipeline with: - ./nextflow run vAMPirus.nf -c vampirus.config -profile singularity,test --Analyze --ncASV --pcASV --stats + ./nextflow run vAMPirus.nf -c vampirus.config -profile singularity,test --Analyze --ncASV --pcASV --asvMED --aminoMED --stats Please check out http://sourabhbajaj.com/mac-setup/Vagrant/README.html and https://www.vagrantup.com/docs/providers/virtualbox for understanding how to use Vagrant commands like "halt", "suspend" or "reload" @@ -1021,7 +1021,7 @@ This is where the DataCheck report is very useful, you can review the report and The goal of vAMPirus was to make it easy for the user to analyze their data is many different ways to potentially reveal patterns that would have been missed if limited to one method/pipeline. -A major and sometimes difficult step in analyzing virus amplicon sequence data is deciding the method to use for identifying or defining different viral "species" in the data. To aid this process, vAMPirus has the DataCheck mode discussed above and has several different options for sequence clustering/analysis for the user to decide between. +A major, and sometimes difficult, step in analyzing virus amplicon sequence data is deciding the method to use for identifying or defining different viral "species" in the data. To aid this process, vAMPirus has the DataCheck mode discussed above and has several different options for sequence clustering/analysis for the user to decide between. vAMPirus relies on vsearch using the UNOISE3 algorithm to generate Amplicon Sequencing Variants (ASVs) from dereplicated amplicon reads. ASVs are always generated by default and there are two parameters that the user can specify either in the launch command or by editing the configuration file at lines 45-49: @@ -1037,6 +1037,38 @@ Launch command to produce only ASV-related analyses: nextflow run vAMPirus.nf -c vampirus.config -profile [conda|singularity] --Analyze --stats --skipAminoTyping +### ASV filtering + +New to version 2 you can now filter ASVs to remove sequences that belong to taxonomic groups that are not of interest for a given run. + +A great example of when this feature is useful is Prodinger et al. 2020 (https://www.mdpi.com/2076-2607/8/4/506). In this study they looked to amplify and analyze Mimiviridae polB sequences, however, polB is also found in cellular genomes like bacteria. In this case, Prodinger et al. looked to avoid including any bacterial polB in their final results and thus used a filtering step to remove microbial sequences. The ASV filtering feature can be used to do exactly this type of filtering where you provide paths to a "filter database" containing sequences belonging to non-target groups (e.g. microbial polB) and a "keep database" containing sequences belonging to the target group (e.g. Mimiviridae polB). Any ASVs that match non-target sequences will then be filtered from the ASV file prior to running the DataCheck or Analyze pipeline. + +Here are the options stored within the configuration file: + + // ASV filtering parameters - You can set the filtering to run with the command --filter + + // Path to database containing sequences that if ASVs match to, are then removed prior to any analyses + filtDB="" + // Path to database containing sequences that if ASVs match to, are kept for final ASV file to be used in subsequent analyses + keepDB="" + // Keep any sequences without hits - for yes, set keepnohit to ="true" + keepnohit="true" + + //Parameters for diamond command for filtering + + // Set minimum percent amino acid similarity for best hit to be counted in taxonomy assignment + filtminID="80" + // Set minimum amino acid alignment length for best hit to be counted in taxonomy assignment + filtminaln="30" + // Set sensitivity parameters for DIAMOND aligner (read more here: https://github.com/bbuchfink/diamond/wiki; default = ultra-sensitive) + filtsensitivity="ultra-sensitive" + // Set the max e-value for best hit to be recorded + filtevalue="0.001" + + + +### Clustering options + Now, onto clustering ASVs into clustered ASVs (cASVs). vAMPirus is able to use two different techniques for generating cASVs for the user: diff --git a/vampirus.config b/vampirus.config index 8c34321..0e0deae 100644 --- a/vampirus.config +++ b/vampirus.config @@ -75,11 +75,11 @@ params { // Minimum length of amino acid translation to be considered during protein clustered ASV (pcASV) generation. Recommended to put this at the expected amino acid sequence length based on your maximum read length (e.g. if maxLen="420", then minAA should be 420/3 so 140) minAA="140" - // Filtering parameters - You can set the filtering to run with the command --filter + // ASV filtering parameters - You can set the filtering to run with the command --filter - // Path to database + // Path to database containing sequences that if ASVs match, are then removed prior to any analyses filtDB="" - // Path to database of + // Path to database containing sequences that if ASVs match to, are kept for final ASV file to be used in susequent analyses keepDB="" // Keep any sequences without hits - for yes, set keepnohit to ="true" keepnohit="true" From 589672859ab1cfb7da34d855a40a5d2e8854c875 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 10:48:58 -0500 Subject: [PATCH 178/223] removed MED boxplot --- bin/vAMPirus_DC_Report.Rmd | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/bin/vAMPirus_DC_Report.Rmd b/bin/vAMPirus_DC_Report.Rmd index 327b044..50d6ec1 100644 --- a/bin/vAMPirus_DC_Report.Rmd +++ b/bin/vAMPirus_DC_Report.Rmd @@ -451,21 +451,6 @@ med_amino_csv=read.csv(paste(params$projtag, sep="", "_AminoType_entropy_breakdo paged_table(med_amino_csv, options = list(rows.print = 10)) ```
    - -### ASVs vs AminoTypes - -
    - -```{r med_comparison, echo=FALSE} -med_asv=read.delim(paste(params$projtag, sep="","_ASVs_Aligned_informativeonly.fasta-ENTROPY"), sep = ",", header=TRUE) -med_amino=read.delim(paste(params$projtag, sep="","_AminoTypes_Aligned_informativeonly.fasta-ENTROPY"), sep = ",", header=TRUE) - -mplotbox <- plot_ly(med_asv, y=med_asv$Shannons_Entropy, type="box", boxmean='sd', boxpoints="outlier", jitter=0.1, pointpos=0, name="ASVs") -mplotbox<- mplotbox %>% add_trace(med_amino, y=med_amino$Shannons_Entropy, type="box", boxmean='sd', boxpoints="outliers", jitter=0.1, pointpos=0, name="AminoTypes") -mplotbox<- mplotbox %>% layout(legend = list(y=.5)) -mplotbox<- mplotbox %>% config(toImageButtonOptions=list(format='svg',filename='ASV_vs_AminoTypes', height= 500, width= 800, scale= 1), displaylogo = FALSE) -mplotbox -```


    From d512df36e734f8e2d888853743c71e819b77004b Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 13:45:29 -0500 Subject: [PATCH 179/223] added more values for med table in datacheck --- vAMPirus.nf | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/vAMPirus.nf b/vAMPirus.nf index 4170216..3a92691 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1234,9 +1234,36 @@ if (params.DataCheck || params.Analyze) { if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; then echo dope >> above-1.0-.list fi + if [[ \$(echo ""\$x" > 1.1"|bc -l) -eq 1 ]]; + then echo dope >> above-1.1-.list + fi + if [[ \$(echo ""\$x" > 1.2"|bc -l) -eq 1 ]]; + then echo dope >> above-1.2-.list + fi + if [[ \$(echo ""\$x" > 1.3"|bc -l) -eq 1 ]]; + then echo dope >> above-1.3-.list + fi + if [[ \$(echo ""\$x" > 1.4"|bc -l) -eq 1 ]]; + then echo dope >> above-1.4-.list + fi if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; then echo dope >> above-1.5-.list fi + if [[ \$(echo ""\$x" > 1.6"|bc -l) -eq 1 ]]; + then echo dope >> above-1.6-.list + fi + if [[ \$(echo ""\$x" > 1.7"|bc -l) -eq 1 ]]; + then echo dope >> above-1.7-.list + fi + if [[ \$(echo ""\$x" > 1.8"|bc -l) -eq 1 ]]; + then echo dope >> above-1.8-.list + fi + if [[ \$(echo ""\$x" > 1.9"|bc -l) -eq 1 ]]; + then echo dope >> above-1.9-.list + fi + if [[ \$(echo ""\$x" > 2.0"|bc -l) -eq 1 ]]; + then echo dope >> above-2.0-.list + fi done echo "Entropy,Peaks_above" >> ${params.projtag}_ASV_entropy_breakdown.csv for z in above*.list; @@ -1318,9 +1345,35 @@ if (params.DataCheck || params.Analyze) { if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; then echo dope >> above-1.0-.list fi + if [[ \$(echo ""\$x" > 1.1"|bc -l) -eq 1 ]]; + then echo dope >> above-1.1-.list + fi + if [[ \$(echo ""\$x" > 1.2"|bc -l) -eq 1 ]]; + then echo dope >> above-1.2-.list + fi + if [[ \$(echo ""\$x" > 1.3"|bc -l) -eq 1 ]]; + then echo dope >> above-1.3-.list + fi + if [[ \$(echo ""\$x" > 1.4"|bc -l) -eq 1 ]]; + then echo dope >> above-1.4-.list if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; then echo dope >> above-1.5-.list fi + if [[ \$(echo ""\$x" > 1.6"|bc -l) -eq 1 ]]; + then echo dope >> above-1.6-.list + fi + if [[ \$(echo ""\$x" > 1.7"|bc -l) -eq 1 ]]; + then echo dope >> above-1.7-.list + fi + if [[ \$(echo ""\$x" > 1.8"|bc -l) -eq 1 ]]; + then echo dope >> above-1.8-.list + fi + if [[ \$(echo ""\$x" > 1.9"|bc -l) -eq 1 ]]; + then echo dope >> above-1.9-.list + fi + if [[ \$(echo ""\$x" > 2.0"|bc -l) -eq 1 ]]; + then echo dope >> above-2.0-.list + fi done echo "Entropy,Peaks_above" >> ${params.projtag}_AminoType_entropy_breakdown.csv for z in above*.list; From 86d636279e7c66705f0839ed8db9d8d3a33819b1 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 14:43:54 -0500 Subject: [PATCH 180/223] fixed for loop in filtering --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 3a92691..59cde39 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -971,7 +971,7 @@ if (params.DataCheck || params.Analyze) { diamond blastx -q ${asv} -d combodatabase.fasta -p ${task.cpus} --id ${params.filtminID} -l ${params.filtminaln} -e ${params.filtevalue} --${params.filtsensitivity} -o ${params.projtag}_diamondfilter.out -f 6 qseqid qlen sseqid qstart qend qseq sseq length qframe evalue bitscore pident --max-target-seqs 1 --max-hsps 1 #get asvs grep ">" ${asv} | awk -F ">" '{print \$2}' > asv.list - for x in $(cat asv.list) + for x in \$(cat asv.list) do #check for a hit if [[ \$(grep -c "\$x" ${params.projtag}_diamondfilter.out) -eq 1 ]] then #check if hit is to filter From 2bd9ab2bc3e2949d39f1f267dbd0f6f0b2b41b64 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 14:52:59 -0500 Subject: [PATCH 181/223] fixed if statement for fitering --- vAMPirus.nf | 4 ++-- vampirus.config | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 59cde39..899cef1 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -930,7 +930,7 @@ if (params.DataCheck || params.Analyze) { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/FilterCont", mode: "copy", overwrite: true, pattern: '*.fasta' + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/FilterCont", mode: "copy", overwrite: true input: file(asv) from asvforfilt @@ -1009,7 +1009,7 @@ if (params.DataCheck || params.Analyze) { } else { asvforfilt - .into{ reads_vsearch5_ch, asv_med, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck } + .into{ reads_vsearch5_ch; asv_med; nucl2aa; asvsforAminotyping; asvfastaforcounts; asvaminocheck } } if (params.DataCheck) { diff --git a/vampirus.config b/vampirus.config index 0e0deae..80876ea 100644 --- a/vampirus.config +++ b/vampirus.config @@ -201,7 +201,7 @@ params { asvMED = false // Generate virus types with MED of ASV sequences aminoMED = false - // Filtr ASVs + // Filter ASVs filter = false // Skip options // Skip all Read Processing steps From 6dd92a7341ec0a2e244122ba12f073ff0e710c55 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 15:06:08 -0500 Subject: [PATCH 182/223] fixed aminomed datacheck --- vAMPirus.nf | 84 ++++++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 899cef1..66c520a 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1201,67 +1201,67 @@ if (params.DataCheck || params.Analyze) { awk '{print \$2}' ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list for x in \$(cat tmp_value.list) do echo "\$x" - if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.0"|bc -l) -eq 1 ]]; then echo dope >> above-0.0-.list fi - if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.1"|bc -l) -eq 1 ]]; then echo dope >> above-0.1-.list fi - if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.2"|bc -l) -eq 1 ]]; then echo dope >> above-0.2-.list fi - if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.3"|bc -l) -eq 1 ]]; then echo dope >> above-0.3-.list fi - if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.4"|bc -l) -eq 1 ]]; then echo dope >> above-0.4-.list fi - if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.5"|bc -l) -eq 1 ]]; then echo dope >> above-0.5-.list fi - if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.6"|bc -l) -eq 1 ]]; then echo dope >> above-0.6-.list fi - if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.7"|bc -l) -eq 1 ]]; then echo dope >> above-0.7-.list fi - if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.8"|bc -l) -eq 1 ]]; then echo dope >> above-0.8-.list fi - if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.9"|bc -l) -eq 1 ]]; then echo dope >> above-0.9-.list fi - if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.0"|bc -l) -eq 1 ]]; then echo dope >> above-1.0-.list fi - if [[ \$(echo ""\$x" > 1.1"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.1"|bc -l) -eq 1 ]]; then echo dope >> above-1.1-.list fi - if [[ \$(echo ""\$x" > 1.2"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.2"|bc -l) -eq 1 ]]; then echo dope >> above-1.2-.list fi - if [[ \$(echo ""\$x" > 1.3"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.3"|bc -l) -eq 1 ]]; then echo dope >> above-1.3-.list fi - if [[ \$(echo ""\$x" > 1.4"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.4"|bc -l) -eq 1 ]]; then echo dope >> above-1.4-.list fi - if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.5"|bc -l) -eq 1 ]]; then echo dope >> above-1.5-.list fi - if [[ \$(echo ""\$x" > 1.6"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.6"|bc -l) -eq 1 ]]; then echo dope >> above-1.6-.list fi - if [[ \$(echo ""\$x" > 1.7"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.7"|bc -l) -eq 1 ]]; then echo dope >> above-1.7-.list fi - if [[ \$(echo ""\$x" > 1.8"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.8"|bc -l) -eq 1 ]]; then echo dope >> above-1.8-.list fi - if [[ \$(echo ""\$x" > 1.9"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.9"|bc -l) -eq 1 ]]; then echo dope >> above-1.9-.list fi - if [[ \$(echo ""\$x" > 2.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 2.0"|bc -l) -eq 1 ]]; then echo dope >> above-2.0-.list fi done @@ -1312,66 +1312,66 @@ if (params.DataCheck || params.Analyze) { awk '{print \$2}' ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list for x in \$(cat tmp_value.list) do echo "\$x" - if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.0"|bc -l) -eq 1 ]]; then echo dope >> above-0.0-.list fi - if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.1"|bc -l) -eq 1 ]]; then echo dope >> above-0.1-.list fi - if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.2"|bc -l) -eq 1 ]]; then echo dope >> above-0.2-.list fi - if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.3"|bc -l) -eq 1 ]]; then echo dope >> above-0.3-.list fi - if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.4"|bc -l) -eq 1 ]]; then echo dope >> above-0.4-.list fi - if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.5"|bc -l) -eq 1 ]]; then echo dope >> above-0.5-.list fi - if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.6"|bc -l) -eq 1 ]]; then echo dope >> above-0.6-.list fi - if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.7"|bc -l) -eq 1 ]]; then echo dope >> above-0.7-.list fi - if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.8"|bc -l) -eq 1 ]]; then echo dope >> above-0.8-.list fi - if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 0.9"|bc -l) -eq 1 ]]; then echo dope >> above-0.9-.list fi - if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.0"|bc -l) -eq 1 ]]; then echo dope >> above-1.0-.list fi - if [[ \$(echo ""\$x" > 1.1"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.1"|bc -l) -eq 1 ]]; then echo dope >> above-1.1-.list fi - if [[ \$(echo ""\$x" > 1.2"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.2"|bc -l) -eq 1 ]]; then echo dope >> above-1.2-.list fi - if [[ \$(echo ""\$x" > 1.3"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.3"|bc -l) -eq 1 ]]; then echo dope >> above-1.3-.list fi - if [[ \$(echo ""\$x" > 1.4"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.4"|bc -l) -eq 1 ]]; then echo dope >> above-1.4-.list - if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.5"|bc -l) -eq 1 ]]; then echo dope >> above-1.5-.list fi - if [[ \$(echo ""\$x" > 1.6"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.6"|bc -l) -eq 1 ]]; then echo dope >> above-1.6-.list fi - if [[ \$(echo ""\$x" > 1.7"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.7"|bc -l) -eq 1 ]]; then echo dope >> above-1.7-.list fi - if [[ \$(echo ""\$x" > 1.8"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.8"|bc -l) -eq 1 ]]; then echo dope >> above-1.8-.list fi - if [[ \$(echo ""\$x" > 1.9"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 1.9"|bc -l) -eq 1 ]]; then echo dope >> above-1.9-.list fi - if [[ \$(echo ""\$x" > 2.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x" > 2.0"|bc -l) -eq 1 ]]; then echo dope >> above-2.0-.list fi done From 07af4f395448ce745553cbcd31e75425f254e296 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 15:15:15 -0500 Subject: [PATCH 183/223] test --- vAMPirus.nf | 84 ++++++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 66c520a..899cef1 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1201,67 +1201,67 @@ if (params.DataCheck || params.Analyze) { awk '{print \$2}' ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list for x in \$(cat tmp_value.list) do echo "\$x" - if [[ \$(echo "\$x" > 0.0"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; then echo dope >> above-0.0-.list fi - if [[ \$(echo "\$x" > 0.1"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; then echo dope >> above-0.1-.list fi - if [[ \$(echo "\$x" > 0.2"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; then echo dope >> above-0.2-.list fi - if [[ \$(echo "\$x" > 0.3"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; then echo dope >> above-0.3-.list fi - if [[ \$(echo "\$x" > 0.4"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; then echo dope >> above-0.4-.list fi - if [[ \$(echo "\$x" > 0.5"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; then echo dope >> above-0.5-.list fi - if [[ \$(echo "\$x" > 0.6"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; then echo dope >> above-0.6-.list fi - if [[ \$(echo "\$x" > 0.7"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; then echo dope >> above-0.7-.list fi - if [[ \$(echo "\$x" > 0.8"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; then echo dope >> above-0.8-.list fi - if [[ \$(echo "\$x" > 0.9"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; then echo dope >> above-0.9-.list fi - if [[ \$(echo "\$x" > 1.0"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; then echo dope >> above-1.0-.list fi - if [[ \$(echo "\$x" > 1.1"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.1"|bc -l) -eq 1 ]]; then echo dope >> above-1.1-.list fi - if [[ \$(echo "\$x" > 1.2"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.2"|bc -l) -eq 1 ]]; then echo dope >> above-1.2-.list fi - if [[ \$(echo "\$x" > 1.3"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.3"|bc -l) -eq 1 ]]; then echo dope >> above-1.3-.list fi - if [[ \$(echo "\$x" > 1.4"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.4"|bc -l) -eq 1 ]]; then echo dope >> above-1.4-.list fi - if [[ \$(echo "\$x" > 1.5"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; then echo dope >> above-1.5-.list fi - if [[ \$(echo "\$x" > 1.6"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.6"|bc -l) -eq 1 ]]; then echo dope >> above-1.6-.list fi - if [[ \$(echo "\$x" > 1.7"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.7"|bc -l) -eq 1 ]]; then echo dope >> above-1.7-.list fi - if [[ \$(echo "\$x" > 1.8"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.8"|bc -l) -eq 1 ]]; then echo dope >> above-1.8-.list fi - if [[ \$(echo "\$x" > 1.9"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.9"|bc -l) -eq 1 ]]; then echo dope >> above-1.9-.list fi - if [[ \$(echo "\$x" > 2.0"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 2.0"|bc -l) -eq 1 ]]; then echo dope >> above-2.0-.list fi done @@ -1312,66 +1312,66 @@ if (params.DataCheck || params.Analyze) { awk '{print \$2}' ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list for x in \$(cat tmp_value.list) do echo "\$x" - if [[ \$(echo "\$x" > 0.0"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; then echo dope >> above-0.0-.list fi - if [[ \$(echo "\$x" > 0.1"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; then echo dope >> above-0.1-.list fi - if [[ \$(echo "\$x" > 0.2"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; then echo dope >> above-0.2-.list fi - if [[ \$(echo "\$x" > 0.3"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; then echo dope >> above-0.3-.list fi - if [[ \$(echo "\$x" > 0.4"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; then echo dope >> above-0.4-.list fi - if [[ \$(echo "\$x" > 0.5"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; then echo dope >> above-0.5-.list fi - if [[ \$(echo "\$x" > 0.6"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; then echo dope >> above-0.6-.list fi - if [[ \$(echo "\$x" > 0.7"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; then echo dope >> above-0.7-.list fi - if [[ \$(echo "\$x" > 0.8"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; then echo dope >> above-0.8-.list fi - if [[ \$(echo "\$x" > 0.9"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; then echo dope >> above-0.9-.list fi - if [[ \$(echo "\$x" > 1.0"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; then echo dope >> above-1.0-.list fi - if [[ \$(echo "\$x" > 1.1"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.1"|bc -l) -eq 1 ]]; then echo dope >> above-1.1-.list fi - if [[ \$(echo "\$x" > 1.2"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.2"|bc -l) -eq 1 ]]; then echo dope >> above-1.2-.list fi - if [[ \$(echo "\$x" > 1.3"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.3"|bc -l) -eq 1 ]]; then echo dope >> above-1.3-.list fi - if [[ \$(echo "\$x" > 1.4"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.4"|bc -l) -eq 1 ]]; then echo dope >> above-1.4-.list - if [[ \$(echo "\$x" > 1.5"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; then echo dope >> above-1.5-.list fi - if [[ \$(echo "\$x" > 1.6"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.6"|bc -l) -eq 1 ]]; then echo dope >> above-1.6-.list fi - if [[ \$(echo "\$x" > 1.7"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.7"|bc -l) -eq 1 ]]; then echo dope >> above-1.7-.list fi - if [[ \$(echo "\$x" > 1.8"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.8"|bc -l) -eq 1 ]]; then echo dope >> above-1.8-.list fi - if [[ \$(echo "\$x" > 1.9"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 1.9"|bc -l) -eq 1 ]]; then echo dope >> above-1.9-.list fi - if [[ \$(echo "\$x" > 2.0"|bc -l) -eq 1 ]]; + if [[ \$(echo ""\$x" > 2.0"|bc -l) -eq 1 ]]; then echo dope >> above-2.0-.list fi done From 41c79337cce4696b933404a77fe27a56101eeb96 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 15:21:03 -0500 Subject: [PATCH 184/223] fixe quotes --- vAMPirus.nf | 84 ++++++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 899cef1..3a874c3 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1201,67 +1201,67 @@ if (params.DataCheck || params.Analyze) { awk '{print \$2}' ${params.projtag}_ASVs_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list for x in \$(cat tmp_value.list) do echo "\$x" - if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.0"|bc -l) -eq 1 ]]; then echo dope >> above-0.0-.list fi - if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.1"|bc -l) -eq 1 ]]; then echo dope >> above-0.1-.list fi - if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.2"|bc -l) -eq 1 ]]; then echo dope >> above-0.2-.list fi - if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.3"|bc -l) -eq 1 ]]; then echo dope >> above-0.3-.list fi - if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.4"|bc -l) -eq 1 ]]; then echo dope >> above-0.4-.list fi - if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.5"|bc -l) -eq 1 ]]; then echo dope >> above-0.5-.list fi - if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.6"|bc -l) -eq 1 ]]; then echo dope >> above-0.6-.list fi - if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.7"|bc -l) -eq 1 ]]; then echo dope >> above-0.7-.list fi - if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.8"|bc -l) -eq 1 ]]; then echo dope >> above-0.8-.list fi - if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.9"|bc -l) -eq 1 ]]; then echo dope >> above-0.9-.list fi - if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.0"|bc -l) -eq 1 ]]; then echo dope >> above-1.0-.list fi - if [[ \$(echo ""\$x" > 1.1"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.1"|bc -l) -eq 1 ]]; then echo dope >> above-1.1-.list fi - if [[ \$(echo ""\$x" > 1.2"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.2"|bc -l) -eq 1 ]]; then echo dope >> above-1.2-.list fi - if [[ \$(echo ""\$x" > 1.3"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.3"|bc -l) -eq 1 ]]; then echo dope >> above-1.3-.list fi - if [[ \$(echo ""\$x" > 1.4"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.4"|bc -l) -eq 1 ]]; then echo dope >> above-1.4-.list fi - if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.5"|bc -l) -eq 1 ]]; then echo dope >> above-1.5-.list fi - if [[ \$(echo ""\$x" > 1.6"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.6"|bc -l) -eq 1 ]]; then echo dope >> above-1.6-.list fi - if [[ \$(echo ""\$x" > 1.7"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.7"|bc -l) -eq 1 ]]; then echo dope >> above-1.7-.list fi - if [[ \$(echo ""\$x" > 1.8"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.8"|bc -l) -eq 1 ]]; then echo dope >> above-1.8-.list fi - if [[ \$(echo ""\$x" > 1.9"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.9"|bc -l) -eq 1 ]]; then echo dope >> above-1.9-.list fi - if [[ \$(echo ""\$x" > 2.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 2.0"|bc -l) -eq 1 ]]; then echo dope >> above-2.0-.list fi done @@ -1312,66 +1312,66 @@ if (params.DataCheck || params.Analyze) { awk '{print \$2}' ${params.projtag}_AminoTypes_Aligned_informativeonly.fasta-ENTROPY >> tmp_value.list for x in \$(cat tmp_value.list) do echo "\$x" - if [[ \$(echo ""\$x" > 0.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.0"|bc -l) -eq 1 ]]; then echo dope >> above-0.0-.list fi - if [[ \$(echo ""\$x" > 0.1"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.1"|bc -l) -eq 1 ]]; then echo dope >> above-0.1-.list fi - if [[ \$(echo ""\$x" > 0.2"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.2"|bc -l) -eq 1 ]]; then echo dope >> above-0.2-.list fi - if [[ \$(echo ""\$x" > 0.3"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.3"|bc -l) -eq 1 ]]; then echo dope >> above-0.3-.list fi - if [[ \$(echo ""\$x" > 0.4"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.4"|bc -l) -eq 1 ]]; then echo dope >> above-0.4-.list fi - if [[ \$(echo ""\$x" > 0.5"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.5"|bc -l) -eq 1 ]]; then echo dope >> above-0.5-.list fi - if [[ \$(echo ""\$x" > 0.6"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.6"|bc -l) -eq 1 ]]; then echo dope >> above-0.6-.list fi - if [[ \$(echo ""\$x" > 0.7"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.7"|bc -l) -eq 1 ]]; then echo dope >> above-0.7-.list fi - if [[ \$(echo ""\$x" > 0.8"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.8"|bc -l) -eq 1 ]]; then echo dope >> above-0.8-.list fi - if [[ \$(echo ""\$x" > 0.9"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 0.9"|bc -l) -eq 1 ]]; then echo dope >> above-0.9-.list fi - if [[ \$(echo ""\$x" > 1.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.0"|bc -l) -eq 1 ]]; then echo dope >> above-1.0-.list fi - if [[ \$(echo ""\$x" > 1.1"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.1"|bc -l) -eq 1 ]]; then echo dope >> above-1.1-.list fi - if [[ \$(echo ""\$x" > 1.2"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.2"|bc -l) -eq 1 ]]; then echo dope >> above-1.2-.list fi - if [[ \$(echo ""\$x" > 1.3"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.3"|bc -l) -eq 1 ]]; then echo dope >> above-1.3-.list fi - if [[ \$(echo ""\$x" > 1.4"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.4"|bc -l) -eq 1 ]]; then echo dope >> above-1.4-.list - if [[ \$(echo ""\$x" > 1.5"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.5"|bc -l) -eq 1 ]]; then echo dope >> above-1.5-.list fi - if [[ \$(echo ""\$x" > 1.6"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.6"|bc -l) -eq 1 ]]; then echo dope >> above-1.6-.list fi - if [[ \$(echo ""\$x" > 1.7"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.7"|bc -l) -eq 1 ]]; then echo dope >> above-1.7-.list fi - if [[ \$(echo ""\$x" > 1.8"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.8"|bc -l) -eq 1 ]]; then echo dope >> above-1.8-.list fi - if [[ \$(echo ""\$x" > 1.9"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 1.9"|bc -l) -eq 1 ]]; then echo dope >> above-1.9-.list fi - if [[ \$(echo ""\$x" > 2.0"|bc -l) -eq 1 ]]; + if [[ \$(echo "\$x > 2.0"|bc -l) -eq 1 ]]; then echo dope >> above-2.0-.list fi done From fbdcc4dd8925be3e84ffdcba0d7c771bd049d7f9 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 15:26:01 -0500 Subject: [PATCH 185/223] fixed for loop --- vAMPirus.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/vAMPirus.nf b/vAMPirus.nf index 3a874c3..4ac928a 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1356,6 +1356,7 @@ if (params.DataCheck || params.Analyze) { fi if [[ \$(echo "\$x > 1.4"|bc -l) -eq 1 ]]; then echo dope >> above-1.4-.list + fi if [[ \$(echo "\$x > 1.5"|bc -l) -eq 1 ]]; then echo dope >> above-1.5-.list fi From 5e54ca2634d83a52d8a295dc1112d80284f12040 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 15:52:39 -0500 Subject: [PATCH 186/223] updated ggtree in yaml --- vampirus_env.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vampirus_env.yml b/vampirus_env.yml index cb10503..f7222a3 100644 --- a/vampirus_env.yml +++ b/vampirus_env.yml @@ -32,7 +32,7 @@ dependencies: - r-tidyverse=1.3.0 - r-cowplot=1.0.0 - r-scales=1.1.1 - - bioconductor-ggtree=2.2.1 + - bioconductor-ggtree=3.0.1 - bioconductor-biocparallel=1.24.0 - pigz=2.4 - r-biocmanager=1.30.10 From 4eeaa440c5acc06ae218eacd486ed379530ff6c8 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 16:42:59 -0500 Subject: [PATCH 187/223] ggtree info changes --- bin/vAMPirus_DC_Report.Rmd | 4 +++- vampirus_env.yml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/vAMPirus_DC_Report.Rmd b/bin/vAMPirus_DC_Report.Rmd index 50d6ec1..728e770 100644 --- a/bin/vAMPirus_DC_Report.Rmd +++ b/bin/vAMPirus_DC_Report.Rmd @@ -36,7 +36,6 @@ library(tidyverse) library(scales) library(cowplot) library(dplyr) -library(ggtree) library(plotly) #library(BiocParallel) library(knitr) @@ -460,3 +459,6 @@ paged_table(med_amino_csv, options = list(rows.print = 10))


    +
    +
    +
    diff --git a/vampirus_env.yml b/vampirus_env.yml index f7222a3..cb10503 100644 --- a/vampirus_env.yml +++ b/vampirus_env.yml @@ -32,7 +32,7 @@ dependencies: - r-tidyverse=1.3.0 - r-cowplot=1.0.0 - r-scales=1.1.1 - - bioconductor-ggtree=3.0.1 + - bioconductor-ggtree=2.2.1 - bioconductor-biocparallel=1.24.0 - pigz=2.4 - r-biocmanager=1.30.10 From 8121ca88b07d43d7d16773e3df5203b934904b40 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 16:48:40 -0500 Subject: [PATCH 188/223] fixed measure if statement --- vAMPirus.nf | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 4ac928a..1991bac 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1509,9 +1509,9 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - if [[ ${params.measurement} == "bitscore"]] + if [[ ${params.measurement} == "bitscore" ]] then measure="--min-score ${params.bitscore}" - elif [[ ${params.measurement} == "evalue"]] + elif [[ ${params.measurement} == "evalue" ]] then measure="-e ${params.evalue}" else measure="--min-score ${params.bitscore}" fi @@ -1663,9 +1663,9 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - if [[ ${params.measurement} == "bitscore"]] + if [[ ${params.measurement} == "bitscore" ]] then measure="--min-score ${params.bitscore}" - elif [[ ${params.measurement} == "evalue"]] + elif [[ ${params.measurement} == "evalue" ]] then measure="-e ${params.evalue}" else measure="--min-score ${params.bitscore}" fi @@ -1904,9 +1904,9 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - if [[ ${params.measurement} == "bitscore"]] + if [[ ${params.measurement} == "bitscore" ]] then measure="--min-score ${params.bitscore}" - elif [[ ${params.measurement} == "evalue"]] + elif [[ ${params.measurement} == "evalue" ]] then measure="-e ${params.evalue}" else measure="--min-score ${params.bitscore}" fi @@ -2056,9 +2056,9 @@ if (params.DataCheck || params.Analyze) { cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} grep ">" \${virdb} > headers.list - if [[ ${params.measurement} == "bitscore"]] + if [[ ${params.measurement} == "bitscore" ]] then measure="--min-score ${params.bitscore}" - elif [[ ${params.measurement} == "evalue"]] + elif [[ ${params.measurement} == "evalue" ]] then measure="-e ${params.evalue}" else measure="--min-score ${params.bitscore}" fi @@ -2597,9 +2597,9 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - if [[ ${params.measurement} == "bitscore"]] + if [[ ${params.measurement} == "bitscore" ]] then measure="--min-score ${params.bitscore}" - elif [[ ${params.measurement} == "evalue"]] + elif [[ ${params.measurement} == "evalue" ]] then measure="-e ${params.evalue}" else measure="--min-score ${params.bitscore}" fi @@ -2748,9 +2748,9 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - if [[ ${params.measurement} == "bitscore"]] + if [[ ${params.measurement} == "bitscore" ]] then measure="--min-score ${params.bitscore}" - elif [[ ${params.measurement} == "evalue"]] + elif [[ ${params.measurement} == "evalue" ]] then measure="-e ${params.evalue}" else measure="--min-score ${params.bitscore}" fi @@ -3248,9 +3248,9 @@ if (params.DataCheck || params.Analyze) { set +e cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - if [[ ${params.measurement} == "bitscore"]] + if [[ ${params.measurement} == "bitscore" ]] then measure="--min-score ${params.bitscore}" - elif [[ ${params.measurement} == "evalue"]] + elif [[ ${params.measurement} == "evalue" ]] then measure="-e ${params.evalue}" else measure="--min-score ${params.bitscore}" fi @@ -3404,9 +3404,9 @@ if (params.DataCheck || params.Analyze) { set +e cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - if [[ ${params.measurement} == "bitscore"]] + if [[ ${params.measurement} == "bitscore" ]] then measure="--min-score ${params.bitscore}" - elif [[ ${params.measurement} == "evalue"]] + elif [[ ${params.measurement} == "evalue" ]] then measure="-e ${params.evalue}" else measure="--min-score ${params.bitscore}" fi @@ -3729,9 +3729,9 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - if [[ ${params.measurement} == "bitscore"]] + if [[ ${params.measurement} == "bitscore" ]] then measure="--min-score ${params.bitscore}" - elif [[ ${params.measurement} == "evalue"]] + elif [[ ${params.measurement} == "evalue" ]] then measure="-e ${params.evalue}" else measure="--min-score ${params.bitscore}" fi @@ -3884,9 +3884,9 @@ if (params.DataCheck || params.Analyze) { """ cp ${params.vampdir}/bin/rename_seq.py . virdb=${params.dbdir}/${params.dbname} - if [[ ${params.measurement} == "bitscore"]] + if [[ ${params.measurement} == "bitscore" ]] then measure="--min-score ${params.bitscore}" - elif [[ ${params.measurement} == "evalue"]] + elif [[ ${params.measurement} == "evalue" ]] then measure="-e ${params.evalue}" else measure="--min-score ${params.bitscore}" fi From 817797accdb7aa1cc337bfe30bd072723056adae Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 18:22:57 -0500 Subject: [PATCH 189/223] fix to filter process --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 1991bac..f009151 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -950,7 +950,7 @@ if (params.DataCheck || params.Analyze) { j=\$(( \${j}+1 )) done ./rename_seq.py ${params.filtDB} filt.headers filterdatabaserenamed.fasta - cat filterdatabase.fasta >> combodatabase.fasta + cat filterdatabaserenamed.fasta >> combodatabase.fasta paste -d',' filt.head filt.headers > filtername_map.csv rm filterdatabaserenamed.fasta From 2851b00081139ee0b72ca28ba5e662ab297944a3 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 19:03:34 -0500 Subject: [PATCH 190/223] fixed filter process --- vAMPirus.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index f009151..066f20a 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -943,7 +943,7 @@ if (params.DataCheck || params.Analyze) { cp ${params.vampdir}/bin/rename_seq.py . #create and rename filter database - grep ">" ${params.filtDB} | awk -F ">" '{print \$2}' >> filt.head + grep ">" ${params.filtDB} | sed 's/ //g' | awk -F ">" '{print \$2}' >> filt.head j=1 for y in \$( cat filt.head );do echo ">Filt"\$j"" >> filt.headers @@ -955,7 +955,7 @@ if (params.DataCheck || params.Analyze) { rm filterdatabaserenamed.fasta #create and rename keep database - grep ">" ${params.keepDB} | awk -F ">" '{print \$2}' >> keep.head + grep ">" ${params.keepDB} | sed 's/ //g' | awk -F ">" '{print \$2}' >> keep.head d=1 for y in \$( cat keep.head );do echo ">keep"\$d"" >> keep.headers From 361c168cce4605956e2cd4fd7650456f4ad390ce Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 19:09:30 -0500 Subject: [PATCH 191/223] removed rm command from filter proc --- vAMPirus.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 066f20a..4feb1b1 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -952,8 +952,7 @@ if (params.DataCheck || params.Analyze) { ./rename_seq.py ${params.filtDB} filt.headers filterdatabaserenamed.fasta cat filterdatabaserenamed.fasta >> combodatabase.fasta paste -d',' filt.head filt.headers > filtername_map.csv - rm filterdatabaserenamed.fasta - + #create and rename keep database grep ">" ${params.keepDB} | sed 's/ //g' | awk -F ">" '{print \$2}' >> keep.head d=1 From 9c2948eb0692a731ac8b14b64088fea9c3fe70fb Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 19:16:06 -0500 Subject: [PATCH 192/223] fixed quotes in process --- vAMPirus.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 4feb1b1..f7d1938 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -952,7 +952,7 @@ if (params.DataCheck || params.Analyze) { ./rename_seq.py ${params.filtDB} filt.headers filterdatabaserenamed.fasta cat filterdatabaserenamed.fasta >> combodatabase.fasta paste -d',' filt.head filt.headers > filtername_map.csv - + #create and rename keep database grep ">" ${params.keepDB} | sed 's/ //g' | awk -F ">" '{print \$2}' >> keep.head d=1 @@ -984,12 +984,12 @@ if (params.DataCheck || params.Analyze) { fi done if [[ ${params.keepnohit} == "true" ]] - then echo nohit.list >> kep.list - cat kep.list | sort > keep.list + then cat nohit.list >> kep.list + cat kep.list | sort >> keep.list seqtk subseq ${asv} keep.list > kept.fasta u=1 for y in \$( cat keep.list );do - echo ">ASV"\$u"" >> asvrename.list + echo ">ASV\${u} >> asvrename.list u=\$(( \${u}+1 )) done ./rename_seq.py ${asv} asvrename.list ${params.projtag}_ASV.fasta @@ -998,7 +998,7 @@ if (params.DataCheck || params.Analyze) { seqtk subseq ${asv} keep.list > kept.fasta u=1 for y in \$( cat keep.list );do - echo ">ASV"\$u"" >> asvrename.list + echo ">ASV\${u}" >> asvrename.list u=\$(( \${u}+1 )) done ./rename_seq.py ${asv} asvrename.list ${params.projtag}_ASV.fasta From 4fb917ab324f1559ce9cc0d28b18d429f1e38432 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 19:22:23 -0500 Subject: [PATCH 193/223] fixed quotes in filter process --- vAMPirus.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index f7d1938..0f73199 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -976,7 +976,7 @@ if (params.DataCheck || params.Analyze) { then #check if hit is to filter hit=\$(grep "\$x" ${params.projtag}_diamondfilter.out | awk '{print \$3}') if [[ \$(grep -c "\$hit" filt.headers) -eq 1 ]] - then echo "\$x,\$hit >> filtered_asvs_summary.csv + then echo "\$x,\$hit" >> filtered_asvs_summary.csv elif [[ \$(grep -c "\$hit" keep.headers) -eq 1 ]] then echo "\$x" >> kep.list fi @@ -989,7 +989,7 @@ if (params.DataCheck || params.Analyze) { seqtk subseq ${asv} keep.list > kept.fasta u=1 for y in \$( cat keep.list );do - echo ">ASV\${u} >> asvrename.list + echo ">ASV\${u}" >> asvrename.list u=\$(( \${u}+1 )) done ./rename_seq.py ${asv} asvrename.list ${params.projtag}_ASV.fasta From b2a84033abbcccc0729c205656b145b7185936fb Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 19:34:17 -0500 Subject: [PATCH 194/223] added extra to output from filter processes --- vAMPirus.nf | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index 0f73199..f71d640 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -930,14 +930,15 @@ if (params.DataCheck || params.Analyze) { label 'norm_cpus' - publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/FilterCont", mode: "copy", overwrite: true + publishDir "${params.workingdir}/${params.outdir}/ReadProcessing/ASVFiltering", mode: "copy", overwrite: true input: file(asv) from asvforfilt output: file("*ASV.fasta") into ( reads_vsearch5_ch, asv_med, nucl2aa, asvsforAminotyping, asvfastaforcounts, asvaminocheck ) - + file("*.csv") into ( nothing ) + file("*diamondfilter.out") into ( noth) script: """ cp ${params.vampdir}/bin/rename_seq.py . @@ -1003,6 +1004,7 @@ if (params.DataCheck || params.Analyze) { done ./rename_seq.py ${asv} asvrename.list ${params.projtag}_ASV.fasta fi + paste -d',' keep.list asvrename.list > ASV_rename_map.csv """ } From a02ae106283bbfa3f5bdec56566dcab61be32393 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 22 Sep 2021 19:37:37 -0500 Subject: [PATCH 195/223] changed name of process --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index f71d640..e45dfc4 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -926,7 +926,7 @@ if (params.DataCheck || params.Analyze) { // UNTIL HERE DEFAULT if (params.filter) { - process Filtering { + process ASV_Filtering { label 'norm_cpus' From 11f91ba6b5a761cd2b424ce8b3c50ddcdcfda453 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Thu, 23 Sep 2021 09:29:34 -0500 Subject: [PATCH 196/223] fixed mscule command in aminoMED in datacheck --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index e45dfc4..cabfb98 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -1301,7 +1301,7 @@ if (params.DataCheck || params.Analyze) { """ #alignment if [[ \$(grep -c ">" ${aminos}) -gt 499 ]]; then algo="super5"; else algo="mpc"; fi - ${tools}/muscle5.0.1278_linux64 -"\${algo}" ${aminos} -out ${params.projtag}_AminoTypes_muscleAlign.fasta -threads ${task.cpus} -quiet + ${tools}/muscle5.0.1278_linux64 -\${algo} ${aminos} -out ${params.projtag}_AminoTypes_muscleAlign.fasta -threads ${task.cpus} -quiet #trimming trimal -in ${params.projtag}_AminoTypes_muscleAlign.fasta -out ${params.projtag}_AminoTypes_muscleAligned.fasta -keepheader -fasta -automated1 rm ${params.projtag}_AminoTypes_muscleAlign.fasta From 3277a65ec3fa8e88ec927760f114f23bc7938e3b Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Thu, 23 Sep 2021 22:13:29 -0500 Subject: [PATCH 197/223] fixed typo in aminotype tree --- vAMPirus.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vAMPirus.nf b/vAMPirus.nf index cabfb98..3c6b0dd 100644 --- a/vAMPirus.nf +++ b/vAMPirus.nf @@ -2902,7 +2902,7 @@ if (params.DataCheck || params.Analyze) { iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -b ${params.boots} elif [ "${params.parametric}" != "false" ];then - iqtree -s\${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni + iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni else iqtree -s \${pre}_Aligned_informativeonly.fasta --prefix \${pre}_iq -m MFP --redo -nt auto -bb ${params.boots} -bnni From c1bd3fea13229a1a91c4d89881d2a3928f901ebc Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Mon, 27 Sep 2021 14:40:17 -0500 Subject: [PATCH 198/223] updated headers fo shannon entropy figures in datacheck report --- bin/vAMPirus_DC_Report.Rmd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/vAMPirus_DC_Report.Rmd b/bin/vAMPirus_DC_Report.Rmd index 728e770..b55fa92 100644 --- a/bin/vAMPirus_DC_Report.Rmd +++ b/bin/vAMPirus_DC_Report.Rmd @@ -399,7 +399,7 @@ NOTE: The "1" represents the number of AminoTypes which are unique amino acid se
    -### ASVs MED +### ASV Shannon Entropy Analysis (https://merenlab.org/2012/05/11/oligotyping-pipeline-explained/)
    @@ -415,7 +415,7 @@ mplot ```
    -### ASVs Peaks Range Information +### ASV Shannon Entropy Peaks Breakdown
    @@ -425,7 +425,7 @@ paged_table(med_asv_csv, options = list(rows.print = 10)) ```
    -### AminoTypes MED +### AminoTypes Shannon Entropy Analysis (https://merenlab.org/2012/05/11/oligotyping-pipeline-explained/)
    @@ -441,7 +441,7 @@ mplot ```
    -### AminoTypes Peaks Range Information +### AminoTypes Shannon Entropy Peaks Breakdown
    From 7badd77b77675d19f20abdfcdedb7c5309b2ea75 Mon Sep 17 00:00:00 2001 From: Alex Veglia Date: Wed, 29 Sep 2021 16:40:23 -0500 Subject: [PATCH 199/223] added options for datacheck MED processes --- bin/vAMPirus_DC_Report.Rmd | 2 + docs/HelpDocumentation.md | 16 +- vAMPirus.nf | 632 +++++++++++++++++++------------------ vampirus.config | 10 +- 4 files changed, 346 insertions(+), 314 deletions(-) diff --git a/bin/vAMPirus_DC_Report.Rmd b/bin/vAMPirus_DC_Report.Rmd index b55fa92..0eb3ea8 100644 --- a/bin/vAMPirus_DC_Report.Rmd +++ b/bin/vAMPirus_DC_Report.Rmd @@ -8,6 +8,8 @@ params: skipReadProcessing: !r commandArgs(trailingOnly=T)[2] skipMerging: !r commandArgs(trailingOnly=T)[3] skipAdapterRemoval: !r commandArgs(trailingOnly=T)[4] + asvMED: !r commandArgs(trailingOnly=T)[5] + aminoMED: !r commandArgs(trailingOnly=T)[6] ---

    rxam@8_{*c@*Q(P8>rcV;O>>+pP?XpJqCjRz&TsjOYZ_2|P;2;W}RLVCi~3CrAU4kaJsLl{MKOgvg>TtXyX!d9IZa zZNaH*TE4`4^Jw7_PN0Q1d9zqdfgNQFD>3}I8&ato4yf(jW^XUw-rjjidlhnX`ct_% zy$K1)(bp?2j{cDC^&qWoE4BJIYW+%90;_|z{b1vEm6Z|Ywt~A`O!x`XLEa{(S_+Ml zt#^~HzpkplSbGZ(*jxApvz6>Iubj*~%N7RmWG>{nW`)IH5voLctew4u7WNj-;Y}97 z!wXU;MoOJ{UD1h=vV{X!KSx`bz1AkBkF1QSl=@-5kv#k;bz-K}iCv0LoFZFjhbqw) zZnC#8{J(LMwX< zH(`E~y|Pb+^emMjJyl4^7RJaHI`NcdwJ?9RO-f%`8Brs@2HY#?QtZl;3Fp1<3%nia%Yy;xV; zKnm7xRFK&gHYT3d=T&&TqcX+@Qn22tg3Ke_!>R;&sqlEL9c>^5Yf}|u{=lPI#roT- z1|_iE22!worGm_!@HM#aRvtv(eU2Y~`UB!Ne_)wgdh}1OrnoI5tc<80ZN`)*HT4gv zM-@_!jw^b!a*I<_A_411rbo`xTG z3D&RVL~3LO5>fBv1F$H!5!=c!dP36GhR0}mq$g-HpFmN@G+AQutC;RXLlV+3Ho8pOKT22!worh?2-kb6AV zunLdY*GFt11?wOcWDb=!;uGqz7wcGs47GH88>iSnN*jlkEBu=Ku{#=1`C1hok9DRE zq+oqr1)2ZaYsdPe3XjKnmkp#~y+#F@%j(d2o(hl0nrs6pSbtxpN+2jlkdvfbi5(-> z-{mNTL~3LK648-x98QJQ-#279a6pCwzix#CcUc7eU4x=L!tN%#{p$4IeJU04wD-4x z6xzG1AoHbtb~(3J;qh2&mMUxmq+s2ug3N!wQUI>ZKl4<0Jl1z@AO)+Tg3Q7?5*VSv znjtU(EEP(fy>&J6sW3XjM7nhm7TI$i~tYwP%-cdGDs ztXJDW3f2o$kogO1mgQ-sGDz{XY8Mg9oB<5jAlheTnE5rNJ664ov0`Fhp*)r$>dlb# z2J)!0>P?Ro6ZNLVGDN+xvff&i&f&3QqTZlbhNyS7tVh9yQ98TCidp*~u?$h~6j|^2 zJxaamg;6nxdcVaoM7{M^hS>r$OF`^*L%~$}E)ciz2VVbz`>hlSdf{abe9d4q-m0{w!gNKuet8;iO1P^oR^ND$f+~= zKCHMRoriDggtLEwBj})aKOD?8?nuBJehyQHUbPu-{>0aalY8PbCT*%c&UJWSttT`P zcVJr@2k}YJ*4215NlSbO^fBC^{jFNhIO@q*;rtz6mGmD?dZZ2h;uE?D`2~@=t+DJ& zXp^<_k$twywjxfMrtZLGY8CfuZ=VYi@tI?OTPrQ>qBm?!^@i=Tx;Jd!lh+3Cm)8bw z;W**nA}xTk?hRYIS;^-ZKcZ=-;Tv3Tq?@x_zUT4?&A<)YduquK;aj}EeA+L?+ftpr zN2%O5C}&;+xQw^9-`jgj?tP4qdmqKT_fZuYgQ|7!*}j!vku-u65KA!4KW?S`-)WFBnP1W}}$(W|Q2Q zgrWyAS4pMrES35bR_gM|c*bwzy}jIneN|eCT;78%kK7=NGw&1SVkp4o4b` zpmqT#Ab~kZ5Pco$qtA(1guDA4d4c3?KD*stA){{R$f(mlT%d;K z@(b)tR4%8@Za^-tO1X^Y1Q>i*k;^!=P_JAz$cXuGWW@Y7C1PH;s*zl>k&ctgRZtIU z9mQz_H&)8NTz#3LI5NM3aVnU~WBCT`bdX(I1(^919%A-K8tAB_S#_>u33hP;j7vxJS=6pOUrIUk zlX7~On>j%pg9O$7 z{fm0&yFj{~r%Qk2LCfu&FNzELx??9q&gVZ$`o>E7j#~6hK^3z(ipJ<;`DS2sP82*u z@WFV9!R7dj_c+glrxzV;ul!pKHe`t9^`uya@Hj_X88kpzFxfV*>ux#IT`On0l|0jx zM}GXA2feVl>#+MEZA;x_lsVQ|`Uq9bk5QDyA@g@3Tm))+3PJ9|!(Z{|fr}XBZ`QXq z{yvOl2>xESGN_FU1i_e|6c@RJj4o*^qf4H)qD%h#OyTcy?nN=DyafBsj?xpHfS$}j zf?8ODDyAPrqx`urED7=jK?c(pRs6O3Rt))V75+ATW8-geEJN`3os~gtTq_8U=PyO_ zcSr`QjFJ{)Slmts=;CHva0nNAH1kj<-;M zd`(Q&YoRvTK#GMbRzcDldO$_JHdiPw%=>v#iwCe43nO}JteUX7Ke9H9poRf*%yyAu z_EsLVqUwfEESvZdsz`sYKEB^%y;UvqpIXP}H%aonQ))p=h3~B&TYNu(DktOn71n2!?*x^D_{~-G%XpC} ze6LhNlJA=>D(di^DEZzlNA)QR-yLJs1m6itf6s)s!lU~IPGEG?>v(00zkOu!y_#&X zwI5Mme~+)jce2VsJm0^6(IDUJRgk3OPK$~8v* zz7JK1hoSgu{=8e+M*r$FA0UW; zJcfkSz^(6#s?;58kv7BXwtk0(=!w2>;3es;FHlx5Pg_XAhM;GXLeJCkhJv_&47oh7 z+)(JJ(9?(Ld3T>8pJzX9KtA)OeBO}qS*FOR<~_T7l<_iMx_?hd_wOTi|Ac9sXH_Nn ze1o+4E$E?96?|+z4&U#?4?k@&@w5Uz{FDG8n)@oPr}wcqHK*c-VL!k*GK=vOKYPyj zB;Itu&y!C4t2U5gO^Z~J*&h2y@mTLr;qkUA&jwPkp09$;(mGh1tMGWN`#+9nL&5rk z3NrC|I2*0ss_=NMuh>8e*0Czc91DvOFM-=scs$lVHjsj~vkEd-F|F8)YKd%V-{ReM zd^Rd(aCUzr)HG^vHpMc~2u=wXTN$KQL*7yR(;%Eq>A!W7lV1x?V5GQs@+*&Ipo%#d zMfu3$aUiRos)H(317bvoMMR%ihM=meLRHz@3RV5spAdG9ZpHJw`a4JKf~w{`e#;}z zql)R`9)PTNeb^9HV^pe&QH*R?R92tGG6YqxSs5g&E-F=ncgJM)x|CJaL3+)S)$zAL z)g>s(vg+3$RYe%}(J7;Ij0hpCHn9vrRTG7(f1wFS1cmf-j}7UzC?l; zxreAqKvAY@)&~vAsv1WjQL3Ipu{c?ck7Wp|Mp_xvM1o2ceHuyX)iFucc1cx@Mb+x* zpz4H_)j17P^`T1DpYPkKs*Gg_sy160MAd_6A}XsMW{j%3uXX&Dw+YH4R}fVxC>j-n zVIh?BWc+Q_8{jL(8-bg-e7#GPD{UZ9EbZ<&Do9S4pTB9FOA3^^h@FNZ}=xqkeW0a^ z547cVAqMjkREhRWCvGLS5gxB&o7q~Z{c`vn;=Nv8Hrqf7FY{E8{%(Cy!p?uV|8&=TRlf%gx+ML%jT4r(ZHus^TZjQ*0oGmqTwW5|F%%ea)t0 zBj7+u9TOKjVIPmmemPgsu|8H+^D@;3409_D@seJLms?e;;(58s22yxAPX$R{zJArl z%aaN(x1eR77cb`o=EY%1$f~2Qs%Br6m(sURHeT*Rzs8T3XSsa6IyTA%Qh2#V1xbQ_ z{g;iGn-H5R`(+oa7W$=B>exO-$3C&Dnw>bD(+X8OJpE+6(3WpJFN?T*y}W#E11Y>r zQ9+WIGwi%{;@M7&m-pn@A1`(6b7kyreZ?C42YJ@RE#iyNg51N7Ka=dwJixVSjv^c* z;uMLbNcEdw9!t8ZK!?ik1hAuhYzIkH>}a1OwWFofjx$(0Y9qIzidli8@#1-(FxGEQ zLN<^ho{=iZyqrBm)kyVM;qil^yA7mZJwpZ66Ovx@MuW6&wSg3@3sn$*!ZTh1@2c>4 zS`8aW!TO*IGS}1z7r#!0$78+J22!xLRYB%ts8>9#)vq@wfuC$31?zkjWIA~EQG4rc z6&_FPL>oxKdcO)XpR1!;UKJjXHPZ%Cu%4!Z%=|i+9ge)#paizqKnm6p6=dFn)pWdE zr>pRIT7x!_g7sb%WX}A>T6s^w(!_jBu21q%NUoZqN2Aqp8SyhGV8pAeWyFjZ6~C44 z)(LOge(81!ikZhZ5g(Ra{OMH^jIzL49?JmDSPagwGORnQA7j*-FW`r_3%Vj$*ldR% ze){P*JeA{zpES5@Cce!sp0?A|GW;;C2Qk|bKm7C*VYy#o`I=y_NkL?z`8t9SmyR(5 zq)0)WYYF1B7ZgFzD>~{I!~_&G0{}+_@x#Atf>;pC5Q6yH%BU>nRna?mtV5W%JPg7< zm2T-Gb{WbeX)0lf=z{tQ+xt8Squc3G!mfzXAr^b*$1((Arz?b6-P$BpMpQcdieNA5 zw3!$qazedPn*XlS{NK*zUpQ@pK@zEmIRjO=zXnr(^~6t<$d@ei$Pn!X?d?6NOnOu0 z1b)Aqz+X`&@ZHZ@?Onl!%;Kn?MTQOd6H})6;+}< zteIxhfKn?XDzg+QrIcB^YyqF-MN?=YLuuh$*#cd&XPJFLV`GXO8z0eVp!dW@TOVL= zy^p>1qe_o?xl!nuh)P831Cb;7`|w#yf@N$7EeRfc*~Z^?DlQ=rda$Xph~ob9D56w*jw18wD7b%mMD0K@ zPOpRYEfpS5>jWD}!FrzxGEb976!(&@^u-U4w$3n{W|Fj>ztU5ge0rDsg8=&nmSt

+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

8L4 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≥LG&@ge9(vrg+?pH&Qw(3=6lrz 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%0D;Z5gA7zJ*8EIN6Xl%ow03T+|<4F1_~ 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