forked from TrinhLab/CASPERapp
-
Notifications
You must be signed in to change notification settings - Fork 1
/
genomeBrowser.py
198 lines (165 loc) · 6.21 KB
/
genomeBrowser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import sys, os
import GlobalSettings
from PyQt5 import QtWidgets, uic, QtGui, QtCore, Qt
import PyQt5.QtWebEngineWidgets
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QDir, QUrl
from Bio import Entrez, SeqIO
import PyQt5.QtNetwork as QtNetwork
import platform
import glob
import ssl
import traceback
import webbrowser
#global logger
logger = GlobalSettings.logger
ssl._create_default_https_context = ssl._create_unverified_context
class WebEnginePage(PyQt5.QtWebEngineWidgets.QWebEnginePage):
def certificateError(self, certificateError):
print("ssl error")
class genomebrowser(QtWidgets.QWidget):
def __init__(self, parent=None):
try:
default_config = QtNetwork.QSslConfiguration.defaultConfiguration()
default_config.setProtocol(QtNetwork.QSsl.TlsV1_2)
QtNetwork.QSslConfiguration.setDefaultConfiguration(default_config)
except Exception as e:
logger.critical("Error initializing genomebrowser class.")
logger.critical(e)
logger.critical(traceback.format_exc())
msgBox = QtWidgets.QMessageBox()
msgBox.setStyleSheet("font: " + str(self.fontSize) + "pt 'Arial'")
msgBox.setIcon(QtWidgets.QMessageBox.Icon.Critical)
msgBox.setWindowTitle("Fatal Error")
msgBox.setText("Fatal Error:\n"+str(e)+ "\n\nFor more information on this error, look at CASPER.log in the application folder.")
msgBox.addButton(QtWidgets.QMessageBox.StandardButton.Close)
msgBox.exec()
exit(-1)
def splitStringNCBI(self, longString):
try:
return (longString).split(':')[2]
except:
pass
def splitStringLocal(self, longString):
try:
return (longString.split('/').pop()).split('.')[0]
except:
pass
def ncbiAPI(self, filename):
try:
if platform.system() == 'Windows':
filename = str(filename).replace("/","\\")
genomeList = []
for gb_record in SeqIO.parse(open(filename, "r"), "genbank"):
genomeList.append(gb_record.id)
return genomeList
except Exception as e:
logger.critical("Error in ncbiAPI() in genomebrowser.")
logger.critical(e)
logger.critical(traceback.format_exc())
msgBox = QtWidgets.QMessageBox()
msgBox.setStyleSheet("font: " + str(self.fontSize) + "pt 'Arial'")
msgBox.setIcon(QtWidgets.QMessageBox.Icon.Critical)
msgBox.setWindowTitle("Fatal Error")
msgBox.setText("Fatal Error:\n"+str(e)+ "\n\nFor more information on this error, look at CASPER.log in the application folder.")
msgBox.addButton(QtWidgets.QMessageBox.StandardButton.Close)
msgBox.exec()
exit(-1)
def createHtml(self, genomeList):
try:
htmlString1 = """
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<ihtml>
<head>
<title>NCBI Sequence Viewer - programmatic initialization</title>
<script type="text/javascript" src="https://www.ncbi.nlm.nih.gov/projects/sviewer/js/sviewer.js"></script>
<script>
function loadSV(id) {
var svapp = SeqView.App.findAppByDivId("mySeqViewer1");
if (!svapp)
svapp = new SeqView.App("mySeqViewer1");
params = 'appname=UniversityofTennesseeCasper&id=' + id;
svapp.reload(params);
}
</script>
</head>
<body>
Select a chromosome from the list:<br/>
<select onchange="loadSV(event.target.value);">
<option value="">-</option>
"""
htmlString2 = """
<option value="{}">Chromosome {}</option>
"""
htmlString3 = """
</select>
<br/>
<div id="mySeqViewer1" class="SeqViewerApp" data-autoload>
<a href="?embedded=true&appname=testapp1&id={}"></a>
</div>
</body>
</html>
""".format(genomeList[0])
# Find file path for template
# seek to beginning and truncate
genomeBrowserTemplateFilePath = GlobalSettings.appdir + "genomeBrowserTemplate.html"
raw = open(genomeBrowserTemplateFilePath, "r+")
raw.seek(0)
raw.truncate()
#write the 3 part string format
raw.write(htmlString1)
for index,genome in enumerate(genomeList):
raw.write(htmlString2.format(genome,index+1))
raw.write(htmlString3)
except Exception as e:
logger.critical("Error in createHtml() in genomebrowser.")
logger.critical(e)
logger.critical(traceback.format_exc())
msgBox = QtWidgets.QMessageBox()
msgBox.setStyleSheet("font: " + str(self.fontSize) + "pt 'Arial'")
msgBox.setWindowTitle("Fatal Error")
msgBox.setText("Fatal Error:\n"+str(e)+ "\n\nFor more information on this error, look at CASPER.log in the application folder.")
msgBox.addButton(QtWidgets.QMessageBox.StandardButton.Close)
msgBox.exec()
exit(-1)
def createGraph(self, p):
try:
selectedGenome = p.annotation_files.currentText()
print(selectedGenome)
gciVariable = self.splitStringLocal(selectedGenome)
print(gciVariable)
if(gciVariable == None):
return
fileToSearch = GlobalSettings.mainWindow.annotation_files.currentText()
for file in glob.glob(GlobalSettings.CSPR_DB + "/**/*.gb*", recursive=True):
if file.find(fileToSearch) != -1:
fileToSearch = file
break
if(str(fileToSearch).find(".gb") == -1):
QtWidgets.QMessageBox.information(p, "Genomebrowser Error", "Filetype must be GenBank format.", QtWidgets.QMessageBox.Ok)
return
try:
genomeList = self.ncbiAPI(fileToSearch)
except:
QtWidgets.QMessageBox.question(p, "GenBank_FileNotFound", "GenBank file is not in selected directory", QtWidgets.QMessageBox.Ok)
return
self.createHtml(genomeList)
self.browser = QWebEngineView()
file_path = GlobalSettings.appdir + "genomeBrowserTemplate.html"
if platform.system() == "Darwin":
file_path = "file:///"+file_path
### Add logic for Linux ?
webbrowser.open(file_path, new=2)
except Exception as e:
logger.critical("Error in createGraph() in genomebrowser.")
logger.critical(e)
logger.critical(traceback.format_exc())
msgBox = QtWidgets.QMessageBox()
msgBox.setStyleSheet("font: " + str(self.fontSize) + "pt 'Arial'")
msgBox.setIcon(QtWidgets.QMessageBox.Icon.Critical)
msgBox.setWindowTitle("Fatal Error")
msgBox.setText("Fatal Error:\n"+str(e)+ "\n\nFor more information on this error, look at CASPER.log in the application folder.")
msgBox.addButton(QtWidgets.QMessageBox.StandardButton.Close)
msgBox.exec()
exit(-1)