layout | title | tags |
---|---|---|
drawHelix.sh |
<img src="{{ "/assets/hs/drawHelix.sh.gif" | relative_url }}" />
#!/bin/bash
#
# drawHelix.sh <input.fa>
#
# Reads a fasta input file and stream a B-Form DNA
# helix with the sequence to STDOUT
#
## __ __ __ ___
### |__) | / \ /__` \ / |\ | | /\ \_/
#### |__) | \__/ .__/ | | \| | /~~\ / \
#####=======================================
## biosyntax.org v0.1
#
# ABabaian -- [email protected]
#
# Props to @darokin for the gif-spiration
#
# TODO
# - Add B- and Z-form DNA helices [-dna B|Z]
# INITIALIZE ----------------------------------------------
# Input Fasta
FASTA=$1
LINENUMBER=$(wc -l $FASTA | cut -f1 -d ' ' -)
DELAY='0.1s' # Delay between bases
# DNA Helix Type
IDX=1 # Initialize print index
# Terminal Color Palette
if [[ $(tput colors) == '256' ]]; then
# Color Definitions (ANSI_256 Supported)
colA="$(tput setaf 10)"
colT="$(tput setaf 33)"
colG="$(tput setaf 214)"
colC="$(tput setaf 9)"
colN1="$(tput setaf 87)"
colN2="$(tput setaf 205)"
colHelix=$(tput setaf 250)
#colBond1=$colHelix
colBond2="$(tput setaf 0)"
colBg="$(tput setaf 17)"
else # use System colors
# Color Definitions (System Colors)
colA="$(tput setaf 2)"
colT="$(tput setaf 4)"
colG="$(tput setaf 3)"
colC="$(tput setaf 1)"
colN1="$(tput setaf 6)"
colN2="$(tput setaf 5)"
colHelix="$(tput setaf 7)"
#colBond1=$colHelix
colBond2="$(tput setaf 0)"
colBg="$(tput setaf 0)"
fi
# DRAW DNA ------------------------------------------------
for N in $(seq 3 $LINENUMBER) # iterate each line of FA
do
SEQ=$(sed -n "$N"p $FASTA) # extract Nth line
if [[ $SEQ =~ '^N+$' ]]; then # if all N line; skip
sleep 0 # do nothing
else
# Draw Helix - weird linebreak is for mac portability
for BASE in $(echo $SEQ | sed -e 's/\(.\)/\1\
/g')
do
# Declare Watson and Crick bases
#echo $BASE
if [[ $BASE =~ [Aa] ]]; then # A
W="$colA"A"$colHelix"
C="$colT"T"$colHelix"
bond='-' # weak
elif [[ $BASE =~ [TtUu] ]]; then # T or U
W="$colT"T"$colHelix"
C="$colA"A"$colHelix"
bond='-' # weak
elif [[ $BASE =~ [Gg] ]]; then # G
W="$colG"G"$colHelix"
C="$colC"C"$colHelix"
bond='=' # strong
elif [[ $BASE =~ [Cc] ]]; then # C
W="$colC"C"$colHelix"
C="$colG"G"$colHelix"
bond='=' # strong
else # Non-standard base
W="$colN1"O"$colHelix"
C="$colN2"X"$colHelix"
bond='-' # unknown
fi
BP_1="$colBg.... $colHelix\$$W---$C\$$colBg ....."
BP_2="$colBg.... $colHelix\$$W----$C\$$colBg ...."
BP_3="$colBg..... $colHelix\$$W----$C\$$colBg ..."
BP_4="$colBg...... $colHelix\$$W---$C\$$colBg ..."
BP_5="$colBg....... $colHelix\$$W-$C\$$colBg ...."
BP_6="$colBg........ $C\$$colBg ......"
BP_7="$colBg...... $colHelix\$$C$colBond2---$W\$$colBg ..."
BP_8="$colBg..... $colHelix\$$C$colBond2----$W\$$colBg ..."
BP_9="$colBg.... $colHelix\$$C$colBond2----$W\$$colBg ...."
BP_10="$colBg.... $colHelix\$$C$colBond2---$W\$$colBg ....."
BP_11="$colBg...... $colHelix\$$W$colBg ........"
BP_12="$colBg..... $colHelix\$$W-$C\$$colBg ......"
OUTPUT="BP_$IDX"
eval echo -e '$'$OUTPUT
# Move through index
if [ $IDX -eq 12 ]; then
IDX=1
else
IDX=$((IDX + 1))
fi
sleep $DELAY # Delay timer between base-pairs
done # BASE
fi #N
done #SEQ