__main__.py 17.8 KB
Newer Older
Yan's avatar
Yan committed
1
2
3
4
#!/usr/bin/env python3

from PyQt5 import QtCore
from PyQt5 import QtWidgets
Yan's avatar
Yan committed
5
from PyQt5 import QtGui
6
from PyQt5 import QtPrintSupport
Yan's avatar
Yan committed
7
from rawprasslib import load_raw
Yan's avatar
Yan committed
8
from prasopes.predictmz import predict as getmzpattern
Yan's avatar
Yan committed
9
10
try:
    from rawautoparams import load_params
Yan's avatar
Yan committed
11
    import rawautoparams
Yan's avatar
Yan committed
12
    autoparams = True
13
except ImportError:
Yan's avatar
Yan committed
14
    autoparams = False
Yan's avatar
Yan committed
15
import rawprasslib
Yan's avatar
Yan committed
16
import numpy as np
Yan's avatar
Yan committed
17
import prasopes.config as cf
18
import prasopes.datatools as dt
19
import prasopes.drltools_gui as drlgui
Yan's avatar
Yan committed
20
import prasopes.filetools as ft
Yan's avatar
Yan committed
21
22
import prasopes.graphtools as gt
import prasopes.imagetools as imgt
Yan's avatar
Yan committed
23
import prasopes.zcetools as zce
Yan's avatar
Yan committed
24
import prasopes.docks as docks
Yan's avatar
Yan committed
25
import prasopes.tangoicons
Yan's avatar
Yan committed
26
27
import sys
import logging
3Yan's avatar
3Yan committed
28
import os.path
Yan's avatar
Yan committed
29
30


31
32
33
34
class update_signal(QtCore.QObject):
    signal = QtCore.pyqtSignal()


35
36
37
38
class QStatusBarLogger(logging.Handler):
    def __init__(self, parent=None):
        super().__init__()
        self.statusBar = QtWidgets.QStatusBar(parent)
Yan's avatar
Yan committed
39
40
        self.trigger = update_signal()
        self.msg = str("")
41
42

    def emit(self, record):
Yan's avatar
Yan committed
43
44
        self.msg = self.format(record)
        self.trigger.signal.emit()
45
46


47
def show_exception_and_exit(exc_type, exc_value, tb):
48
49
    if "figure size must be positive finite not" in str(exc_value):
        return
50
51
    import traceback
    traceback.print_exception(exc_type, exc_value, tb)
3Yan's avatar
3Yan committed
52
53
54
55
56
57
    errmsg = "\n".join(traceback.format_exception(exc_type, exc_value, tb))\
            + ("\n The program might misbehave, do you want to continue?")
    outmsg = QtWidgets.QMessageBox.critical(None, "Exception!", errmsg,
            QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
    if outmsg != QtWidgets.QMessageBox.Yes:
        sys.exit(-1)
58
59


60
def load_file(parent, augCanvas, update, settings, loadthread, filename=None):
Yan's avatar
Yan committed
61
    """populates dataset and plots it"""
62
63
64
    directory = augCanvas.filename or settings.value("open_folder")
    filename = filename or QtWidgets.QFileDialog.getOpenFileName(
            caption="Open spectrum", directory=directory,
3Yan's avatar
3Yan committed
65
            filter="Finnigan RAW files (*.raw, *.RAW)")[0]
66
67
    if filename != '' and os.path.isfile(filename)\
            and not os.path.isdir(filename):
Yan's avatar
Yan committed
68
69
        error = update_signal()
        errormsg = []
70

71
        def runfnc():
Yan's avatar
Yan committed
72
            try:
Yan's avatar
Yan committed
73
                [i.clear() for i in (
74
75
                    augCanvas.ds, augCanvas.chrom['timesarg'],
                    augCanvas.ms['params'], augCanvas.ms['headers'])]
76
77
                [augCanvas.ds.append(dict(
                    chrom_dat=i[0], masses=i[1], matrix=i[2]))
78
                 for i in load_raw(filename, settings.value("tmp_location"))]
79
            except rawprasslib.ParsingException as pex:
Yan's avatar
Yan committed
80
81
                errormsg.append("Opening of the file has failed!")
                errormsg.append(
82
83
                    "File is incompatible with the rawprasslib, "
                    "canceling request!\n\n"
Yan's avatar
Yan committed
84
                    "Error message:\n{}".format(pex.args[0]))
Yan's avatar
Yan committed
85
                error.signal.emit()
86
                return
87
            if autoparams:
88
                try:
89
                    (augCanvas.ms['params'], rawheaders,
Yan's avatar
Yan committed
90
91
                        augCanvas.chrom['machtype']) = load_params(
                                filename, settings.value("tmp_location"))
92
                    segments = [len(subset['chrom_dat'][0])
93
                                for subset in augCanvas.ds]
94
                    indicies = [sum(segments[:i+1])
95
                                for i in range(len(segments))]
96
97
                    augCanvas.ms['headers'] = np.split(
                            rawheaders, indicies)[:-1]
98
                except Exception as pex:
99
100
                    errormsg.append(
                            "File is incompatible with the rawautoparams,")
Yan's avatar
Yan committed
101
102
103
104
                    errormsg.append(
                            "no parameters loaded!\n\n"
                            "Error message:\n{}".format(pex.args[0]))
                    error.signal.emit()
105
106
            gt.populate(augCanvas)
            augCanvas.filename = filename
107
108
109
            oldrecents = settings.value("recents")
            oldrecents.remove(filename) if filename in oldrecents else None
            settings.setValue("recents", [filename, *oldrecents])
110
            update.signal.emit()
111
112
        error.signal.connect(lambda: QtWidgets.QMessageBox.critical(
            parent, errormsg[0], errormsg[1]))
113
114
        loadthread.run = runfnc
        loadthread.start()
3Yan's avatar
3Yan committed
115

Yan's avatar
Yan committed
116

117
def print_graph(augCanvas):
Yan's avatar
Yan committed
118
    def printimage(printdevice, img):
Yan's avatar
Yan committed
119
        printer.setResolution(600)
Yan's avatar
Yan committed
120
        painter = QtGui.QPainter(printdevice)
Yan's avatar
Yan committed
121
122
123
124
        font = painter.font()
        linesize = printer.resolution()/15
        font.setPixelSize(linesize)
        painter.setFont(font)
125
        painter.drawImage(0, 0, img)
Yan's avatar
Yan committed
126
127
128
        offset = img.size().height()
        line = 1
        spacing = 1.5
129
130
131
132
133
        for row in range(augCanvas.paramstable.rowCount()):
            if augCanvas.paramstable.cellWidget(row, 0).checkState() == 2:
                text = augCanvas.paramstable.item(row, 1).text() +\
                       augCanvas.paramstable.item(row, 2).text()
                painter.drawText(300, int(offset+line*linesize*spacing), text)
Yan's avatar
Yan committed
134
                line += 1
Yan's avatar
Yan committed
135
        painter.end()
136
    # TODO: substitute the QPrintPreviewDialog with QPrintPreviewWidget
137
138
    printPreview = QtPrintSupport.QPrintPreviewDialog()
    printer = printPreview.printer()
Yan's avatar
Yan committed
139
140
    printer.setPageSize(printer.A5)
    printer.setDuplex(printer.DuplexNone)
141
142
    image = imgt.paint_image(augCanvas.ms, augCanvas.spectplot,
                             augCanvas.filename, printer)
Yan's avatar
Yan committed
143
    printPreview.paintRequested.connect(lambda:
Yan's avatar
Yan committed
144
                                        printimage(printer, image))
145
146
147
    printPreview.exec()


148
149
150
151
152
153
154
def update_spectrum(augCanvas, config):
    if augCanvas.filename:
        slims = [augCanvas.spectplot.get_xlim(),
                 augCanvas.spectplot.get_ylim()]
        augCanvas.ds.clear()
        [augCanvas.ds.append(dict(chrom_dat=i[0], masses=i[1], matrix=i[2]))
         for i in load_raw(augCanvas.filename, config.value("tmp_location"))]
3Yan's avatar
3Yan committed
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
        if autoparams:
            try:
                (augCanvas.ms['params'], rawheaders,
                    augCanvas.chrom['machtype']) = load_params(
                            augCanvas.filename, config.value("tmp_location"))
                segments = [len(subset['chrom_dat'][0])
                            for subset in augCanvas.ds]
                indicies = [sum(segments[:i+1])
                            for i in range(len(segments))]
                augCanvas.ms['headers'] = np.split(
                        rawheaders, indicies)[:-1]
            except Exception as pex:
                QtWidgets.QMessageBox.critical(None,
                        "File is incompatible with the rawautoparams",
                        "no parameters loaded!\n\n"
                        "Error message:\n{}".format(pex))
171
172
173
174
175
        gt.populate(augCanvas)
        augCanvas.spectplot.set_xlim(slims[0])
        augCanvas.spectplot.set_ylim(slims[1])
        gt.ann_spec(augCanvas.spectplot, augCanvas.ms)
        augCanvas.draw()
Yan's avatar
Yan committed
176
177


178
def update_recents(rcm, main_window, augCanvas, update, config, loadthread):
179
    """updates recents_menu (rcm)"""
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
    rcm.clear()
    # Actions need to be stored somewhere. Otherwise they end up in garbage.
    rcm.actionCache = []
    for i, j in enumerate(config.value("recents"), start=1):
        rcm.actionCache.append(QtWidgets.QAction("&{}. {}".format(i, j), None))
        rcm.actionCache[-1].triggered.connect(lambda _, fn=j: load_file(
            main_window, augCanvas, update, config, loadthread, filename=fn))
    rcm.actionCache.append(rcm.addSeparator())
    rcm.actionCache.append(QtWidgets.QAction("Clear Recents", None))
    [rcm.actionCache[-1].triggered.connect(i) for i in (
         lambda: config.setValue("recents", ""), lambda: update_recents(
             rcm, main_window, augCanvas, update, config, loadthread))]
    rcm.addActions(rcm.actionCache)


195
def dropped(event, parent, augCanvas, update, config, loadthread):
196
    dropurl = event.mimeData().urls()[0].toLocalFile()
197
    load_file(parent, augCanvas, update, config, loadthread, filename=dropurl)
Yan's avatar
Yan committed
198
199
200
201


def drag_entered(event):
    if event.mimeData().hasUrls() and event.mimeData().urls()[0]\
202
            .toLocalFile().lower().endswith('.raw'):
Yan's avatar
Yan committed
203
204
205
        event.accept()


206
def predictmz(form, augCanvas):
Yan's avatar
Yan committed
207
208
    text = form.text()
    if text == "":
209
        augCanvas.ms["predict"] = None
Yan's avatar
Yan committed
210
        return
211
212
213
214
215
216
217
    slims = [augCanvas.spectplot.get_xlim(),
             augCanvas.spectplot.get_ylim()]
    augCanvas.ms["predict"] = getmzpattern(text)
    gt.populate(augCanvas)
    augCanvas.spectplot.set_xlim(slims[0])
    augCanvas.spectplot.set_ylim(slims[1])
    augCanvas.draw()
Yan's avatar
Yan committed
218
219


220
def oddeven_changed(augCanvas, config, oddevenact):
3Yan's avatar
3Yan committed
221
    config.setValue("view/oddeven", oddevenact.isChecked())
222
    update_spectrum(augCanvas, config)
3Yan's avatar
3Yan committed
223
224


3Yan's avatar
3Yan committed
225
def key_pressed(event, augCanvas, config, update):
Yan's avatar
Yan committed
226
    if event.key() == QtCore.Qt.Key_F5:
227
        update_spectrum(augCanvas, config)
3Yan's avatar
3Yan committed
228
229
        if augCanvas.filename:
            update.signal.emit()
230
231
    if event.key() == QtCore.Qt.Key_C:
        if event.modifiers().__int__() == QtCore.Qt.ControlModifier:
232
233
234
235
236
            if augCanvas.paramstable.underMouse():
                dt.clip_tablestr(augCanvas)
            else:
                imgt.clip_spect_img(augCanvas.ms, augCanvas.spectplot,
                                    augCanvas.filename)
237
238
        if event.modifiers().__int__() == QtCore.Qt.ControlModifier + \
                QtCore.Qt.ShiftModifier:
239
            dt.clip_spectstr(augCanvas)
Yan's avatar
Yan committed
240
    if event.key() in (QtCore.Qt.Key_Left, QtCore.Qt.Key_Right):
241
        gt.shift_times(event, augCanvas)
Yan's avatar
Yan committed
242
243


Yan's avatar
Yan committed
244
245
def about(parent):
    """constructs window with "about" info"""
Yan's avatar
Yan committed
246
247
248
    rawparver = rawautoparams.__version__ if autoparams else\
            "library not found"

Yan's avatar
Yan committed
249
250
251
    QtWidgets.QMessageBox.information(
            parent, "About Prasopes",
            "Prasopes Finnigan raw file viewer\n\n"
Yan's avatar
Yan committed
252
253
254
255
            "Version: {} (alpha)\n\n"
            "Rawprasslib version: {}\n"
            "Rawautoparams version: {}".format(
                prasopes.__version__, rawprasslib.__version__, rawparver))
Yan's avatar
Yan committed
256
257


Yan's avatar
Yan committed
258
def main():
259
260
261
    # thx to: https://stackoverflow.com/questions/779675/stop-python-from-closing-on-error/781074#781074
    sys.excepthook = show_exception_and_exit

262
    app = QtWidgets.QApplication(sys.argv)
263
    loadthread = QtCore.QThread()
264

265
    augCanvas = gt.AugFigureCanvas()
266
    update = update_signal()
Yan's avatar
Yan committed
267

Yan's avatar
Yan committed
268
269
    config = cf.settings()

270
    barHandler = QStatusBarLogger()
271
272
    barHandler.trigger.signal.connect(
        lambda: barHandler.statusBar.showMessage(barHandler.msg))
273

Yan's avatar
Yan committed
274
    p_logger = logging.getLogger('parseLogger')
275
    params_logger = logging.getLogger('acqLogLogger')
Yan's avatar
Yan committed
276
    drl_logger = logging.getLogger('drlLogger')
277
    zce_logger = logging.getLogger('zceLogger')
Yan's avatar
Yan committed
278
    logging.basicConfig()
279
    # p_logger.setLevel("WARN")
280
    p_logger.setLevel("DEBUG")
281
    # drl_logger.setLevel("INFO")
Yan's avatar
Yan committed
282
    drl_logger.setLevel("DEBUG")
283
    zce_logger.setLevel("DEBUG")
284
    # params_logger.setLevel("DEBUG")
285
286
    p_logger.addHandler(barHandler)
    zce_logger.addHandler(barHandler)
287
288
    params_logger.addHandler(barHandler)
    barHandler.setLevel("DEBUG")
Yan's avatar
Yan committed
289

Yan's avatar
Yan committed
290
    main_window = QtWidgets.QMainWindow(windowTitle="Prasopes")
291
292
    update.signal.connect(lambda: main_window.setWindowTitle(
        "Prasopes - {}".format(os.path.basename(augCanvas.filename))))
Yan's avatar
Yan committed
293

294
    if QtGui.QIcon.themeName() == "":
Yan's avatar
Yan committed
295
296
        QtGui.QIcon.setThemeName("TangoMFK")

Yan's avatar
Yan committed
297
298
299
    consoledock = docks.consoleDockWidget(
            locals(), "&Console", "view/consolevisible")
    treedock = docks.treeDockWidget(
300
301
            "&File browser", "view/filebrowservisible", update, load_file,
            main_window, augCanvas, config, loadthread)
Yan's avatar
Yan committed
302
    paramsdock = docks.AugDock("Acquisition parameters", "&Acq parameters",
303
                               "view/acqparvisible")
304
305
    update.signal.connect(lambda: gt.update_paramstable(augCanvas))
    paramsdock.setWidget(augCanvas.paramstable)
Yan's avatar
Yan committed
306

Yan's avatar
Yan committed
307
    openact = QtWidgets.QAction(QtGui.QIcon.fromTheme(
Yan's avatar
Yan committed
308
        "document-open"), "&Open...", None)
Yan's avatar
Yan committed
309
310
    openact.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_O)
    openact.triggered.connect(lambda: load_file(
311
        main_window, augCanvas, update, config, loadthread))
Yan's avatar
Yan committed
312
    exportact = QtWidgets.QAction(QtGui.QIcon.fromTheme(
Yan's avatar
Yan committed
313
        "document-save-as"), "&Export...", None)
Yan's avatar
Yan committed
314
315
    exportact.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_E)
    exportact.triggered.connect(lambda: ft.export_dial(
316
        augCanvas, main_window))
317
318
319
    printact = QtWidgets.QAction(QtGui.QIcon.fromTheme(
        "document-print"), "&Print", None)
    printact.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_P)
320
    printact.triggered.connect(lambda: print_graph(augCanvas))
Yan's avatar
Yan committed
321
    settingsact = QtWidgets.QAction(QtGui.QIcon.fromTheme(
Yan's avatar
Yan committed
322
        "preferences-system"), "&Settings...", None)
Yan's avatar
Yan committed
323
324
    settingsact.triggered.connect(lambda: cf.dial(main_window))
    quitact = QtWidgets.QAction(QtGui.QIcon.fromTheme(
Yan's avatar
Yan committed
325
        "application-exit"), "&Quit", None)
Yan's avatar
Yan committed
326
327
328
    quitact.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_Q)
    quitact.triggered.connect(main_window.close)
    zceact = QtWidgets.QAction(QtGui.QIcon.fromTheme(
Yan's avatar
Yan committed
329
        "applications-utilities"), "&TSQ zce...", None)
Yan's avatar
Yan committed
330
331
    zceact.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_T)
    zceact.triggered.connect(lambda: zce.dialog(
332
        main_window, augCanvas, update))
Yan's avatar
Yan committed
333
    drlact = QtWidgets.QAction(QtGui.QIcon.fromTheme(
Yan's avatar
Yan committed
334
        "applications-utilities"), "&DRL...", None)
Yan's avatar
Yan committed
335
    drlact.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_D)
336
    drlact.triggered.connect(lambda: drlgui.main_window(
337
        main_window, augCanvas, update))
Yan's avatar
Yan committed
338
339
    aboutact = QtWidgets.QAction("&About Prasopes", None)
    aboutact.triggered.connect(lambda: about(main_window))
Yan's avatar
Yan committed
340
    autozoomy = QtWidgets.QAction(QtGui.QIcon.fromTheme(
Yan's avatar
Yan committed
341
342
343
344
        "zoom-original"), "Auto Zoom Y", None, checkable=True,
        checked=config.value("view/autozoomy", type=bool))
    autozoomy.triggered.connect(lambda: config.setValue(
                                "view/autozoomy", autozoomy.isChecked()))
Yan's avatar
Yan committed
345
    autozoomy.triggered.connect(lambda: gt.autozoomy(augCanvas.spectplot))
346
    intensitiesact = QtWidgets.QAction(
Yan's avatar
Yan committed
347
348
        "&Show intensities", None, checkable=True,
        checked=config.value("view/intensities", type=bool))
349
350
    intensitiesact.triggered.connect(lambda: config.setValue(
        "view/intensities", intensitiesact.isChecked()))
Yan's avatar
Yan committed
351
352
    intensitiesact.triggered.connect(lambda: gt.ann_spec(
        augCanvas.spectplot, augCanvas.ms))
353
    intensitiesact.triggered.connect(lambda: augCanvas.draw())
354
    oddevenact = QtWidgets.QAction(
Yan's avatar
Yan committed
355
356
            "&Odd / even", None, checkable=True,
            checked=config.value("view/oddeven", type=bool))
357
358
    oddevenact.triggered.connect(
        lambda: oddeven_changed(augCanvas, config, oddevenact))
Yan's avatar
Yan committed
359

Yan's avatar
Yan committed
360
361
    predictform = QtWidgets.QLineEdit(maximumWidth=150)
    predictform.editingFinished.connect(lambda: predictmz(
362
        predictform, augCanvas))
Yan's avatar
Yan committed
363

364
365
366
367
368
369
    recents_menu = QtWidgets.QMenu('Open &Recent', main_window)
    update_recents(recents_menu, main_window, augCanvas,
                   update, config, loadthread)
    update.signal.connect(lambda: update_recents(
        recents_menu, main_window, augCanvas, update, config, loadthread))

Yan's avatar
Yan committed
370
371
    file_menu = QtWidgets.QMenu('&File', main_window)
    main_window.menuBar().addMenu(file_menu)
Yan's avatar
Yan committed
372
    file_menu.addAction(openact)
373
    file_menu.addMenu(recents_menu)
Yan's avatar
Yan committed
374
375
    file_menu.addAction(exportact)
    file_menu.addSeparator()
376
377
    file_menu.addAction(printact)
    file_menu.addSeparator()
Yan's avatar
Yan committed
378
379
380
    file_menu.addAction(settingsact)
    file_menu.addSeparator()
    file_menu.addAction(quitact)
Yan's avatar
Yan committed
381
382
    tools_menu = QtWidgets.QMenu('&Tools', main_window)
    main_window.menuBar().addMenu(tools_menu)
Yan's avatar
Yan committed
383
384
    tools_menu.addAction(zceact)
    tools_menu.addAction(drlact)
385
    tools_menu.addSeparator()
Yan's avatar
Yan committed
386
    view_menu = QtWidgets.QMenu('&View', main_window)
387
388
    [view_menu.addAction(i.action) for i in
     (treedock, paramsdock, consoledock)]
Yan's avatar
Yan committed
389
    [view_menu.addAction(i) for i in (autozoomy, intensitiesact)]
390
391
    view_menu.addSeparator()
    view_menu.addAction(oddevenact)
Yan's avatar
Yan committed
392
    main_window.menuBar().addMenu(view_menu)
Yan's avatar
Yan committed
393
394
395
    help_menu = QtWidgets.QMenu('&Help', main_window)
    main_window.menuBar().addMenu(help_menu)
    help_menu.addAction(aboutact)
Yan's avatar
Yan committed
396

397
    main_window.setCentralWidget(augCanvas)
Yan's avatar
Yan committed
398

Yan's avatar
Yan committed
399
400
401
402
403
    toolBar = QtWidgets.QToolBar(main_window)
    toolBar.setAllowedAreas(QtCore.Qt.TopToolBarArea)
    toolBar.setFloatable(False)
    toolBar.setMovable(False)
    toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
Yan's avatar
Yan committed
404

Yan's avatar
Yan committed
405
406
407
    toolBar.addAction(openact)
    toolBar.addAction(exportact)
    toolBar.addSeparator()
Yan's avatar
Yan committed
408
409
410
    toolBar.addWidget(QtWidgets.QLabel("Predict Formula:"))
    toolBar.addWidget(predictform)
    toolBar.addSeparator()
Yan's avatar
Yan committed
411
412
    toolBar.addAction(zceact)
    toolBar.addAction(drlact)
Yan's avatar
Yan committed
413
414
    toolBar.addSeparator()
    toolBar.addAction(autozoomy)
Yan's avatar
Yan committed
415

Yan's avatar
Yan committed
416
417
    main_window.dragEnterEvent = lambda event: drag_entered(event)
    main_window.dropEvent = lambda event: dropped(
418
        event, main_window, augCanvas, update, config, loadthread)
Yan's avatar
Yan committed
419
    main_window.setAcceptDrops(True)
420
    main_window.keyPressEvent = lambda event: key_pressed(
3Yan's avatar
3Yan committed
421
            event, augCanvas, config, update)
Yan's avatar
Yan committed
422
423
    main_window.resizeEvent = lambda event: augCanvas.constrained_draw()
    update.signal.connect(lambda: augCanvas.constrained_draw())
Yan's avatar
Yan committed
424

425
426
    main_window.addToolBar(QtCore.Qt.TopToolBarArea, toolBar)
    main_window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, treedock)
Yan's avatar
Yan committed
427
    main_window.addDockWidget(QtCore.Qt.RightDockWidgetArea, paramsdock)
Yan's avatar
Yan committed
428
    main_window.addDockWidget(QtCore.Qt.RightDockWidgetArea, consoledock)
429
    main_window.setStatusBar(barHandler.statusBar)
430
431
432

    main_window.setFocus()

Yan's avatar
Yan committed
433
    if len(sys.argv) == 2:
434
        load_file(main_window, augCanvas, update, config, loadthread,
435
                  filename=sys.argv[1])
Yan's avatar
Yan committed
436
    else:
437
438
        gt.pop_plot(0, 0, augCanvas.spectplot, augCanvas.ms)
        gt.pop_plot(0, 0, augCanvas.chromplot, augCanvas.chrom)
Yan's avatar
Yan committed
439
440
441

    main_window.show()
    sys.exit(app.exec_())
Yan's avatar
Yan committed
442

443

Yan's avatar
Yan committed
444
445
if __name__ == "__main__":
    main()