Created
February 16, 2020 15:42
-
-
Save fionn/c3c90fbc10657ea3b0a2b71686eb312b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 -- artem@rRNA.ca | |
# | |
# 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment