Use ShortStack (Axtell 2013; Shahid and Axtell 2014; Johnson et al. 2016)to perform alignment of sRNAseq data and annotation of sRNA-producing genes.
The P.meandrina genome will be used as the reference genome.
Inputs:
Requires trimmed sRNAseq files generated by 08.1-Pmea-sRNAseq-trimming-R1-only.Rmd
*fastp-adapters-polyG-31bp-merged.fq.gz
P.meandrina genome FastA. See 12-Pmea-sRNAseq-MirMachine.Rmd for download info if needed.
Outputs:
Software requirements:
Replace with name of your ShortStack environment and the path to the corresponding conda installation (find this after you’ve activated the environment).
E.g.
# Activate environment
conda activate ShortStack4_env
# Find conda path
which conda
shortstack_conda_env_name <- c("ShortStack-4.0.3_env")
shortstack_cond_path <- c("/home/sam/programs/mambaforge/condabin/conda")
This allows usage of Bash variables across R Markdown chunks.
{
echo "#### Assign Variables ####"
echo ""
echo "# Trimmed FastQ naming pattern"
echo "export trimmed_fastqs_pattern='*fastp-adapters-polyG-31bp-merged.fq.gz'"
echo "# Data directories"
echo 'export deep_dive_dir=/home/shared/8TB_HDD_01/sam/gitrepos/deep-dive'
echo 'export deep_dive_data_dir="${deep_dive_dir}/data"'
echo 'export output_dir_top=${deep_dive_dir}/F-Pmea/output/13.2-Pmea-sRNAseq-ShortStack-31bp-fastp-merged'
echo 'export trimmed_fastqs_dir="${deep_dive_dir}/F-Pmea/output/08.2-Pmea-sRNAseq-trimming-31bp-fastp-merged/trimmed-reads"'
echo ""
echo "# Input/Output files"
echo 'export genome_fasta_dir=${deep_dive_dir}/F-Pmea/data'
echo 'export genome_fasta_name="Pocillopora_meandrina_HIv1.assembly.fasta"'
echo 'export shortstack_genome_fasta_name="Pocillopora_meandrina_HIv1.assembly.fa"'
echo 'export mirbase_mature_fasta=mature.fa'
echo 'export mirbase_mature_fasta_version=mirbase-mature-v22.1.fa'
echo 'export genome_fasta="${genome_fasta_dir}/${shortstack_genome_fasta_name}"'
echo ""
echo "# External data URLs"
echo 'export mirbase_fasta_url="https://mirbase.org/download_version_files/22.1/"'
echo ""
echo "# Set number of CPUs to use"
echo 'export threads=46'
echo ""
echo "# Initialize arrays"
echo 'export trimmed_fastqs_array=()'
} > .bashvars
cat .bashvars
#### Assign Variables ####
# Trimmed FastQ naming pattern
export trimmed_fastqs_pattern='*fastp-adapters-polyG-31bp-merged.fq.gz'
# Data directories
export deep_dive_dir=/home/shared/8TB_HDD_01/sam/gitrepos/deep-dive
export deep_dive_data_dir="${deep_dive_dir}/data"
export output_dir_top=${deep_dive_dir}/F-Pmea/output/13.2-Pmea-sRNAseq-ShortStack-31bp-fastp-merged
export trimmed_fastqs_dir="${deep_dive_dir}/F-Pmea/output/08.2-Pmea-sRNAseq-trimming-31bp-fastp-merged/trimmed-reads"
# Input/Output files
export genome_fasta_dir=${deep_dive_dir}/F-Pmea/data
export genome_fasta_name="Pocillopora_meandrina_HIv1.assembly.fasta"
export shortstack_genome_fasta_name="Pocillopora_meandrina_HIv1.assembly.fa"
export mirbase_mature_fasta=mature.fa
export mirbase_mature_fasta_version=mirbase-mature-v22.1.fa
export genome_fasta="${genome_fasta_dir}/${shortstack_genome_fasta_name}"
# External data URLs
export mirbase_fasta_url="https://mirbase.org/download_version_files/22.1/"
# Set number of CPUs to use
export threads=46
# Initialize arrays
export trimmed_fastqs_array=()
If this is successful, the first line of output should show that the Python being used is the one in your [ShortStack](https://github.com/MikeAxtell/ShortStack conda environment path.
E.g.
python: /home/sam/programs/mambaforge/envs/mirmachine_env/bin/python
use_condaenv(condaenv = shortstack_conda_env_name, conda = shortstack_cond_path)
# Check successful env loading
py_config()
python: /home/sam/programs/mambaforge/envs/ShortStack-4.0.3_env/bin/python
libpython: /home/sam/programs/mambaforge/envs/ShortStack-4.0.3_env/lib/libpython3.10.so
pythonhome: /home/sam/programs/mambaforge/envs/ShortStack-4.0.3_env:/home/sam/programs/mambaforge/envs/ShortStack-4.0.3_env
version: 3.10.13 | packaged by conda-forge | (main, Dec 23 2023, 15:36:39) [GCC 12.3.0]
numpy: /home/sam/programs/mambaforge/envs/ShortStack-4.0.3_env/lib/python3.10/site-packages/numpy
numpy_version: 1.26.4
NOTE: Python version was forced by use_python() function
# Load bash variables into memory
source .bashvars
wget \
--directory-prefix ${deep_dive_data_dir} \
--recursive \
--no-check-certificate \
--continue \
--no-host-directories \
--no-directories \
--no-parent \
--quiet \
--execute robots=off \
${mirbase_fasta_url}/${mirbase_mature_fasta}
# Rename to indicate miRBase FastA version
mv ${deep_dive_data_dir}/${mirbase_mature_fasta} ${deep_dive_data_dir}/${mirbase_mature_fasta_version}
ls -lh "${deep_dive_data_dir}"
total 13M
drwxr-xr-x 2 sam sam 4.0K Nov 7 14:36 blast_dbs
-rw-r--r-- 1 sam sam 3.7M Feb 16 12:36 mirbase-mature-v22.1.fa
-rw-r--r-- 1 sam sam 3.7M Dec 4 11:05 mirbase-mature-v22.1-no_spaces.fa
-rw-r--r-- 1 sam sam 3.7M Nov 17 07:59 mirbase-mature-v22.1-no_U.fa
-rw-r--r-- 1 sam sam 726K Nov 7 14:36 mirgene-mature-all-v2.1.fa
-rw-r--r-- 1 sam sam 726K Nov 17 07:59 mirgene-mature-all-v2.1-no_U.fa
# Load bash variables into memory
source .bashvars
# Check for FastA file first
# Then create rename file if doesn't exist
if [ -f "${genome_fasta_dir}/${shortstack_genome_fasta_name}" ]; then
echo "${genome_fasta_dir}/${shortstack_genome_fasta_name} already exists. Nothing to do."
echo ""
else
# Copy genome FastA to ShortStack-compatible filename (ending with .fa)
cp ${genome_fasta_dir}/${genome_fasta_name} ${genome_fasta_dir}/${shortstack_genome_fasta_name}
fi
# Confirm
ls -lh ${genome_fasta_dir}/${shortstack_genome_fasta_name}
/home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/data/Pocillopora_meandrina_HIv1.assembly.fa already exists. Nothing to do.
-rw-r--r-- 1 sam sam 360M Feb 16 10:28 /home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/data/Pocillopora_meandrina_HIv1.assembly.fa
Uses the --dn_mirna
option to identify miRNAs in the genome, without relying on the --known_miRNAs
.
This part of the code redirects the output of time
to the end of shortstack.log
file.
; } \ 2>> ${output_dir_top}/shortstack.log
# Load bash variables into memory
source .bashvars
# Make output directory, if it doesn't exist
mkdir --parents "${output_dir_top}"
# Create array of trimmed FastQs
trimmed_fastqs_array=(${trimmed_fastqs_dir}/${trimmed_fastqs_pattern})
# Pass array contents to new variable as space-delimited list
trimmed_fastqs_list=$(echo "${trimmed_fastqs_array[*]}")
###### Run ShortStack ######
{ time \
ShortStack \
--genomefile "${genome_fasta}" \
--readfile ${trimmed_fastqs_list} \
--known_miRNAs ${deep_dive_data_dir}/${mirbase_mature_fasta_version} \
--dn_mirna \
--threads ${threads} \
--outdir ${output_dir_top}/ShortStack_out \
&> ${output_dir_top}/shortstack.log ; } \
2>> ${output_dir_top}/shortstack.log
# Load bash variables into memory
source .bashvars
tail -n 3 ${output_dir_top}/shortstack.log \
| grep "real" \
| awk '{print "ShortStack runtime:" "\t" $2}'
ShortStack runtime: 44m14.960s
# Load bash variables into memory
source .bashvars
tail -n 25 ${output_dir_top}/shortstack.log
Writing final files
Found a total of 34 MIRNA loci
Non-MIRNA loci by DicerCall:
N 7091
22 36
23 34
21 17
24 15
Creating visualizations of microRNA loci with strucVis
<<< WARNING >>>
Do not rely on these results alone to annotate new MIRNA loci!
The false positive rate for de novo MIRNA identification is low, but NOT ZERO
Insepct each mirna locus, especially the strucVis output, and see
https://doi.org/10.1105/tpc.17.00851 , https://doi.org/10.1093/nar/gky1141
Fri 16 Feb 2024 12:31:08 -0800 PST
Run Completed!
real 44m14.960s
user 814m50.436s
sys 284m22.086s
ShortStack identified 34 miRNAs.
Results.txt
# Load bash variables into memory
source .bashvars
head ${output_dir_top}/ShortStack_out/Results.txt
echo ""
echo "----------------------------------------------------------"
echo ""
echo "Nummber of potential loci:"
awk '(NR>1)' ${output_dir_top}/ShortStack_out/Results.txt | wc -l
Locus Name Chrom Start End Length Reads DistinctSequences FracTop Strand MajorRNA MajorRNAReads Short Long 21 22 23 24 DicerCall MIRNA known_miRNAs
Pocillopora_meandrina_HIv1___Sc0000000:9092-9521 Cluster_1 Pocillopora_meandrina_HIv1___Sc0000000 9092 9521 430 10833 356 0.9999076894673682 + GGGGGUAUAGCUCAGUGGUAGA 3890 1408 3758 629 4434 178 426 N N NA
Pocillopora_meandrina_HIv1___Sc0000000:53578-53997 Cluster_2 Pocillopora_meandrina_HIv1___Sc0000000 53578 53997 420 286 13 0.9965034965034965 + GCCUAAGUUGCUUGGAACA 137 284 2 0 0 0 0 N N NA
Pocillopora_meandrina_HIv1___Sc0000000:150243-150718 Cluster_3 Pocillopora_meandrina_HIv1___Sc0000000 150243 150718 476 2549 247 0.0 - UGGCUAUGAUGAAAAUGACU 335 849 380 634 376 139 171 N N NA
Pocillopora_meandrina_HIv1___Sc0000000:173728-174150 Cluster_4 Pocillopora_meandrina_HIv1___Sc0000000 173728 174150 423 1257 65 0.9968178202068417 + UUUGAUUGCUGUGAUCUGGUUG 432 106 2 39 636 444 30 22 N NA
Pocillopora_meandrina_HIv1___Sc0000000:187562-188076 Cluster_5 Pocillopora_meandrina_HIv1___Sc0000000 187562 188076 515 187 35 0.4385026737967914 . AUAAAUGUCACUACAAGAAACCUGAAAUCGU 25 0 179 1 1 2 4 N N NA
Pocillopora_meandrina_HIv1___Sc0000000:485730-486254 Cluster_6 Pocillopora_meandrina_HIv1___Sc0000000 485730 486254 525 286 127 1.0 + GAUGGGUGUUAUUACUCCUCAGACAGAC 48 66 183 7 11 3 16 N N NA
Pocillopora_meandrina_HIv1___Sc0000000:496020-496432 Cluster_7 Pocillopora_meandrina_HIv1___Sc0000000 496020 496432 413 72 24 1.0 + AUGUAGUCGAGCAAAGUCCAUGUGGACGA 27 0 66 2 1 1 2 N N NA
Pocillopora_meandrina_HIv1___Sc0000000:525310-527342 Cluster_8 Pocillopora_meandrina_HIv1___Sc0000000 525310 527342 2033 14694 2987 0.1809582142371036 - UUUUCGUCACUUUCUUCAGCCUCAGAGU 966 136 13598 50 106 303 501 N N NA
Pocillopora_meandrina_HIv1___Sc0000000:541262-541723 Cluster_9 Pocillopora_meandrina_HIv1___Sc0000000 541262 541723 462 726 137 0.081267217630854 - UUGGACGAAAUUUCGAGGUUCACACUCGUU 91 1 720 1 2 1 1 N N NA
----------------------------------------------------------
Nummber of potential loci:
7227
Column 20 of the Results.txt
file identifies if a cluster is a miRNA or not (Y
or N
).
# Load bash variables into memory
source .bashvars
echo "Number of loci characterized as miRNA:"
awk '$20=="Y" {print $0}' ${output_dir_top}/ShortStack_out/Results.txt \
| wc -l
echo ""
echo "----------------------------------------------------------"
echo ""
echo "Number of loci _not_ characterized as miRNA:"
awk '$20=="N" {print $0}' ${output_dir_top}/ShortStack_out/Results.txt \
| wc -l
Number of loci characterized as miRNA:
34
----------------------------------------------------------
Number of loci _not_ characterized as miRNA:
7193
Column 21 of the Results.txt
file identifies if a cluster aligned to a known miRNA (miRBase) or not (Y
or NA
).
Since there are no miRNAs, the following code will not print any output.
The echo
command after the awk
command is simply there to prove that the chunk executed.
# Load bash variables into memory
source .bashvars
echo "Number of loci matching miRBase miRNAs:"
awk '$21!="NA" {print $0}' ${output_dir_top}/ShortStack_out/Results.txt \
| wc -l
echo ""
echo "----------------------------------------------------------"
echo ""
echo "Number of loci _not_ matching miRBase miRNAs:"
awk '$21=="NA" {print $0}' ${output_dir_top}/ShortStack_out/Results.txt \
| wc -l
Number of loci matching miRBase miRNAs:
79
----------------------------------------------------------
Number of loci _not_ matching miRBase miRNAs:
7149
Although there are loci with matches to miRBase miRNAs, ShortStack did not annotate these clusters as miRNAs likely because they do not also match secondary structure criteria.
Many of these are large (by GitHub standards) BAM files, so will not be added to the repo.
Additionally, it’s unlikely we’ll utilize most of the other files (bigwig) generated by ShortStack.
# Load bash variables into memory
source .bashvars
tree -h ${output_dir_top}/
/home/shared/8TB_HDD_01/sam/gitrepos/deep-dive/F-Pmea/output/13.2-Pmea-sRNAseq-ShortStack-31bp-fastp-merged/
├── [ 21K] shortstack.log
└── [ 16K] ShortStack_out
├── [ 28K] alignment_details.tsv
├── [606K] Counts.txt
├── [160K] known_miRNAs.gff3
├── [1.8M] known_miRNAs_unaligned.fasta
├── [6.9M] merged_alignments_21_m.bw
├── [7.1M] merged_alignments_21_p.bw
├── [6.7M] merged_alignments_22_m.bw
├── [6.8M] merged_alignments_22_p.bw
├── [ 13M] merged_alignments_23-24_m.bw
├── [ 13M] merged_alignments_23-24_p.bw
├── [1.0G] merged_alignments.bam
├── [153K] merged_alignments.bam.csi
├── [ 45M] merged_alignments_other_m.bw
├── [ 45M] merged_alignments_other_p.bw
├── [ 23M] merged_alignments_sRNA-POC-47-S1-TP2-fastp-adapters-polyG-31bp-merged.bw
├── [ 30M] merged_alignments_sRNA-POC-48-S1-TP2-fastp-adapters-polyG-31bp-merged.bw
├── [ 24M] merged_alignments_sRNA-POC-50-S1-TP2-fastp-adapters-polyG-31bp-merged.bw
├── [ 38M] merged_alignments_sRNA-POC-53-S1-TP2-fastp-adapters-polyG-31bp-merged.bw
├── [ 49M] merged_alignments_sRNA-POC-57-S1-TP2-fastp-adapters-polyG-31bp-merged.bw
├── [ 12K] mir.fasta
├── [919K] Results.gff3
├── [1.4M] Results.txt
├── [179M] sRNA-POC-47-S1-TP2-fastp-adapters-polyG-31bp-merged.bam
├── [169K] sRNA-POC-47-S1-TP2-fastp-adapters-polyG-31bp-merged.bam.csi
├── [192M] sRNA-POC-48-S1-TP2-fastp-adapters-polyG-31bp-merged.bam
├── [170K] sRNA-POC-48-S1-TP2-fastp-adapters-polyG-31bp-merged.bam.csi
├── [174M] sRNA-POC-50-S1-TP2-fastp-adapters-polyG-31bp-merged.bam
├── [169K] sRNA-POC-50-S1-TP2-fastp-adapters-polyG-31bp-merged.bam.csi
├── [231M] sRNA-POC-53-S1-TP2-fastp-adapters-polyG-31bp-merged.bam
├── [169K] sRNA-POC-53-S1-TP2-fastp-adapters-polyG-31bp-merged.bam.csi
├── [209M] sRNA-POC-57-S1-TP2-fastp-adapters-polyG-31bp-merged.bam
├── [159K] sRNA-POC-57-S1-TP2-fastp-adapters-polyG-31bp-merged.bam.csi
└── [4.0K] strucVis
├── [ 12K] Cluster_1007.ps
├── [ 35K] Cluster_1007.txt
├── [ 11K] Cluster_1062.ps
├── [3.6K] Cluster_1062.txt
├── [ 11K] Cluster_1075.ps
├── [ 10K] Cluster_1075.txt
├── [ 11K] Cluster_1115.ps
├── [7.3K] Cluster_1115.txt
├── [ 12K] Cluster_1287.ps
├── [ 25K] Cluster_1287.txt
├── [ 13K] Cluster_1293.ps
├── [ 64K] Cluster_1293.txt
├── [ 13K] Cluster_1798.ps
├── [ 41K] Cluster_1798.txt
├── [ 12K] Cluster_1954.ps
├── [ 39K] Cluster_1954.txt
├── [ 12K] Cluster_1955.ps
├── [ 30K] Cluster_1955.txt
├── [ 12K] Cluster_20.ps
├── [ 30K] Cluster_20.txt
├── [ 12K] Cluster_2790.ps
├── [8.3K] Cluster_2790.txt
├── [ 12K] Cluster_2834.ps
├── [5.1K] Cluster_2834.txt
├── [ 11K] Cluster_2836.ps
├── [7.4K] Cluster_2836.txt
├── [ 11K] Cluster_2856.ps
├── [ 14K] Cluster_2856.txt
├── [ 11K] Cluster_2973.ps
├── [5.6K] Cluster_2973.txt
├── [ 11K] Cluster_3400.ps
├── [ 31K] Cluster_3400.txt
├── [ 11K] Cluster_34.ps
├── [3.7K] Cluster_34.txt
├── [ 12K] Cluster_359.ps
├── [ 40K] Cluster_359.txt
├── [ 11K] Cluster_3668.ps
├── [ 14K] Cluster_3668.txt
├── [ 12K] Cluster_4055.ps
├── [7.7K] Cluster_4055.txt
├── [ 12K] Cluster_4056.ps
├── [5.1K] Cluster_4056.txt
├── [ 12K] Cluster_4138.ps
├── [ 14K] Cluster_4138.txt
├── [ 12K] Cluster_4458.ps
├── [ 36K] Cluster_4458.txt
├── [ 12K] Cluster_4460.ps
├── [ 53K] Cluster_4460.txt
├── [ 12K] Cluster_4461.ps
├── [ 25K] Cluster_4461.txt
├── [ 12K] Cluster_4462.ps
├── [ 30K] Cluster_4462.txt
├── [ 12K] Cluster_4591.ps
├── [ 64K] Cluster_4591.txt
├── [ 12K] Cluster_4769.ps
├── [6.9K] Cluster_4769.txt
├── [ 12K] Cluster_4839.ps
├── [ 31K] Cluster_4839.txt
├── [ 12K] Cluster_5639.ps
├── [ 16K] Cluster_5639.txt
├── [ 12K] Cluster_5768.ps
├── [ 17K] Cluster_5768.txt
├── [ 12K] Cluster_6424.ps
├── [ 21K] Cluster_6424.txt
├── [ 12K] Cluster_753.ps
├── [ 27K] Cluster_753.txt
├── [ 12K] Cluster_914.ps
└── [ 29K] Cluster_914.txt
2 directories, 101 files