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:
@@ -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!"
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user