SRA Data Download and Comparative Genome Analysis
Overview
In this exercise, we will download raw sequencing data from two published genome papers and analyse them using the training workflow.
The two papers are:
Draft genome sequence of Leptospira yasudae strain Ss3a1f from Estero De Paco, Manila, Philippines
DOI: https://journals.asm.org/doi/10.1128/mra.00547-26Draft genome sequence of multidrug-resistant Staphylococcus aureus strain MB02 isolated from the cesarean wound of a 32-year-old pregnant woman in Ogbomoso, Nigeria
DOI: https://journals.asm.org/doi/10.1128/mra.01357-25
We will download the raw SRA data, perform read QC, trimming, genome assembly, assembly QC, taxonomy, MLST, annotation, AMR screening, and virulence factor screening.
Learning objectives
By the end of this exercise, you should be able to:
- download raw sequencing reads from SRA
- convert SRA files to FASTQ format
- count raw and trimmed reads
- perform read quality control
- trim raw reads
- assemble genomes
- assess assembly quality
- filter short contigs
- estimate completeness and contamination
- classify taxonomy
- perform MLST
- annotate genomes
- screen for AMR genes and virulence factors
- complete a comparative genome analysis results table
Input data
| Paper | Organism | SRA accession | Suggested sample name |
|---|---|---|---|
| Paper 1 | Leptospira yasudae strain Ss3a1f | SRR38327166 |
L_yasudae |
| Paper 2 | Staphylococcus aureus strain MB02 | SRR32454207 |
S_aureus |
Use the suggested sample names throughout this exercise:
L_yasudae
S_aureus
This will make the output files easier to compare.
Workflow by organism
Input information
| Item | Information |
|---|---|
| Organism | Leptospira yasudae strain Ss3a1f |
| Paper | https://journals.asm.org/doi/10.1128/mra.00547-26 |
| SRA accession | SRR38327166 |
| Sample name used here | L_yasudae |
Step 1: Download SRA data
mkdir -p sra_comparative_analysis
cd sra_comparative_analysis
mkdir -p raw_sequence raw_reads qc_reports trimmed_reads assemblies quast checkm2 classify annotation abricate results
conda activate sra-tools
cd raw_sequence
prefetch SRR38327166
fasterq-dump SRR38327166/SRR38327166.sra
gzip *.fastq
cd ..Step 2: Rename FASTQ files
cp raw_sequence/SRR38327166_1.fastq.gz raw_reads/L_yasudae_R1.fastq.gz
cp raw_sequence/SRR38327166_2.fastq.gz raw_reads/L_yasudae_R2.fastq.gzCheck files:
ls raw_readsStep 3: Count total raw reads
echo "L_yasudae raw R1 reads:"
echo $(( $(zcat raw_reads/L_yasudae_R1.fastq.gz | wc -l) / 4 ))
echo "L_yasudae raw R2 reads:"
echo $(( $(zcat raw_reads/L_yasudae_R2.fastq.gz | wc -l) / 4 ))
echo "L_yasudae total raw reads:"
echo $(( $(zcat raw_reads/L_yasudae_R1.fastq.gz | wc -l) / 4 + $(zcat raw_reads/L_yasudae_R2.fastq.gz | wc -l) / 4 ))Record this value in the results table.
Step 4: FastQC on raw reads
conda activate qc
fastqc \
-t 4 \
-o qc_reports \
raw_reads/L_yasudae_R1.fastq.gz \
raw_reads/L_yasudae_R2.fastq.gzStep 5: Trim reads
trimmomatic PE \
-threads 4 \
raw_reads/L_yasudae_R1.fastq.gz \
raw_reads/L_yasudae_R2.fastq.gz \
trimmed_reads/L_yasudae_trim_R1.fastq.gz \
trimmed_reads/L_yasudae_unpaired_R1.fastq.gz \
trimmed_reads/L_yasudae_trim_R2.fastq.gz \
trimmed_reads/L_yasudae_unpaired_R2.fastq.gz \
SLIDINGWINDOW:4:20 \
LEADING:3 \
TRAILING:3 \
HEADCROP:15 \
MINLEN:40Step 6: Count total reads after trimming
echo "L_yasudae trimmed R1 reads:"
echo $(( $(zcat trimmed_reads/L_yasudae_trim_R1.fastq.gz | wc -l) / 4 ))
echo "L_yasudae trimmed R2 reads:"
echo $(( $(zcat trimmed_reads/L_yasudae_trim_R2.fastq.gz | wc -l) / 4 ))
echo "L_yasudae total trimmed reads:"
echo $(( $(zcat trimmed_reads/L_yasudae_trim_R1.fastq.gz | wc -l) / 4 + $(zcat trimmed_reads/L_yasudae_trim_R2.fastq.gz | wc -l) / 4 ))Step 7: FastQC on trimmed reads
fastqc \
-t 4 \
-o qc_reports \
trimmed_reads/L_yasudae_trim_R1.fastq.gz \
trimmed_reads/L_yasudae_trim_R2.fastq.gz
conda deactivateStep 8: Genome assembly
conda activate assembly
spades.py \
-t 4 \
-o assemblies/L_yasudae_assembly \
-1 trimmed_reads/L_yasudae_trim_R1.fastq.gz \
-2 trimmed_reads/L_yasudae_trim_R2.fastq.gz
cp assemblies/L_yasudae_assembly/contigs.fasta assemblies/L_yasudae_contigs.fastaStep 9: Count contigs before filtering
grep -c "^>" assemblies/L_yasudae_contigs.fastaRecord this as:
Number of contigs >=0 bp
Step 10: QUAST on original assembly
quast \
-t 4 \
-o quast/L_yasudae_original \
assemblies/L_yasudae_contigs.fasta
cat quast/L_yasudae_original/report.txtStep 11: CheckM2 on original assembly
checkm2 predict \
-t 4 \
-x .fasta \
-i assemblies/L_yasudae_contigs.fasta \
-o checkm2/L_yasudae_original
cat checkm2/L_yasudae_original/quality_report.tsvStep 12: Filter contigs smaller than 500 bp
seqkit seq \
-m 500 \
assemblies/L_yasudae_contigs.fasta \
> assemblies/L_yasudae_contigs_filtered.fastaCount filtered contigs:
grep -c "^>" assemblies/L_yasudae_contigs_filtered.fastaStep 13: QUAST on filtered assembly
quast \
-t 4 \
-o quast/L_yasudae_filtered \
assemblies/L_yasudae_contigs_filtered.fasta
cat quast/L_yasudae_filtered/report.txtRecord:
- N50
- L50
Step 14: CheckM2 on filtered assembly
checkm2 predict \
-t 4 \
-x .fasta \
-i assemblies/L_yasudae_contigs_filtered.fasta \
-o checkm2/L_yasudae_filtered
cat checkm2/L_yasudae_filtered/quality_report.tsv
conda deactivateRecord:
- completeness
- contamination
Step 15: Taxonomic classification
conda activate classify
kraken2 \
--db ~/databases/minikrakendb \
--threads 4 \
--report classify/L_yasudae.kraken2.report \
--output classify/L_yasudae.kraken2.output \
assemblies/L_yasudae_contigs_filtered.fasta
head classify/L_yasudae.kraken2.report
conda deactivateRecord the main taxonomy result.
Step 16: MLST
conda activate mlst
mlst assemblies/L_yasudae_contigs_filtered.fasta > classify/L_yasudae_mlst.txt
cat classify/L_yasudae_mlst.txt
conda deactivateIf no MLST scheme is detected, write:
No MLST scheme detected
Step 17: Genome annotation
conda activate annotation
prokka \
--outdir annotation/L_yasudae \
--force \
--cpus 4 \
--prefix L_yasudae \
--locustag LYAS \
assemblies/L_yasudae_contigs_filtered.fasta
cat annotation/L_yasudae/L_yasudae.txt
conda deactivateRecord:
- number of CDS
- number of tRNA
Step 18: AMR gene screening
conda activate amr
abricate \
--db ncbi \
--threads 4 \
assemblies/L_yasudae_contigs_filtered.fasta \
> abricate/L_yasudae_amr.tsv
abricate --summary abricate/L_yasudae_amr.tsv > abricate/L_yasudae_amr_summary.tsv
cat abricate/L_yasudae_amr_summary.tsvRecord the AMR genes.
Step 19: Virulence factor screening
abricate \
--db vfdb \
--threads 4 \
assemblies/L_yasudae_contigs_filtered.fasta \
> abricate/L_yasudae_vf.tsv
abricate --summary abricate/L_yasudae_vf.tsv > abricate/L_yasudae_vf_summary.tsv
cat abricate/L_yasudae_vf_summary.tsv
conda deactivateRecord the virulence factors.
Input information
| Item | Information |
|---|---|
| Organism | Staphylococcus aureus strain MB02 |
| Paper | https://journals.asm.org/doi/10.1128/mra.01357-25 |
| SRA accession | SRR32454207 |
| Sample name used here | S_aureus |
Step 1: Download SRA data
mkdir -p sra_comparative_analysis
cd sra_comparative_analysis
mkdir -p raw_sequence raw_reads qc_reports trimmed_reads assemblies quast checkm2 classify annotation abricate results
conda activate sra-tools
cd raw_sequence
prefetch SRR32454207
fasterq-dump SRR32454207/SRR32454207.sra
gzip *.fastq
cd ..Step 2: Rename FASTQ files
cp raw_sequence/SRR32454207_1.fastq.gz raw_reads/S_aureus_R1.fastq.gz
cp raw_sequence/SRR32454207_2.fastq.gz raw_reads/S_aureus_R2.fastq.gzCheck files:
ls raw_readsStep 3: Count total raw reads
echo "S_aureus raw R1 reads:"
echo $(( $(zcat raw_reads/S_aureus_R1.fastq.gz | wc -l) / 4 ))
echo "S_aureus raw R2 reads:"
echo $(( $(zcat raw_reads/S_aureus_R2.fastq.gz | wc -l) / 4 ))
echo "S_aureus total raw reads:"
echo $(( $(zcat raw_reads/S_aureus_R1.fastq.gz | wc -l) / 4 + $(zcat raw_reads/S_aureus_R2.fastq.gz | wc -l) / 4 ))Step 4: FastQC on raw reads
conda activate qc
fastqc \
-t 4 \
-o qc_reports \
raw_reads/S_aureus_R1.fastq.gz \
raw_reads/S_aureus_R2.fastq.gzStep 5: Trim reads
trimmomatic PE \
-threads 4 \
raw_reads/S_aureus_R1.fastq.gz \
raw_reads/S_aureus_R2.fastq.gz \
trimmed_reads/S_aureus_trim_R1.fastq.gz \
trimmed_reads/S_aureus_unpaired_R1.fastq.gz \
trimmed_reads/S_aureus_trim_R2.fastq.gz \
trimmed_reads/S_aureus_unpaired_R2.fastq.gz \
SLIDINGWINDOW:4:20 \
LEADING:3 \
TRAILING:3 \
HEADCROP:15 \
MINLEN:40Step 6: Count total reads after trimming
echo "S_aureus trimmed R1 reads:"
echo $(( $(zcat trimmed_reads/S_aureus_trim_R1.fastq.gz | wc -l) / 4 ))
echo "S_aureus trimmed R2 reads:"
echo $(( $(zcat trimmed_reads/S_aureus_trim_R2.fastq.gz | wc -l) / 4 ))
echo "S_aureus total trimmed reads:"
echo $(( $(zcat trimmed_reads/S_aureus_trim_R1.fastq.gz | wc -l) / 4 + $(zcat trimmed_reads/S_aureus_trim_R2.fastq.gz | wc -l) / 4 ))Step 7: FastQC on trimmed reads
fastqc \
-t 4 \
-o qc_reports \
trimmed_reads/S_aureus_trim_R1.fastq.gz \
trimmed_reads/S_aureus_trim_R2.fastq.gz
conda deactivateStep 8: Genome assembly
conda activate assembly
spades.py \
-t 4 \
-o assemblies/S_aureus_assembly \
-1 trimmed_reads/S_aureus_trim_R1.fastq.gz \
-2 trimmed_reads/S_aureus_trim_R2.fastq.gz
cp assemblies/S_aureus_assembly/contigs.fasta assemblies/S_aureus_contigs.fastaStep 9: Count contigs before filtering
grep -c "^>" assemblies/S_aureus_contigs.fastaStep 10: QUAST on original assembly
quast \
-t 4 \
-o quast/S_aureus_original \
assemblies/S_aureus_contigs.fasta
cat quast/S_aureus_original/report.txtStep 11: CheckM2 on original assembly
checkm2 predict \
-t 4 \
-x .fasta \
-i assemblies/S_aureus_contigs.fasta \
-o checkm2/S_aureus_original
cat checkm2/S_aureus_original/quality_report.tsvStep 12: Filter contigs smaller than 500 bp
seqkit seq \
-m 500 \
assemblies/S_aureus_contigs.fasta \
> assemblies/S_aureus_contigs_filtered.fastaCount filtered contigs:
grep -c "^>" assemblies/S_aureus_contigs_filtered.fastaStep 13: QUAST on filtered assembly
quast \
-t 4 \
-o quast/S_aureus_filtered \
assemblies/S_aureus_contigs_filtered.fasta
cat quast/S_aureus_filtered/report.txtRecord:
- N50
- L50
Step 14: CheckM2 on filtered assembly
checkm2 predict \
-t 4 \
-x .fasta \
-i assemblies/S_aureus_contigs_filtered.fasta \
-o checkm2/S_aureus_filtered
cat checkm2/S_aureus_filtered/quality_report.tsv
conda deactivateRecord:
- completeness
- contamination
Step 15: Taxonomic classification
conda activate classify
kraken2 \
--db ~/databases/minikrakendb \
--threads 4 \
--report classify/S_aureus.kraken2.report \
--output classify/S_aureus.kraken2.output \
assemblies/S_aureus_contigs_filtered.fasta
head classify/S_aureus.kraken2.report
conda deactivateRecord the main taxonomy result.
Step 16: MLST
conda activate mlst
mlst assemblies/S_aureus_contigs_filtered.fasta > classify/S_aureus_mlst.txt
cat classify/S_aureus_mlst.txt
conda deactivateIf no MLST scheme is detected, write:
No MLST scheme detected
Step 17: Genome annotation
conda activate annotation
prokka \
--outdir annotation/S_aureus \
--force \
--cpus 4 \
--prefix S_aureus \
--locustag SAUR \
assemblies/S_aureus_contigs_filtered.fasta
cat annotation/S_aureus/S_aureus.txt
conda deactivateRecord:
- number of CDS
- number of tRNA
Step 18: AMR gene screening
conda activate amr
abricate \
--db ncbi \
--threads 4 \
assemblies/S_aureus_contigs_filtered.fasta \
> abricate/S_aureus_amr.tsv
abricate --summary abricate/S_aureus_amr.tsv > abricate/S_aureus_amr_summary.tsv
cat abricate/S_aureus_amr_summary.tsvRecord the AMR genes.
Step 19: Virulence factor screening
abricate \
--db vfdb \
--threads 4 \
assemblies/S_aureus_contigs_filtered.fasta \
> abricate/S_aureus_vf.tsv
abricate --summary abricate/S_aureus_vf.tsv > abricate/S_aureus_vf_summary.tsv
cat abricate/S_aureus_vf_summary.tsv
conda deactivateRecord the virulence factors.
Final comparison table
Complete the table below using your analysis outputs.
| Result | Leptospira yasudae SRR38327166 |
Staphylococcus aureus SRR32454207 |
|---|---|---|
| Number of total raw reads | ||
| Number of total reads after trimming | ||
| Number of contigs, >=0 bp | ||
| Number of contigs after filtering, >=500 bp | ||
| N50 | ||
| L50 | ||
| Completeness | ||
| Contamination | ||
| Taxonomy | ||
| MLST | ||
| Number of CDS | ||
| Number of tRNA | ||
| AMR genes | ||
| Virulence factors |
Where to find each result
| Result | Command or file |
|---|---|
| Number of total raw reads | Count reads from raw_reads/*fastq.gz |
| Number of total reads after trimming | Count reads from trimmed_reads/*fastq.gz |
| Number of contigs, >=0 bp | grep -c "^>" assemblies/*_contigs.fasta |
| Number of contigs after filtering | grep -c "^>" assemblies/*_contigs_filtered.fasta |
| N50 | quast/*_filtered/report.txt |
| L50 | quast/*_filtered/report.txt |
| Completeness | checkm2/*_filtered/quality_report.tsv |
| Contamination | checkm2/*_filtered/quality_report.tsv |
| Taxonomy | classify/*.kraken2.report |
| MLST | classify/*_mlst.txt |
| Number of CDS | annotation/*/*.txt |
| Number of tRNA | annotation/*/*.txt |
| AMR genes | abricate/*_amr_summary.tsv |
| Virulence factors | abricate/*_vf_summary.tsv |
Files generated
At the end of this exercise, you should have:
raw_reads/
trimmed_reads/
qc_reports/
assemblies/
quast/
checkm2/
classify/
annotation/
abricate/
Important output files:
assemblies/L_yasudae_contigs_filtered.fasta
assemblies/S_aureus_contigs_filtered.fasta
quast/filtered/report.txt
checkm2/filtered/quality_report.tsv
classify/L_yasudae.kraken2.report
classify/S_aureus.kraken2.report
classify/L_yasudae_mlst.txt
classify/S_aureus_mlst.txt
annotation/L_yasudae/L_yasudae.txt
annotation/S_aureus/S_aureus.txt
abricate/amr_summary.tsv
abricate/vf_summary.tsv
Discussion questions
Which genome produced more contigs after assembly?
Which genome had the higher N50?
Which genome had higher completeness?
Did both organisms have an MLST result?
Which organism had more AMR genes?
Which organism had more virulence factors?
Key points
- SRA data can be downloaded using
prefetch. - SRA files can be converted to FASTQ using
fasterq-dump. - Raw and trimmed reads can be counted from FASTQ files.
- Assembly quality should be checked before and after filtering.
- Taxonomy, MLST, annotation, AMR, and virulence screening help interpret genome content.
- The final table should be completed using your own analysis results.