#!/usr/bin/env python3 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure from matplotlib.widgets import SpanSelector from matplotlib.gridspec import GridSpec from PyQt5 import QtCore from PyQt5 import QtWidgets from PyQt5 import QtGui from rawprasslib import load_raw from rawprasslib import rawprasslib import prasopes.graphtools as gt import prasopes.filetools as ft import prasopes.zcetools as zce import prasopes.drltools as drl import prasopes.config as cf import prasopes.tangoicons import sys import matplotlib import logging import os.path matplotlib.use("Qt5Agg") def load_file(parent, chrom_plot, spc, d_set, ms_s, fn, chrom_s, settings, filename=None): """populates dataset and plots it""" directory=settings.value("open_folder") if fn[0] is not None: directory=fn[0] if filename == None: filename = QtWidgets.QFileDialog.getOpenFileName( caption="Open spectrum", directory=directory, filter="Finnigan RAW files (*.raw, *.RAW)")[0] if filename is not '': try: d_set['chrom_dat'], d_set['masses'], d_set['matrix'] \ = load_raw(filename, settings.value("tmp_location")) except rawprasslib.ParsingException as pex: QtWidgets.QMessageBox.critical( parent, "Opening of the file has failed!", "File is incompatible with the rawprasslib, " "canceling request!\n\n" "Error message:\n{}".format(pex.args[0])) return gt.populate(chrom_plot, spc, d_set, ms_s, chrom_s) fn[0] = filename parent.setWindowTitle("Prasopes - {}".format( os.path.basename(filename))) def update_spectrum(event, chromatogram, spect, ds, ms, fn, chrom, config): if fn[0] is not None and event.key is "f5": slims = [spect.get_xlim(), spect.get_ylim()] ds['chrom_dat'], ds['masses'], ds['matrix'] \ = load_raw(fn[0], config.value("tmp_location")) gt.populate(chromatogram, spect, ds, ms, chrom) spect.set_xlim(slims[0]) spect.set_ylim(slims[1]) spect.get_figure().canvas.draw() def dropped(event, parent, chromatogram, spectrum, ds, ms, filename, chrom, config): dropurl = event.mimeData().urls()[0].toLocalFile() load_file(parent, chromatogram, spectrum, ds, ms, filename, chrom, config, filename=dropurl) def drag_entered(event): if event.mimeData().hasUrls() and event.mimeData().urls()[0]\ .toLocalFile().lower().endswith('.raw'): event.accept() def about(parent): """constructs window with "about" info""" QtWidgets.QMessageBox.information( parent, "About Prasopes", "Prasopes Finnigan raw file viewer\n\n" "Version: 0.0.2 (alpha)") def main(): # ds for data_set, ms for mass_spec_dataset, chrom for chrom_dataset ds = dict(chrom_dat=None, masses=None, matrix=None) ms = dict(x=[0], y=[0], line=None, annotation=[], name="Spectrum", xlabel="m/z", ylabel="ion count", xtics=20, autoy=True) chrom = dict(x=[0], y=[0], line=None, t_start=None, t_end=None, name="Chromatogram", xlabel="time(min)", ylabel="total ion count", timesarg=None) filename = [None] drlcache = [None, None] config = cf.settings() p_logger = logging.getLogger('parseLogger') drl_logger = logging.getLogger('drlLogger') logging.basicConfig() p_logger.setLevel("WARN") #drl_logger.setLevel("INFO") drl_logger.setLevel("DEBUG") graph = Figure(figsize=(5, 4), dpi=100, facecolor="None") grid = graph.add_gridspec(2, 1) chromatogram = graph.add_subplot(grid[0,0], facecolor=(1, 1, 1, 0.8)) spectrum = graph.add_subplot(grid[1,0], facecolor=(1, 1, 1, 0.8)) graph.tight_layout() mpl_canvas = FigureCanvas(graph) mpl_canvas.setStyleSheet("background-color:transparent;") mpl_canvas.setAutoFillBackground(False) mpl_canvas.setFocusPolicy(QtCore.Qt.ClickFocus) gt.pan_factory(chromatogram) gt.zoom_factory(chromatogram, 1.15) gt.arrow_factory(spectrum, chromatogram, ds, ms, chrom) gt.pan_factory(spectrum, ms) gt.zoom_factory(spectrum, 1.15, ms) mass_selector = SpanSelector( spectrum, lambda x_min, x_max: gt.pick_masses( x_min, x_max, spectrum, ms), 'horizontal', minspan=0.01, useblit=True, rectprops=dict(alpha=0.15, facecolor='purple'), button=3) time_selector = SpanSelector( chromatogram, lambda x_min, x_max: gt.pick_times( x_min, x_max, spectrum, ds, chromatogram, ms, chrom), 'horizontal', useblit=True, rectprops=dict( alpha=0.15, facecolor='purple'), button=3) app = QtWidgets.QApplication(sys.argv) main_window = QtWidgets.QMainWindow(windowTitle="Prasopes") if QtGui.QIcon.themeName() is "": QtGui.QIcon.setThemeName("TangoMFK") openact = QtWidgets.QAction(QtGui.QIcon.fromTheme( "document-open"), "&Open...", None) openact.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_O) openact.triggered.connect(lambda: load_file( main_window, chromatogram, spectrum, ds, ms, filename, chrom, config)) exportact = QtWidgets.QAction(QtGui.QIcon.fromTheme( "document-save-as"), "&Export...", None) exportact.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_E) exportact.triggered.connect(lambda: ft.export_dial( ms, chrom, filename, main_window)) settingsact = QtWidgets.QAction(QtGui.QIcon.fromTheme( "preferences-system"), "&Settings...", None) settingsact.triggered.connect(lambda: cf.dial(main_window)) quitact = QtWidgets.QAction(QtGui.QIcon.fromTheme( "application-exit"), "&Quit", None) quitact.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_Q) quitact.triggered.connect(main_window.close) zceact = QtWidgets.QAction(QtGui.QIcon.fromTheme( "applications-utilities"), "&TSQ zce...", None) zceact.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_T) zceact.triggered.connect(lambda: zce.dialog( main_window, ds, filename)) drlact = QtWidgets.QAction(QtGui.QIcon.fromTheme( "applications-utilities"), "&DRL...", None) drlact.setShortcut(QtCore.Qt.CTRL + QtCore.Qt.Key_D) drlact.triggered.connect(lambda: drl.main_window( main_window, ds, filename, drlcache)) aboutact = QtWidgets.QAction("&About Prasopes", None) aboutact.triggered.connect(lambda: about(main_window)) autozoomy = QtWidgets.QAction(QtGui.QIcon.fromTheme( "zoom-original"), "Auto Zoom Y", None) autozoomy.setCheckable(True) autozoomy.setChecked(True) autozoomy.triggered.connect(lambda: gt.autozoomy( autozoomy.isChecked(), spectrum, ms)) file_menu = QtWidgets.QMenu('&File', main_window) main_window.menuBar().addMenu(file_menu) file_menu.addAction(openact) file_menu.addAction(exportact) file_menu.addSeparator() file_menu.addAction(settingsact) file_menu.addSeparator() file_menu.addAction(quitact) tools_menu = QtWidgets.QMenu('&Tools', main_window) main_window.menuBar().addMenu(tools_menu) tools_menu.addAction(zceact) tools_menu.addAction(drlact) help_menu = QtWidgets.QMenu('&Help', main_window) main_window.menuBar().addMenu(help_menu) help_menu.addAction(aboutact) main_widget = QtWidgets.QWidget(main_window) main_window.setCentralWidget(main_widget) toolBar = QtWidgets.QToolBar(main_window) toolBar.setAllowedAreas(QtCore.Qt.TopToolBarArea) toolBar.setFloatable(False) toolBar.setMovable(False) toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) toolBar.addAction(openact) toolBar.addAction(exportact) toolBar.addSeparator() toolBar.addAction(zceact) toolBar.addAction(drlact) toolBar.addSeparator() toolBar.addAction(autozoomy) layout = QtWidgets.QVBoxLayout(main_widget) layout.addWidget(toolBar) layout.addWidget(mpl_canvas) mpl_canvas.setFocus() mpl_canvas.mpl_connect('key_press_event', lambda event: update_spectrum(event, chromatogram, spectrum, ds, ms, filename, chrom, config)) main_window.dragEnterEvent = lambda event: drag_entered(event) main_window.dropEvent = lambda event: dropped( event, main_window, chromatogram, spectrum, ds, ms, filename, chrom, config) main_window.setAcceptDrops(True) if len(sys.argv) == 2: load_file(main_window, chromatogram, spectrum, ds, ms, filename, chrom, config, filename=sys.argv[1]) else: gt.pop_plot(spectrum, ms) gt.pop_plot(chromatogram, chrom) main_window.show() sys.exit(app.exec_()) if __name__ == "__main__": main()