annotate tools/align_back_trans/align_back_trans.py @ 7:883842b81796 draft default tip

"Update all the pico_galaxy tools on main Tool Shed"
author peterjc
date Fri, 16 Apr 2021 22:26:52 +0000
parents b27388e5a0bb
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
1 #!/usr/bin/env python
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
2 """Back-translate a protein alignment to nucleotides.
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
3
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
4 This tool is a short Python script (using Biopython library functions) to
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
5 load a protein alignment, and matching nucleotide FASTA file of unaligned
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
6 sequences, in order to produce a codon aware nucleotide alignment - which
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
7 can be viewed as a back translation.
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
8
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
9 The development repository for this tool is here:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
10
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
11 * https://github.com/peterjc/pico_galaxy/tree/master/tools/align_back_trans
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
12
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
13 This tool is available with a Galaxy wrapper from the Galaxy Tool Shed at:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
14
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
15 * http://toolshed.g2.bx.psu.edu/view/peterjc/align_back_trans
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
16
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
17 See accompanying text file for licence details (MIT licence).
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
18 """
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
19
5
2c32e8a8990f v0.0.9 Python 3 compatible print function
peterjc
parents: 4
diff changeset
20 from __future__ import print_function
2c32e8a8990f v0.0.9 Python 3 compatible print function
peterjc
parents: 4
diff changeset
21
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
22 import sys
4
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
23
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
24 from Bio import AlignIO
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
25 from Bio import SeqIO
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
26
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
27 from Bio.Align import MultipleSeqAlignment
4
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
28 from Bio.Alphabet import generic_protein
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
29 from Bio.Data.CodonTable import ambiguous_generic_by_id
4
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
30 from Bio.Seq import Seq
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
31
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
32 if "-v" in sys.argv or "--version" in sys.argv:
5
2c32e8a8990f v0.0.9 Python 3 compatible print function
peterjc
parents: 4
diff changeset
33 print("v0.0.9")
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
34 sys.exit(0)
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
35
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
36
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
37 def check_trans(identifier, nuc, prot, table):
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
38 """Return nucleotide sequence, if works (can remove trailing stop)."""
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
39 if len(nuc) % 3:
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
40 sys.exit(
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
41 "Nucleotide sequence for %s is length %i (not a multiple of three)"
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
42 % (identifier, len(nuc))
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
43 )
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
44
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
45 p = str(prot).upper().replace("*", "X")
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
46 t = str(nuc.translate(table)).upper().replace("*", "X")
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
47 if len(t) == len(p) + 1:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
48 if str(nuc)[-3:].upper() in ambiguous_generic_by_id[table].stop_codons:
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
49 # Allow this...
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
50 t = t[:-1]
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
51 nuc = nuc[:-3] # edit return value
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
52 if len(t) != len(p):
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
53 err = (
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
54 "Inconsistent lengths for %s, ungapped protein %i, "
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
55 "tripled %i vs ungapped nucleotide %i."
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
56 % (identifier, len(p), len(p) * 3, len(nuc))
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
57 )
2
9fbf29a8c12b v0.0.6 use format_source; v0.0.5 more explicit error msg, citation info
peterjc
parents: 1
diff changeset
58 if t.endswith(p):
9fbf29a8c12b v0.0.6 use format_source; v0.0.5 more explicit error msg, citation info
peterjc
parents: 1
diff changeset
59 err += "\nThere are %i extra nucleotides at the start." % (len(t) - len(p))
9fbf29a8c12b v0.0.6 use format_source; v0.0.5 more explicit error msg, citation info
peterjc
parents: 1
diff changeset
60 elif t.startswith(p):
9fbf29a8c12b v0.0.6 use format_source; v0.0.5 more explicit error msg, citation info
peterjc
parents: 1
diff changeset
61 err += "\nThere are %i extra nucleotides at the end." % (len(t) - len(p))
9fbf29a8c12b v0.0.6 use format_source; v0.0.5 more explicit error msg, citation info
peterjc
parents: 1
diff changeset
62 elif p in t:
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
63 # TODO - Calculate and report the number to trim at start and end?
2
9fbf29a8c12b v0.0.6 use format_source; v0.0.5 more explicit error msg, citation info
peterjc
parents: 1
diff changeset
64 err += "\nHowever, protein sequence found within translated nucleotides."
9fbf29a8c12b v0.0.6 use format_source; v0.0.5 more explicit error msg, citation info
peterjc
parents: 1
diff changeset
65 elif p[1:] in t:
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
66 err += "\nHowever, ignoring first amino acid, protein sequence found "
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
67 "within translated nucleotides."
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
68 sys.exit(err)
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
69
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
70 if t == p:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
71 return nuc
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
72 elif p.startswith("M") and "M" + t[1:] == p:
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
73 # Close, was there a start codon?
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
74 if str(nuc[0:3]).upper() in ambiguous_generic_by_id[table].start_codons:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
75 return nuc
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
76 else:
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
77 sys.exit(
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
78 "Translation check failed for %s\n"
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
79 "Would match if %s was a start codon (check correct table used)\n"
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
80 % (identifier, nuc[0:3].upper())
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
81 )
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
82 else:
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
83 # Allow * vs X here? e.g. internal stop codons
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
84 m = "".join("." if x == y else "!" for (x, y) in zip(p, t))
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
85 if len(prot) < 70:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
86 sys.stderr.write("Protein: %s\n" % p)
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
87 sys.stderr.write(" %s\n" % m)
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
88 sys.stderr.write("Translation: %s\n" % t)
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
89 else:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
90 for offset in range(0, len(p), 60):
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
91 sys.stderr.write("Protein: %s\n" % p[offset : offset + 60])
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
92 sys.stderr.write(" %s\n" % m[offset : offset + 60])
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
93 sys.stderr.write("Translation: %s\n\n" % t[offset : offset + 60])
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
94 sys.exit("Translation check failed for %s\n" % identifier)
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
95
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
96
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
97 def sequence_back_translate(
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
98 aligned_protein_record, unaligned_nucleotide_record, gap, table=0
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
99 ):
6
b27388e5a0bb v0.0.10 removed unused reference to muscle format
peterjc
parents: 5
diff changeset
100 """Back-translate a sequence."""
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
101 # TODO - Separate arguments for protein gap and nucleotide gap?
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
102 if not gap or len(gap) != 1:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
103 raise ValueError("Please supply a single gap character")
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
104
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
105 alpha = unaligned_nucleotide_record.seq.alphabet
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
106 if hasattr(alpha, "gap_char"):
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
107 gap_codon = alpha.gap_char * 3
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
108 assert len(gap_codon) == 3
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
109 else:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
110 from Bio.Alphabet import Gapped
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
111
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
112 alpha = Gapped(alpha, gap)
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
113 gap_codon = gap * 3
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
114
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
115 ungapped_protein = aligned_protein_record.seq.ungap(gap)
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
116 ungapped_nucleotide = unaligned_nucleotide_record.seq
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
117 if table:
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
118 ungapped_nucleotide = check_trans(
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
119 aligned_protein_record.id, ungapped_nucleotide, ungapped_protein, table
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
120 )
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
121 elif len(ungapped_protein) * 3 != len(ungapped_nucleotide):
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
122 sys.exit(
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
123 "Inconsistent lengths for %s, ungapped protein %i, "
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
124 "tripled %i vs ungapped nucleotide %i"
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
125 % (
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
126 aligned_protein_record.id,
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
127 len(ungapped_protein),
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
128 len(ungapped_protein) * 3,
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
129 len(ungapped_nucleotide),
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
130 )
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
131 )
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
132
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
133 seq = []
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
134 nuc = str(ungapped_nucleotide)
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
135 for amino_acid in aligned_protein_record.seq:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
136 if amino_acid == gap:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
137 seq.append(gap_codon)
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
138 else:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
139 seq.append(nuc[:3])
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
140 nuc = nuc[3:]
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
141 assert not nuc, "Nucleotide sequence for %r longer than protein %r" % (
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
142 unaligned_nucleotide_record.id,
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
143 aligned_protein_record.id,
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
144 )
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
145
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
146 aligned_nuc = unaligned_nucleotide_record[:] # copy for most annotation
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
147 aligned_nuc.letter_annotation = {} # clear this
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
148 aligned_nuc.seq = Seq("".join(seq), alpha) # replace this
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
149 assert len(aligned_protein_record.seq) * 3 == len(aligned_nuc)
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
150 return aligned_nuc
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
151
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
152
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
153 def alignment_back_translate(
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
154 protein_alignment, nucleotide_records, key_function=None, gap=None, table=0
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
155 ):
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
156 """Thread nucleotide sequences onto a protein alignment."""
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
157 # TODO - Separate arguments for protein and nucleotide gap characters?
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
158 if gap is None:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
159 gap = "-"
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
160
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
161 aligned = []
4
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
162 try:
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
163 if key_function is None:
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
164 for protein in protein_alignment:
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
165 nucleotide = nucleotide_records[protein.id]
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
166 aligned.append(sequence_back_translate(protein, nucleotide, gap, table))
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
167 else:
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
168 for protein in protein_alignment:
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
169 nucleotide = nucleotide_records[key_function(protein.id)]
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
170 aligned.append(sequence_back_translate(protein, nucleotide, gap, table))
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
171 except KeyError:
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
172 raise ValueError(
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
173 "Could not find nucleotide sequence for protein %r" % protein.id
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
174 )
4
c8469274d136 v0.0.8 Using Biopython 1.67 from Tool Shed or Conda package
peterjc
parents: 3
diff changeset
175
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
176 return MultipleSeqAlignment(aligned)
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
177
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
178
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
179 if len(sys.argv) == 4:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
180 align_format, prot_align_file, nuc_fasta_file = sys.argv[1:]
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
181 nuc_align_file = sys.stdout
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
182 table = 0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
183 elif len(sys.argv) == 5:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
184 align_format, prot_align_file, nuc_fasta_file, nuc_align_file = sys.argv[1:]
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
185 table = 0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
186 elif len(sys.argv) == 6:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
187 align_format, prot_align_file, nuc_fasta_file, nuc_align_file, table = sys.argv[1:]
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
188 else:
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
189 sys.exit(
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
190 """This is a Python script for 'back-translating' a protein alignment,
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
191
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
192 It requires three, four or five arguments:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
193 - alignment format (e.g. fasta, clustal),
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
194 - aligned protein file (in specified format),
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
195 - unaligned nucleotide file (in fasta format).
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
196 - aligned nucleotiode output file (in same format), optional.
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
197 - NCBI translation table (0 for none), optional
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
198
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
199 The nucleotide alignment is printed to stdout if no output filename is given.
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
200
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
201 Example usage:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
202
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
203 $ python align_back_trans.py fasta demo_prot_align.fasta demo_nucs.fasta demo_nuc_align.fasta
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
204
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
205 Warning: If the output file already exists, it will be overwritten.
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
206
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
207 This script is available with sample data and a Galaxy wrapper here:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
208 https://github.com/peterjc/pico_galaxy/tree/master/tools/align_back_trans
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
209 http://toolshed.g2.bx.psu.edu/view/peterjc/align_back_trans
7
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
210 """ # noqa: E501
883842b81796 "Update all the pico_galaxy tools on main Tool Shed"
peterjc
parents: 6
diff changeset
211 )
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
212
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
213 try:
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
214 table = int(table)
3
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
215 except ValueError:
de803005027f v0.0.7 internal Python style fixes
peterjc
parents: 2
diff changeset
216 sys.exit("Bad table argument %r" % table)
0
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
217
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
218 prot_align = AlignIO.read(prot_align_file, align_format, alphabet=generic_protein)
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
219 nuc_dict = SeqIO.index(nuc_fasta_file, "fasta")
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
220 nuc_align = alignment_back_translate(prot_align, nuc_dict, gap="-", table=table)
0c24e4e2177d Uploaded v0.0.3, first stable release.
peterjc
parents:
diff changeset
221 AlignIO.write(nuc_align, nuc_align_file, align_format)