View difference between Paste ID: 7mQmZm2c and
SHOW:
|
|
- or go back to the newest paste.
1 | - | |
1 | + | # -*- coding: cp1252 -*- |
2 | ||
3 | import csv | |
4 | from itertools import izip | |
5 | import time | |
6 | import shutil | |
7 | import os | |
8 | from Bio import SeqIO | |
9 | ||
10 | import wx | |
11 | import wx.grid as gridlib | |
12 | import wx.lib.printout as printout | |
13 | import wx.aui as aui | |
14 | import wx.lib.scrolledpanel as scrolled | |
15 | ||
16 | import numpy as np | |
17 | import matplotlib | |
18 | from matplotlib.figure import Figure | |
19 | from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas | |
20 | import matplotlib.patches as mpatches | |
21 | ||
22 | class DrawSchema(scrolled.ScrolledPanel): | |
23 | """ | |
24 | Draw schema with matplotlib. | |
25 | """ | |
26 | def __init__(self, parent, id = -1): | |
27 | scrolled.ScrolledPanel.__init__(self, parent, -1) | |
28 | ||
29 | vbox = wx.BoxSizer(wx.VERTICAL) | |
30 | ||
31 | # Create figure. | |
32 | self.fig = matplotlib.figure.Figure(figsize=(20, 15), facecolor='white') | |
33 | self.axes = self.fig.add_subplot(111) | |
34 | # ---------------------------------------------------------------------------- | |
35 | # Draw sequence as line. | |
36 | seq_x = 0.9 | |
37 | seq_y = 0.95 | |
38 | seq_length = -1000 | |
39 | self.axes.annotate('', xy=(seq_x, seq_y), xycoords='data', | |
40 | xytext=(seq_length, 0), textcoords='offset points', | |
41 | arrowprops=dict(facecolor='black', arrowstyle="-", linewidth=5), | |
42 | horizontalalignment='right', verticalalignment='bottom', | |
43 | ) | |
44 | # ---------------------------------------------------------------------------- | |
45 | # Draw primers. | |
46 | # x = pos of primer | |
47 | # x = 0 bp = 0.066 | |
48 | # x = 1000 bp = 0.9 | |
49 | # 1 bp = 0.000834 | |
50 | # divide primer by scaled down, because seq is scaled down | |
51 | # scaled down = seq_length/1000 | |
52 | # x = pos * 0,000834 * scaled down | |
53 | #--------------------------------------------------------- | |
54 | # primer_y = up and down in 0.05 steps | |
55 | primer_y = 0.9 | |
56 | primer_length = -70 | |
57 | #--------------------------------------------------------- | |
58 | # text_y 0.8 # 0.04 steps | |
59 | # 1 bp = 0.143 | |
60 | # 1000 bp = 0.81 | |
61 | # x = pos * 0,000667 * scaled down | |
62 | text_y = 0.8 | |
63 | #--------------------------------------------------------- | |
64 | seq_length = 2054 | |
65 | scale_factor = float(float(seq_length)/1000.0) | |
66 | ||
67 | data = ['ARM(BstX-Sbf)R\t-\tMySequence\t1782\tAGACATGGGAACTCGGGAAGGAGAGGCC\tIIIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t0:G>C,1:A>C,3:T>G\n', 'ARM(BstX-Spe)F\t+\tMySequence\t1786\tATGGGAACTCGGGAAGGAGATGAA\tIIIIIIIIIIIIIIIIIIIIIIII\t0\t23:G>A\n', 'ARM-203R\t-\tMySequence\t2050\tCTATCTCTTCTGCCCCTCAAAGG\tIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-50F\t+\tMySequence\t656\tTAATGATAATCTTCCTAATACCCGTCAG\tIIIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-IN442R\t-\tMySequence\t350\tGTAATCTTCCCTGGACCCCGG\tIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-OE-454F-SpeI\t+\tMySequence\t440\tCCATACTAGTCATGAGGCCTCATCGATCAGTC\tIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t4:C>A,7:G>A\n', 'ARM-107F\t+\tMySequence\t713\tGATGATACGAGTTCCAGGTGATAGG\tIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-163F\t+\tMySequence\t769\tTTGCTGACCGTGGGCTTTC\tIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-203R\t-\tMySequence\t787\tCTATCTCTTCTGCCCCTCAAAGG\tIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-278R\t-\tMySequence\t864\tCAGCGGCAAACATCTGACAAG\tIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-318R\t-\tMySequence\t905\tGTCGTTATCCATGGATGCCC\tIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-50F\t+\tMySequence\t656\tTAATGATAATCTTCCTAATACCCGTCAG\tIIIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-FL32F\t+\tMySequence\t31\tTGACCGACCAGCCACCAC\tIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-FL40F\t+\tMySequence\t39\tCAGCCACCACCAACCCAAAC\tIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-INT178-R\t-\tMySequence\t762\tGGAGAGGTTGCTGACCGTGGGC\tIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-INT473-R\t-\tMySequence\t1054\tGGATTGCCATTGCTAATTGTGGGGC\tIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-INT489-F\t+\tMySequence\t1094\tTGGCCTTCTTCATTCACCCGATGC\tIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-INT958-R\t-\tMySequence\t1544\tGACTGCGATTGGGCAGGCGC\tIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-OE-1898R\t-\tMySequence\t1876\tGTTATTGTTGTTGACTGGCGCT\tIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-OE1898R-ApaI\t-\tMySequence\t1876\tGTTATTGTTGTTGACTGGCGCTGGGCCCTGC\tIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t4:A>C,5:T>C,7:T>G\n', 'ARM-OE-1970R\t-\tMySequence\t1946\tCTGGTGGATTAGTTGCTGTGTTTG\tIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-OE-407F\t+\tMySequence\t406\tTGTGAACCATCCTGAAATCTGA\tIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-OE40F-SpeI\t+\tMySequence\t33\tACCGACTAGTCACCACCAACCCAAACC\tIIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t6:C>T,9:C>T\n', 'ARM-OE-454F\t+\tMySequence\t453\tGAGGCCTCATCGATCAGTCTTTAG\tIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-SPepAS\t-\tMySequence\t480\tATGCAAATGGCTCTGCTAGCAAGGCTTTCTCTTGCAAGTTCTGAAGGAAGAGAGTCTGG\tIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t1:A>G\n', 'ARM-TS-10F\t+\tMySequence\t287\tAGCCTTCAAGATTTGAGCACCACAG\tIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-TS-11F\t+\tMySequence\t313\tCAACAGCCTCCTACATCCTGTGTCG\tIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-TS-12R\t-\tMySequence\t577\tCAGAACAATCAACGAAGGAAGCATTTC\tIIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-TS-13R\t-\tMySequence\t687\tGACGAGGAGTGTGACATCAACGATG\tIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-TS-14R\t-\tMySequence\t350\tGTAATCTTCCCTGGACCCCGG\tIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-TS-4F\t+\tMySequence\t32\tGACCGACCAGCCACCACCAAC\tIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-TS-5R\t-\tMySequence\t246\tGTATCCGCCCCTTCCGCAAC\tIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-TS-6R\t-\tMySequence\t216\tTCCCCCTCACCGCAGCATC\tIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-TS-7R\t-\tMySequence\t49\tCAACCCAAACCAACGCGGC\tIIIIIIIIIIIIIIIIIII\t0\t\n', 'HO14H18_3UTR-F\t+\tMySequence\t1329\tAAGCCTCTCGTGGACTTGCT\tIIIIIIIIIIIIIIIIIIII\t0\t\n', 'HO14H18_3UTR-R\t-\tMySequence\t1604\tAGCGAAAGCGAAGGAAAATG\tIIIIIIIIIIIIIIIIIIII\t0\t\n', 'N-ARM1231F\t+\tMySequence\t1788\tGGGAACTCGGCGAGGAGATGATG\tIIIIIIIIIIIIIIIIIIIIIII\t0\t10:G>C,11:A>G,21:G>T\n', 'RNR5-598R\t-\tMySequence\t577\tCAGAACAATCAACGAAGGAAGCAT\tIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'RNR5_RNAi-F\t+\tMySequence\t1218\tCATGTCCTGGAAACAGGGAA\tIIIIIIIIIIIIIIIIIIII\t0\t\n', 'RNR5_RNAi-R\t-\tMySequence\t1801\tGGAGATGAGGACGATGGTCC\tIIIIIIIIIIIIIIIIIIII\t0\t\n', 'WRNR5-RACE4\t-\tMySequence\t466\tTCAGTCTTCAGATTATGCAAATGGCTCTGC\tIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t21:T>C\n', 'ARM-EXON1-F1\t+\tMySequence\t114\tGTGCCGTGCCGTGCCTCA\tIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-EXON1-F1\t+\tMySequence\t109\tGTGCCGTGCCGTGCCTCA\tIIIIIIIIIIIIIIIIII\t1\t15:G>T,16:T>C,17:G>A\n', 'ARM-EXON1-F1\t+\tMySequence\t104\tGTGCCGTGCCGTGCCTCA\tIIIIIIIIIIIIIIIIII\t1\t15:G>T,16:T>C,17:G>A\n', 'ARM-EXON1-R1\t-\tMySequence\t246\tGTATCCGCCCCTTCCGGCAA\tIIIIIIIIIIIIIIIIIIII\t0\t0:C>A,2:A>C,3:C>G\n', 'ARM-EXON2-F1\t+\tMySequence\t293\tCAAGATTTGAGCACCACAGGCAACAG\tIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-EXON2-R1\t-\tMySequence\t350\tGTAATCTTCCCTGGACCCCGGG\tIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'ARM-EXON2-R2\t-\tMySequence\t417\tCTGAAATCTGATGCACATGTGAACCAT\tIIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'WRNR5-R1\t-\tMySequence\t406\tTGTGAACCATCCTGAAATCTGATGC\tIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'WRNR5-F1\t+\tMySequence\t403\tGCATGTGAACCATCCTGAAATCTGA\tIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'WRNR5-R4\t-\tMySequence\t333\tTGTCGGTACTTGGTAGGGTAATCTTCC\tIIIIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'WRNR5-F4\t+\tMySequence\t216\tTTCCCCTCACCGCAGCATC\tIIIIIIIIIIIIIIIIIII\t0\t1:C>T\n', 'WRNR5-R5\t-\tMySequence\t211\tCTCGTTTCCCCTCACCGCA\tIIIIIIIIIIIIIIIIIII\t0\t12:C>T,17:C>T\n', 'WRNR5-cDNA-Seq_1670R\t-\tMySequence\t1726\tGAACACCACGCGCAAGAGAAAAG\tIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'WRNR5-cDNA-Seq_1306R\t-\tMySequence\t1363\tCACGAGGAAAGAAAGATGCGGTTA\tIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'WRNR5-cDNA-Seq_798R\t-\tMySequence\t855\tCCATCTGTTCGGCGGCAAA\tIIIIIIIIIIIIIIIIIII\t0\t8:A>G,14:T>C\n', 'WRNR5-cDNA-Seq_729R\t-\tMySequence\t786\tTCTGTCTCTTCCGCCCCTCAAA\tIIIIIIIIIIIIIIIIIIIIII\t0\t10:T>C,18:A>G\n', 'WRNR5-cDNA-Seq_530R\t-\tMySequence\t578\tGGAACAATCAACGGAGGAAGCATC\tIIIIIIIIIIIIIIIIIIIIIIII\t0\t0:T>C,10:A>G,23:A>G\n', 'WRNR5-cDNA-Seq_1714F\t+\tMySequence\t1770\tTTCCGCAGCCAAAGACAT\tIIIIIIIIIIIIIIIIII\t0\t\n', 'WRNR5-cDNA-Seq_1670F\t+\tMySequence\t1726\tGAACACCACGCGCAAGAGAAAAG\tIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'WRNR5-cDNA-Seq_1302F\t+\tMySequence\t1359\tAGCCCACGAGGAAAGAAAGATGC\tIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'WRNR5-cDNA-Seq_933F\t+\tMySequence\t990\tATAGAAGGTCAGAGATCAGCAACA\tIIIIIIIIIIIIIIIIIIIIIIII\t0\t\n', 'WRNR5-cDNA-Seq_864F\t+\tMySequence\t921\tGCCCGGGGTGATTTCTCTGC\tIIIIIIIIIIIIIIIIIIII\t0\t7:A>G\n'] | |
68 | ||
69 | for primer in data: | |
70 | primer = primer.strip() | |
71 | primer = primer.split('\t') | |
72 | primer_name = primer[0] | |
73 | primer_pos = primer[3] | |
74 | orientation = primer[1] | |
75 | if orientation == '+': | |
76 | arrow = "->" | |
77 | colour = 'red' | |
78 | elif orientation == '-': | |
79 | arrow = "<-" | |
80 | colour = 'blue' | |
81 | ||
82 | # Calculate primer and text position | |
83 | primer_x = (float(primer_pos) / scale_factor) * 0.000834 | |
84 | text_x = (float(primer_pos) / scale_factor) * 0.000667 | |
85 | ||
86 | self.axes.annotate('', xy=(primer_x+0.06, primer_y), xycoords='data', | |
87 | xytext=(primer_length, -0.1), textcoords='offset points', # -50 = length, 0= direction | |
88 | arrowprops=dict(edgecolor=colour, arrowstyle=arrow, linewidth=3), | |
89 | horizontalalignment='right', verticalalignment='bottom', | |
90 | ) | |
91 | ||
92 | self.fig.text(text_x+0.15, text_y, primer_name + ' (' + str(primer_pos) + ')', ha="center", size=14) | |
93 | ||
94 | primer_y = primer_y - 0.05 | |
95 | text_y = text_y - 0.04 | |
96 | ||
97 | # ---------------------------------------------------------------------------- | |
98 | # Description | |
99 | self.fig.text(0.186, 0.97, 'Primer Factory 2 Results', ha="center", size=14) | |
100 | self.fig.text(0.189, 0.95, str(time.ctime()), ha="center", size=14) | |
101 | self.fig.text(0.189, 0.93, 'Query Sequence ' + str(seq_length) +' bp', ha="center", size=14) | |
102 | self.fig.text(0.185, 0.91, str(len(data)) +' Primers where found', ha="center", size=14) | |
103 | # Scale | |
104 | self.fig.text(0.14, 0.87, '0 bp', ha="center", size=14) | |
105 | self.fig.text(0.805, 0.87, str(seq_length) +' bp', ha="center", size=14) | |
106 | ||
107 | self.axes.set_frame_on(False) | |
108 | self.axes.set_axis_off() | |
109 | ||
110 | self.canvas = FigureCanvas(self, -1, self.fig) | |
111 | ||
112 | vbox.Add(self.canvas, 0, wx.ALIGN_LEFT|wx.ALL, 5) | |
113 | self.SetSizer(vbox) | |
114 | self.SetAutoLayout(1) | |
115 | self.SetupScrolling() | |
116 | ||
117 | ||
118 | ||
119 | class ShowResults(wx.Frame): | |
120 | def __init__(self): | |
121 | wx.Frame.__init__(self, None, wx.ID_ANY, | |
122 | "Primer Factory Results", | |
123 | size=(1350,1000)) | |
124 | ||
125 | self._mgr = aui.AuiManager() | |
126 | ||
127 | self._mgr.SetManagedWindow(self) | |
128 | ||
129 | self.notebook = aui.AuiNotebook(self, wx.aui.AUI_NB_SCROLL_BUTTONS) | |
130 | panelTwo = DrawSchema(self.notebook) | |
131 | ||
132 | self.notebook.AddPage(panelTwo, "Schema", False) | |
133 | ||
134 | self._mgr.AddPane(self.notebook, | |
135 | aui.AuiPaneInfo().Name("notebook_content"). | |
136 | CenterPane().PaneBorder(False)) | |
137 | self._mgr.Update() | |
138 | ||
139 | ||
140 | if __name__ == '__main__': | |
141 | app = wx.PySimpleApp() | |
142 | frame = ShowResults() | |
143 | frame.Show(True) | |
144 | app.MainLoop() |