Add scripts for phylogenetic analysis using MrBayes and RAxML

- Created `mbblock.txt` for MrBayes configuration.
- Implemented `mrbayes.sh` to convert FASTA to Nexus and run MrBayes.
- Developed `raxml.sh` to run modeltest-ng and raxml-ng on alignments.
- Added `04.filter_ogs.sh` to filter orthologous groups based on taxon count and sequence length.
- Implemented `01.run_mrbayes.sh` to execute MrBayes for multiple FASTA files.
- Created `02.mbsum.sh` to summarize MrBayes output while skipping high DSF analyses.
- Developed `03.run_raxml.sh` to run raxml-ng on filtered alignments.
This commit is contained in:
2025-12-20 23:33:05 +08:00
parent dba4833905
commit e467d67723
16 changed files with 353 additions and 1265 deletions
+23
View File
@@ -0,0 +1,23 @@
#! /bin/bash
set -e
if [ "$#" -ne 4 ]; then
echo "Usage: $0 <out_dir> <treeshrink_dir> <min_taxon> <min_seq_length>"
echo "Filter orthologous groups after TreeShrink based on minimum taxon number and minimum sequence length"
exit 1
fi
out_dir=$(readlink -f "$1")
treeshrink_dir=$(readlink -f "$2")
min_taxon=$3
min_seq_length=$4
mkdir -p "$out_dir"
for i in "$treeshrink_dir"/*/output.fasta; do
j=$(dirname "$i")
j=$(basename "$j")
seqlen=$(seqkit fx2tab -C ATCG "$i" | awk '{print $3}' | sort -n | head -n 1)
seqnum=$(grep -c ">" "$i")
if [[ $seqnum -eq $min_taxon && $seqlen -ge $min_seq_length ]]; then
cp -l "$i" "$out_dir"/"${j}.fa"
fi
done
@@ -1,12 +0,0 @@
#! /usr/bin/env bash
total_taxon=11
min_seq_length=300
mkdir -p final_ogs
for i in treeshrink/* ; do
j=$(basename "$i")
seqlen=$(seqkit fx2tab -C ATCG "$i"/output.fasta | awk '{print $3}' | sort -n | head -n 1)
seqnum=$(grep -c ">" "$i"/output.fasta)
if [[ $seqnum -eq $total_taxon && $seqlen -ge $min_seq_length ]]; then
cp -l "$i"/output.fasta final_ogs/"${j}.fa"
fi
done
@@ -1,7 +0,0 @@
#! /usr/bin/env bash
mkdir -p modeltests
for i in ../gene_alignment/*.fa ; do
j=$(basename "$i")
echo "modeltest-ng -p 2 -r 12345 --force -i $i -d nt -t ml -o modeltests/${j/.fa/}.modeltest" >> modeltest.cmds
done
xargs -t -P 4 -I cmd -a modeltest.cmds bash -c "cmd"
@@ -0,0 +1,21 @@
#! /bin/bash
set -e
SCRIPTS=${SCRIPTS:-"$PROJECTHOME/99.scripts"}
if [ "$#" -ne 3 ]; then
echo "Usage: $0 <input_fasta_dir> <extension> <output_dir>"
echo "Run MrBayes for each fasta file in the input directory"
exit 1
fi
input_dir=$(readlink -f "$1")
ext=$2
output_dir=$(readlink -f "$3")
mkdir -p "${output_dir}"
echo -n >mrbayes.cmds
for f in "${input_dir}"/*."${ext}"; do
j=$(basename "$f" ."${ext}")
echo "bash $SCRIPTS/miscs/mrbayes.sh $f ${output_dir}/${j}/${j}.nex" >>mrbayes.cmds
done
xargs -t -P 12 -I cmd -a mrbayes.cmds bash -c "cmd"
echo "All MrBayes analyses are done!"
+31
View File
@@ -0,0 +1,31 @@
#!/bin/bash
THREADS=${THREADS:-12}
MIN_DSF=${MIN_DSF:-0.01}
if [ "$#" -ne 3 ]; then
echo "Usage: $0 <mrbayes_output_dir> <mbsum_output_dir> <num_skip>"
echo "Summarize MrBayes output using mbsum, skipping analyses with high DSF"
exit 1
fi
mb_dir=$(readlink -f "$1")
mbsum_out_dir=$2
num_skip=$3
mkdir -p "$mbsum_out_dir"
echo -n "" >mbsum.skip.log
echo -n "" >mbsum.cmds
for i in "$mb_dir"/*/mrbayes.log; do
og_dir=$(dirname "$i")
base=$(basename "$og_dir")
## skip Average standard deviation of split frequencies > 0.01
dsf=$(awk '/Average standard deviation of split frequencies:/ {out=$7} END{print out+0}' "$i" 2>/dev/null)
if awk -v d="$dsf" -v min_dsf="$MIN_DSF" 'BEGIN{if (d >= min_dsf) exit 0; exit 1}'; then
echo "Skipping ${base} due to high DSF: ${dsf}" >>mbsum.skip.log
continue
else
echo "mbsum ${og_dir}/*.t -n $num_skip -o $mbsum_out_dir/${base}.in >> $og_dir/mbsum.log 2>&1" >>mbsum.cmds
fi
done
xargs -t -P "$THREADS" -I cmd -a mbsum.cmds bash -c "cmd"
echo "Mbsum all done!"
@@ -1,9 +0,0 @@
#! /usr/bin/env bash
mkdir -p raxml_ng
echo -n > raxml_ng.cmds
for i in modeltests/*.modeltest.out ; do
j=$(basename "$i")
cmd=$(grep "raxml-ng" "$i" | tail -n 1 | sed 's/> //')
echo "$cmd --all --bs-trees 1000 --outgroup Zju --redo --threads 4 --seed 12345 --prefix raxml_ng/${j/.modeltest.out/} > /dev/null" >> raxml_ng.cmds
done
xargs -t -P 3 -I cmd -a raxml_ng.cmds bash -c "cmd"
@@ -0,0 +1,23 @@
#! /bin/bash
set -e
SCRIPTS=${SCRIPTS:-"$PROJECTHOME/99.scripts"}
THREADS=${THREADS:-4}
if [ "$#" -ne 3 ]; then
echo "Usage: $0 <in_dir> <out_dir> <ext>"
echo "Run raxml-ng on filtered orthogroup alignments"
exit 1
fi
in_dir=$(readlink -f "$1")
out_dir=$2
ext=$3
mkdir -p "$out_dir"
echo -n >raxml.cmds
for i in "$in_dir"/*."$ext"; do
j=$(basename "$i" ."$ext")
out_prefix="$out_dir/${j}/${j}"
echo "$SCRIPTS/miscs/raxml.sh $i $out_prefix 4 Zju" >>raxml.cmds
done
xargs -t -P "$THREADS" -I cmd -a raxml.cmds bash -c "cmd"
echo "Raxml-ng all completed."
@@ -1,21 +0,0 @@
#!/usr/bin/env bash
mkdir -p ../mbsum_out
echo -n "" > ../mbsum.log
for i in *.nex.tar.gz; do
base=$(basename "$i" .nex.tar.gz)
echo "Processing ${base}" >> ../mbsum.log
mkdir -p "${base}"
tar -xzf "$i" -C "${base}"
## skip Average standard deviation of split frequencies > 0.01
dsf=$(awk '/Average standard deviation of split frequencies:/ {out=$7} END{print out+0}' "${base}"/*.nex.log 2>/dev/null)
if awk -v d="$dsf" 'BEGIN{if (d >= 0.01) exit 0; exit 1}'; then
echo "Skipping ${base} due to high DSF: ${dsf}" >> ../mbsum.log
continue
else
mbsum "${base}"/*.t -n 1000 -o ../mbsum_out/"${base}".in >> ../mbsum.log 2>&1
fi
rm -rf "${base}"
echo "Completed ${base}" >> ../mbsum.log
done
echo "All done!"
@@ -1,12 +0,0 @@
begin mrbayes;
set nowarnings=yes;
set usebeagle=yes;
set autoclose=yes;
set seed=12345;
set swapseed=12345;
lset nst=6 rates=gamma;
mcmcp ngen=2000000 burninfrac=.25 samplefreq=1000 printfreq=10000 checkpoint=no
diagnfreq=10000 nruns=3 nchains=3 temp=0.40 swapfreq=10 stoprule=no;
mcmc;
sumt;
end;