Skip to content

Instantly share code, notes, and snippets.

@finswimmer
Created June 18, 2018 12:37
Show Gist options
  • Save finswimmer/7b540d695fede0fdb10120d53afab2ca to your computer and use it in GitHub Desktop.
Save finswimmer/7b540d695fede0fdb10120d53afab2ca to your computer and use it in GitHub Desktop.
import sys
from Bio import SeqIO
def mismatch(seq1, seq2):
index = []
for i, (s1, s2) in enumerate(zip(seq1, seq2)):
if s1 != s2:
index.append(i)
return index
def get_effect(seq, pos, ref, mismatches):
effect = "."
if len(mismatches) > 1:
effect = "*"
elif pos in mismatches:
if seq.translate() == ref.translate():
effect = "synonymous"
else:
effect = "non-synonymous"
return effect
sequences = SeqIO.index(sys.argv[1], "fasta")
result = []
for i in range(0, len(sequences['species1'].seq), 3):
codon_s1 = sequences['species1'].seq[i:i+3]
codon_s2 = sequences['species2'].seq[i:i+3]
codon_s3 = sequences['species3'].seq[i:i+3]
if codon_s1 != codon_s2:
mismatches_s1 = mismatch(codon_s1, codon_s3)
mismatches_s2 = mismatch(codon_s2, codon_s3)
pos = set(mismatches_s1 + mismatches_s2)
for p in pos:
effect_s1 = get_effect(codon_s1, p, codon_s3, mismatches_s1)
effect_s2 = get_effect(codon_s2, p, codon_s3, mismatches_s2)
result.append((
i+p+1,
codon_s3[p],
codon_s1[p],
effect_s1,
codon_s2[p],
effect_s2
))
print("#POS", "species3", "species1", "effect_s1", "species2", "effect_s2", sep="\t")
for row in result:
print("\t".join(map(str, row)))
@finswimmer
Copy link
Author

Second answer on biostars question: https://www.biostars.org/p/320742

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment