class MainWin(QtGui.QMainWindow): # pylint: disable=R0904 def __init__(self, app): QtGui.QMainWindow.__init__(self) self.setWindowTitle("Satellite") icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(dirname(realpath(__file__)) + os.sep + 'satellite.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) app.setWindowIcon(icon) self.resize(800, 600) self.statusBar().showMessage("Welcome in Satellite !") self.view_tab = ViewTab() self.tlp_overlay = TLPOverlayFig() self.view_tab.addTab(self.tlp_overlay, "TLP") self.core_storm = None # pointer to single tlp and pulsepicker figure self.tlpfig = None # single tlp figure self.ppfig = None # single pulse picker figure self.leakivsfig = None # leakage IVs figure self.lpfig = None # leakage IV pulse pick file_menu = self.menuBar().addMenu("&File") #New oef file new_file_action = QtGui.QAction("&New", self) file_menu.addAction(new_file_action) def oef_new(): new_name = getsavefilename( self, "New oef file", './untitled.oef', "Open ESD Format (*.oef)")[0] if len(new_name) != 0: file_name = str(new_name) new_file = h5py.File(file_name, 'w') new_file.close() self.core_storm = Storm(file_name) self.core_storm_listwdgt.clear() self.droplet_dict = {} self.setWindowTitle("Satellite | %s" % file_name) self.import_menu.setEnabled(True) new_file_action.triggered.connect(oef_new) #Open oef file open_action = QtGui.QAction("&Open", self) file_menu.addAction(open_action) def oef_open(): file_name = getopenfilename( self, "Load oef file", '', 'Open ESD Format (*.oef)',)[0] if len(file_name) != 0: self.core_storm = Storm(str(file_name)) self.core_storm_listwdgt.clear() self.droplet_dict = {} for view in self.core_storm: droplet = view.experiment item = QtGui.QListWidgetItem(droplet.exp_name, self.core_storm_listwdgt) item.setToolTip(droplet.exp_name) self.droplet_dict[id(item)] = droplet self.setWindowTitle("Satellite | %s" % file_name) self.import_menu.setEnabled(True) open_action.triggered.connect(oef_open) # Import menu import_menu = file_menu.addMenu("&Import") self.import_menu = import_menu for importer_name in plug_dict.keys(): load_file_action = QtGui.QAction("&%s" % importer_name, self) import_menu.addAction(load_file_action) loader = ImportLoader(importer_name, self) load_file_action.triggered.connect(loader) loader.new_data_ready.connect(self.add_new_droplet) loader.log_message_signal.connect(self.status_bar_show_message) self.import_menu.setEnabled(False) # Quit menu self.menuquit = QtGui.QAction("&Quit", self, shortcut=QtGui.QKeySequence.Close, statusTip="Quit the Application", triggered=self.close) file_menu.addAction(self.menuquit) # Help menu help_menu = self.menuBar().addMenu("&Help") self.about_action = QtGui.QAction("About", self) self.about_action.triggered.connect(self.show_about) self.about_action.setStatusTip("about satellite") help_menu.addAction(self.about_action) #initialize associated QListWidget to the open storm core_storm_listwdgt = QtGui.QListWidget(self) core_storm_listwdgt.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) core_storm_listwdgt.setDragDropMode( QtGui.QAbstractItemView.InternalMove) core_storm_listwdgt.itemSelectionChanged.connect( self.core_storm_selection_change) core_storm_listwdgt.setSortingEnabled(True) core_storm_listwdgt.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) core_storm_listwdgt.customContextMenuRequested.connect(self.list_menu) split = QtGui.QSplitter() split.addWidget(core_storm_listwdgt) split.addWidget(self.view_tab) layout = QtGui.QHBoxLayout() layout.addWidget(split) central_widget = QtGui.QWidget() central_widget.setLayout(layout) self.setCentralWidget(central_widget) self.core_storm_listwdgt = core_storm_listwdgt self.droplet_dict = {} def list_menu(self, position): item = self.core_storm_listwdgt.itemAt(position) droplet = self.droplet_dict[id(item)] def show_pulse_pick(): self.ppfig = PulsesPickFig(droplet.raw_data, item.text()) self.ppfig.show() def show_tlp(): self.tlpfig = TlpFig(droplet.raw_data.tlp_curve, item.text(), droplet.raw_data.leak_evol) self.tlpfig.show() def show_leakage_ivs(): self.leakivsfig = LeakageIVsFig(droplet.raw_data.iv_leak, item.text()) self.leakivsfig.show() def show_leakage_pick(): self.lpfig = LeakagesPickFig(droplet.raw_data, item.text()) self.lpfig.show() def show_reporting(): def update_report(): droplet.analysis.spot_v = self.report_wind.new_spot droplet.analysis.fail_perc = self.report_wind.new_fail droplet.analysis.seuil = self.report_wind.new_seuil droplet.analysis.update_analysis() self.report_wind.view.view.reload() @QtCore.Slot(str) def save_report(save_name): droplet.analysis.save_analysis(save_name) #TODO should rename save_analysis by save def update_report_style(): droplet.analysis.css = self.report_wind.css_str droplet.analysis.update_style() self.report_wind.view.view.reload() #TODO something is wrong with this naming if not hasattr(droplet, "analysis"): droplet.analysis = RawTLPdataAnalysis(droplet) self.report_wind = ReportFrame( droplet.analysis.report.report_name) self.report_wind.c.value_changed.connect(update_report) self.report_wind.c.save_doc.connect(save_report) self.report_wind.css_change.value_changed.connect( update_report_style) self.report_wind.show() menu = QtGui.QMenu(self) #Set pulse picker in context menu pulse_pick_action = QtGui.QAction("Pulse pick tool", self) pulse_pick_action.triggered.connect(show_pulse_pick) pulse_pick_action.setEnabled(droplet.raw_data.has_transient_pulses) pulse_pick_action.setStatusTip( "Visualize transient data from selected TLP-data point(s)" if droplet.raw_data.has_transient_pulses else "Sorry, No transient data available") #Set tlp with leakage evolution in context menu tlp_action = QtGui.QAction("TLP with leakage", self) tlp_action.triggered.connect(show_tlp) tlp_action.setEnabled(droplet.raw_data.has_leakage_evolution) tlp_action.setStatusTip( "Visualize TLP with leakage evolution" if droplet.raw_data.has_leakage_evolution else "Sorry, No leakage evolution data available") #Set leakage ivs in context menu leakage_ivs_action = QtGui.QAction("Leakage IVs", self) leakage_ivs_action.triggered.connect(show_leakage_ivs) leakage_ivs_action.setEnabled(droplet.raw_data.has_leakage_ivs) leakage_ivs_action.setStatusTip( "Visualize leakage IVs" if droplet.raw_data.has_leakage_ivs else "Sorry, No leakage IVs available") #Set leakage picker in context menu leakage_pick_action = QtGui.QAction("Leakage pick tool", self) leakage_pick_action.triggered.connect(show_leakage_pick) leakage_pick_action.setEnabled(droplet.raw_data.has_leakage_ivs) leakage_pick_action.setStatusTip( "Visualize leakage data from selected TLP-data point(s)" if droplet.raw_data.has_leakage_ivs else "Sorry, No leakage data available") #Set report tool in context menu report_action = QtGui.QAction("Reporting tool", self) report_action.triggered.connect(show_reporting) report_action.setStatusTip("Visualize report from selected TLP-data") menu.addAction(pulse_pick_action) menu.addAction(tlp_action) menu.addAction(leakage_ivs_action) menu.addAction(leakage_pick_action) menu.addAction(report_action) menu.exec_(self.core_storm_listwdgt.mapToGlobal(position)) def status_bar_show_message(self, message): self.statusBar().showMessage(message) def add_new_droplet(self, raw_data, importer): droplet = importer.load_in_droplet(raw_data, self.core_storm._h5file) self.core_storm.append(View(droplet)) item = QtGui.QListWidgetItem(droplet.exp_name, self.core_storm_listwdgt) item.setToolTip(droplet.raw_data.original_file_name) self.droplet_dict[id(item)] = droplet def core_storm_selection_change(self): items = self.core_storm_listwdgt.selectedItems() droplet_list = [] for item in items: droplet_list.append(self.droplet_dict[id(item)]) self.core_storm.overlay_raw_tlp(self.tlp_overlay.fig, experiment_list=tuple(droplet_list)) def show_about(self): import platform import thunderstorm from . import __version__ from . import qt versions = {'satellite': __version__, 'thunderstorm': thunderstorm.__version__, 'python': platform.python_version(), # "2.7.3" 'bitness': platform.architecture()[0], # 64bits 'system': platform.system(), # Linux, Windows, ... 'qt': qt.QtCore.__version__, 'qt_api': qt.API_NAME, # PySide or PyQt4 'qt_api_ver': qt.__version__, } QtGui.QMessageBox.about( self, "About Satellite", """<a href="http://esdanalysistools.github.io/Satellite/"> <b>Satellite {satellite}</b></a> <p> Copyright © 2013 ESDAnalysisTools Development Team <br/>Licensed under the terms of the MIT License </p> <p>Satellite is a software dedicated to visualisation and analysis of TLP measurements. </p> <p> Created by David Trémouilles <br/>Developed and maintained by the <br/><a href="https://github.com/ESDAnalysisTools?tab=members"> ESDAnalysisTools Development Team</a> <br/>Many thanks to all Satellite beta-testers and regular users. <p>Data analysis and visualisation is powered by <a href="http://esdanalysistools.github.com/ThunderStorm/"> <b>Thunderstorm {thunderstorm}</b></a> </p><a href="https://github.com/ESDAnalysisTools/Satellite/issues"> Bug reports and feature requests.</a> <p> </p> <p>Python {python} ({bitness}) <br/>Qt {qt}, {qt_api} {qt_api_ver} <br/>on {system} </p> """.format(**versions))
class MainWin(QtGui.QMainWindow): # pylint: disable=R0904 def __init__(self, app): QtGui.QMainWindow.__init__(self) self.setWindowTitle("Satellite") icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(':/satellite.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) app.setWindowIcon(icon) self.resize(800, 600) self.statusBar().showMessage("Welcome in Satellite !") self.view_tab = ViewTab() tlp_overlay = TLPOverlayFig() self.core_storm = Storm(tlp_overlay.fig) self.view_tab.addTab(tlp_overlay, "TLP") # pointer to single tlp and pulsepicker figure self.tlpfig = None #single tlp figure self.ppfig = None #single pulse picker figure self.leakivsfig = None #leakage IVs figure self.lpfig = None # leakage IV pulse pick #initialize menu file_menu = self.menuBar().addMenu("&File") import_menu = file_menu.addMenu("&Import") for importer_name in plug_dict.keys(): load_file_action = QtGui.QAction("&%s"%importer_name, self) import_menu.addAction(load_file_action) loader = ImportLoader(importer_name, self) load_file_action.triggered.connect(loader) loader.new_data_ready.connect(self.add_new_experiment) loader.log_message_signal.connect(self.status_bar_show_message) #initialize core_storm and associated QListWidget core_storm_listwdgt = QtGui.QListWidget(self) core_storm_listwdgt.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) core_storm_listwdgt.setDragDropMode( QtGui.QAbstractItemView.InternalMove) core_storm_listwdgt.itemSelectionChanged.connect( self.core_storm_selection_change) core_storm_listwdgt.setSortingEnabled(True) core_storm_listwdgt.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) core_storm_listwdgt.customContextMenuRequested.connect(self.list_menu) layout = QtGui.QHBoxLayout() layout.addWidget(core_storm_listwdgt) layout.addWidget(self.view_tab) central_widget = QtGui.QWidget() central_widget.setLayout(layout) self.setCentralWidget(central_widget) self.core_storm_listwdgt = core_storm_listwdgt self.experiment_dict = {} def list_menu(self, position): item = self.core_storm_listwdgt.itemAt(position) experiment = self.experiment_dict[id(item)] def show_pulse_pick(): self.ppfig = PulsesPickFig(experiment.raw_data, item.text()) self.ppfig.show() def show_tlp(): self.tlpfig = TlpFig(experiment.raw_data.tlp_curve, item.text(), experiment.raw_data.leak_evol) self.tlpfig.show() def show_leakage_ivs(): self.leakivsfig = LeakageIVsFig(experiment.raw_data.iv_leak, item.text()) self.leakivsfig.show() def show_leakage_pick(): self.lpfig = LeakagesPickFig(experiment.raw_data, item.text()) self.lpfig.show() menu = QtGui.QMenu(self) #Set pulse picker in context menu pulse_pick_action = QtGui.QAction("Pulse pick tool", self) pulse_pick_action.triggered.connect(show_pulse_pick) pulse_pick_action.setEnabled(experiment.raw_data.has_transient_pulses) pulse_pick_action.setStatusTip( "Visualize transient data from selected TLP-data point(s)" if experiment.raw_data.has_transient_pulses else "Sorry, No transient data available") #Set tlp with leakage evolution in context menu tlp_action = QtGui.QAction("TLP with leakage", self) tlp_action.triggered.connect(show_tlp) tlp_action.setEnabled(experiment.raw_data.has_leakage_evolution) tlp_action.setStatusTip( "Visualize TLP with leakage evolution" if experiment.raw_data.has_leakage_evolution else "Sorry, No leakage evolution data available") #Set leakage ivs in context menu leakage_ivs_action = QtGui.QAction("Leakage IVs", self) leakage_ivs_action.triggered.connect(show_leakage_ivs) leakage_ivs_action.setEnabled(experiment.raw_data.has_leakage_ivs) leakage_ivs_action.setStatusTip( "Visualize leakage IVs" if experiment.raw_data.has_leakage_ivs else "Sorry, No leakage IVs available") #Set leakage picker in context menu leakage_pick_action = QtGui.QAction("Leakage pick tool", self) leakage_pick_action.triggered.connect(show_leakage_pick) leakage_pick_action.setEnabled(experiment.raw_data.has_leakage_ivs) leakage_pick_action.setStatusTip( "Visualize leakage data from selected TLP-data point(s)" if experiment.raw_data.has_leakage_ivs else "Sorry, No leakage data available") menu.addAction(pulse_pick_action) menu.addAction(tlp_action) menu.addAction(leakage_ivs_action) menu.addAction(leakage_pick_action) menu.exec_(self.core_storm_listwdgt.mapToGlobal(position)) def status_bar_show_message(self, message): self.statusBar().showMessage(message) def add_new_experiment(self, experiment, file_name): data_name = os.path.splitext(os.path.basename(str(file_name)))[0] experiment.exp_name = data_name self.core_storm.append(View(experiment)) item = QtGui.QListWidgetItem(experiment.exp_name, self.core_storm_listwdgt) item.setToolTip(data_name) self.experiment_dict[id(item)] = experiment def core_storm_selection_change(self): items = self.core_storm_listwdgt.selectedItems() experiment_list = [] for item in items: experiment_list.append(self.experiment_dict[id(item)]) self.core_storm.overlay_raw_tlp(experiment_list=experiment_list)
class MainWin(QtGui.QMainWindow): # pylint: disable=R0904 def __init__(self, app): QtGui.QMainWindow.__init__(self) self.setWindowTitle("Satellite") icon = QtGui.QIcon() icon.addPixmap( QtGui.QPixmap( dirname(realpath(__file__)) + os.sep + 'satellite.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) app.setWindowIcon(icon) self.resize(800, 600) self.statusBar().showMessage("Welcome in Satellite !") self.view_tab = ViewTab() self.tlp_overlay = TLPOverlayFig() self.view_tab.addTab(self.tlp_overlay, "TLP") self.core_storm = None # pointer to single tlp and pulsepicker figure self.tlpfig = None # single tlp figure self.ppfig = None # single pulse picker figure self.leakivsfig = None # leakage IVs figure self.lpfig = None # leakage IV pulse pick file_menu = self.menuBar().addMenu("&File") #New oef file new_file_action = QtGui.QAction("&New", self) file_menu.addAction(new_file_action) def oef_new(): new_name = getsavefilename(self, "New oef file", './untitled.oef', "Open ESD Format (*.oef)")[0] if len(new_name) != 0: file_name = str(new_name) new_file = h5py.File(file_name, 'w') new_file.close() self.core_storm = Storm(file_name) self.core_storm_listwdgt.clear() self.droplet_dict = {} self.setWindowTitle("Satellite | %s" % file_name) self.import_menu.setEnabled(True) new_file_action.triggered.connect(oef_new) #Open oef file open_action = QtGui.QAction("&Open", self) file_menu.addAction(open_action) def oef_open(): file_name = getopenfilename( self, "Load oef file", '', 'Open ESD Format (*.oef)', )[0] if len(file_name) != 0: self.core_storm = Storm(str(file_name)) self.core_storm_listwdgt.clear() self.droplet_dict = {} for view in self.core_storm: droplet = view.experiment item = QtGui.QListWidgetItem(droplet.exp_name, self.core_storm_listwdgt) item.setToolTip(droplet.exp_name) self.droplet_dict[id(item)] = droplet self.setWindowTitle("Satellite | %s" % file_name) self.import_menu.setEnabled(True) open_action.triggered.connect(oef_open) # Import menu import_menu = file_menu.addMenu("&Import") self.import_menu = import_menu for importer_name in plug_dict.keys(): load_file_action = QtGui.QAction("&%s" % importer_name, self) import_menu.addAction(load_file_action) loader = ImportLoader(importer_name, self) load_file_action.triggered.connect(loader) loader.new_data_ready.connect(self.add_new_droplet) loader.log_message_signal.connect(self.status_bar_show_message) self.import_menu.setEnabled(False) # Quit menu self.menuquit = QtGui.QAction("&Quit", self, shortcut=QtGui.QKeySequence.Close, statusTip="Quit the Application", triggered=self.close) file_menu.addAction(self.menuquit) # Help menu help_menu = self.menuBar().addMenu("&Help") self.about_action = QtGui.QAction("About", self) self.about_action.triggered.connect(self.show_about) self.about_action.setStatusTip("about satellite") help_menu.addAction(self.about_action) #initialize associated QListWidget to the open storm core_storm_listwdgt = QtGui.QListWidget(self) core_storm_listwdgt.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) core_storm_listwdgt.setDragDropMode( QtGui.QAbstractItemView.InternalMove) core_storm_listwdgt.itemSelectionChanged.connect( self.core_storm_selection_change) core_storm_listwdgt.setSortingEnabled(True) core_storm_listwdgt.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) core_storm_listwdgt.customContextMenuRequested.connect(self.list_menu) split = QtGui.QSplitter() split.addWidget(core_storm_listwdgt) split.addWidget(self.view_tab) layout = QtGui.QHBoxLayout() layout.addWidget(split) central_widget = QtGui.QWidget() central_widget.setLayout(layout) self.setCentralWidget(central_widget) self.core_storm_listwdgt = core_storm_listwdgt self.droplet_dict = {} def list_menu(self, position): item = self.core_storm_listwdgt.itemAt(position) droplet = self.droplet_dict[id(item)] def show_pulse_pick(): self.ppfig = PulsesPickFig(droplet.raw_data, item.text()) self.ppfig.show() def show_tlp(): self.tlpfig = TlpFig(droplet.raw_data.tlp_curve, item.text(), droplet.raw_data.leak_evol) self.tlpfig.show() def show_leakage_ivs(): self.leakivsfig = LeakageIVsFig(droplet.raw_data.iv_leak, item.text()) self.leakivsfig.show() def show_leakage_pick(): self.lpfig = LeakagesPickFig(droplet.raw_data, item.text()) self.lpfig.show() def show_reporting(): def update_report(): droplet.analysis.spot_v = self.report_wind.new_spot droplet.analysis.fail_perc = self.report_wind.new_fail droplet.analysis.seuil = self.report_wind.new_seuil droplet.analysis.update_analysis() self.report_wind.view.view.reload() @QtCore.Slot(str) def save_report(save_name): droplet.analysis.save_analysis(save_name) #TODO should rename save_analysis by save def update_report_style(): droplet.analysis.css = self.report_wind.css_str droplet.analysis.update_style() self.report_wind.view.view.reload() #TODO something is wrong with this naming if not hasattr(droplet, "analysis"): droplet.analysis = RawTLPdataAnalysis(droplet) self.report_wind = ReportFrame(droplet.analysis.report.report_name) self.report_wind.c.value_changed.connect(update_report) self.report_wind.c.save_doc.connect(save_report) self.report_wind.css_change.value_changed.connect( update_report_style) self.report_wind.show() menu = QtGui.QMenu(self) #Set pulse picker in context menu pulse_pick_action = QtGui.QAction("Pulse pick tool", self) pulse_pick_action.triggered.connect(show_pulse_pick) pulse_pick_action.setEnabled(droplet.raw_data.has_transient_pulses) pulse_pick_action.setStatusTip( "Visualize transient data from selected TLP-data point(s)" if droplet.raw_data. has_transient_pulses else "Sorry, No transient data available") #Set tlp with leakage evolution in context menu tlp_action = QtGui.QAction("TLP with leakage", self) tlp_action.triggered.connect(show_tlp) tlp_action.setEnabled(droplet.raw_data.has_leakage_evolution) tlp_action.setStatusTip("Visualize TLP with leakage evolution" if droplet.raw_data.has_leakage_evolution else "Sorry, No leakage evolution data available") #Set leakage ivs in context menu leakage_ivs_action = QtGui.QAction("Leakage IVs", self) leakage_ivs_action.triggered.connect(show_leakage_ivs) leakage_ivs_action.setEnabled(droplet.raw_data.has_leakage_ivs) leakage_ivs_action.setStatusTip( "Visualize leakage IVs" if droplet.raw_data. has_leakage_ivs else "Sorry, No leakage IVs available") #Set leakage picker in context menu leakage_pick_action = QtGui.QAction("Leakage pick tool", self) leakage_pick_action.triggered.connect(show_leakage_pick) leakage_pick_action.setEnabled(droplet.raw_data.has_leakage_ivs) leakage_pick_action.setStatusTip( "Visualize leakage data from selected TLP-data point(s)" if droplet .raw_data.has_leakage_ivs else "Sorry, No leakage data available") #Set report tool in context menu report_action = QtGui.QAction("Reporting tool", self) report_action.triggered.connect(show_reporting) report_action.setStatusTip("Visualize report from selected TLP-data") menu.addAction(pulse_pick_action) menu.addAction(tlp_action) menu.addAction(leakage_ivs_action) menu.addAction(leakage_pick_action) menu.addAction(report_action) menu.exec_(self.core_storm_listwdgt.mapToGlobal(position)) def status_bar_show_message(self, message): self.statusBar().showMessage(message) def add_new_droplet(self, raw_data, importer): droplet = importer.load_in_droplet(raw_data, self.core_storm._h5file) self.core_storm.append(View(droplet)) item = QtGui.QListWidgetItem(droplet.exp_name, self.core_storm_listwdgt) item.setToolTip(droplet.raw_data.original_file_name) self.droplet_dict[id(item)] = droplet def core_storm_selection_change(self): items = self.core_storm_listwdgt.selectedItems() droplet_list = [] for item in items: droplet_list.append(self.droplet_dict[id(item)]) self.core_storm.overlay_raw_tlp(self.tlp_overlay.fig, experiment_list=tuple(droplet_list)) def show_about(self): import platform import thunderstorm from . import __version__ from . import qt versions = { 'satellite': __version__, 'thunderstorm': thunderstorm.__version__, 'python': platform.python_version(), # "2.7.3" 'bitness': platform.architecture()[0], # 64bits 'system': platform.system(), # Linux, Windows, ... 'qt': qt.QtCore.__version__, 'qt_api': qt.API_NAME, # PySide or PyQt4 'qt_api_ver': qt.__version__, } QtGui.QMessageBox.about( self, "About Satellite", """<a href="http://esdanalysistools.github.io/Satellite/"> <b>Satellite {satellite}</b></a> <p> Copyright © 2013 ESDAnalysisTools Development Team <br/>Licensed under the terms of the MIT License </p> <p>Satellite is a software dedicated to visualisation and analysis of TLP measurements. </p> <p> Created by David Trémouilles <br/>Developed and maintained by the <br/><a href="https://github.com/ESDAnalysisTools?tab=members"> ESDAnalysisTools Development Team</a> <br/>Many thanks to all Satellite beta-testers and regular users. <p>Data analysis and visualisation is powered by <a href="http://esdanalysistools.github.com/ThunderStorm/"> <b>Thunderstorm {thunderstorm}</b></a> </p><a href="https://github.com/ESDAnalysisTools/Satellite/issues"> Bug reports and feature requests.</a> <p> </p> <p>Python {python} ({bitness}) <br/>Qt {qt}, {qt_api} {qt_api_ver} <br/>on {system} </p> """.format(**versions))
class MainWin(QtGui.QMainWindow): # pylint: disable=R0904 def __init__(self, app): QtGui.QMainWindow.__init__(self) self.setWindowTitle("Satellite") icon = QtGui.QIcon() icon.addPixmap( QtGui.QPixmap( dirname(realpath(__file__)) + os.sep + 'satellite.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) app.setWindowIcon(icon) self.resize(800, 600) self.statusBar().showMessage("Welcome in Satellite !") self.view_tab = ViewTab() self.tlp_overlay = TLPOverlayFig() self.view_tab.addTab(self.tlp_overlay, "TLP") self.core_storm = None # pointer to single tlp and pulsepicker figure self.tlpfig = None # single tlp figure self.ppfig = None # single pulse picker figure self.leakivsfig = None # leakage IVs figure self.lpfig = None # leakage IV pulse pick file_menu = self.menuBar().addMenu("&File") #New oef file new_file_action = QtGui.QAction("&New", self) file_menu.addAction(new_file_action) def oef_new(): new_name = getsavefilename(self, "New oef file", './untitled.oef', "Open ESD Format (*.oef)")[0] if len(new_name) != 0: file_name = str(new_name) new_file = h5py.File(file_name, 'w') new_file.close() self.core_storm = Storm(file_name) self.core_storm_listwdgt.clear() self.droplet_dict = {} self.setWindowTitle("Satellite | %s" % file_name) self.import_menu.setEnabled(True) new_file_action.triggered.connect(oef_new) #Open oef file open_action = QtGui.QAction("&Open", self) file_menu.addAction(open_action) def oef_open(): file_name = getopenfilename( self, "Load oef file", '', 'Open ESD Format (*.oef)', )[0] if len(file_name) != 0: self.core_storm = Storm(str(file_name)) self.core_storm_listwdgt.clear() self.droplet_dict = {} for view in self.core_storm: droplet = view.experiment item = QtGui.QListWidgetItem(droplet.exp_name, self.core_storm_listwdgt) item.setToolTip(droplet.exp_name) self.droplet_dict[id(item)] = droplet self.setWindowTitle("Satellite | %s" % file_name) self.import_menu.setEnabled(True) open_action.triggered.connect(oef_open) # Import menu import_menu = file_menu.addMenu("&Import") self.import_menu = import_menu for importer_name in plug_dict.keys(): load_file_action = QtGui.QAction("&%s" % importer_name, self) import_menu.addAction(load_file_action) loader = ImportLoader(importer_name, self) load_file_action.triggered.connect(loader) loader.new_data_ready.connect(self.add_new_droplet) loader.log_message_signal.connect(self.status_bar_show_message) self.import_menu.setEnabled(False) # Quit menu self.menuquit = QtGui.QAction("&Quit", self, shortcut=QtGui.QKeySequence.Close, statusTip="Quit the Application", triggered=self.close) file_menu.addAction(self.menuquit) # Help menu help_menu = self.menuBar().addMenu("&Help") self.about_action = QtGui.QAction("About", self) self.about_action.triggered.connect(self.show_about) self.about_action.setStatusTip("about satellite") help_menu.addAction(self.about_action) #initialize associated QListWidget to the open storm core_storm_listwdgt = QtGui.QListWidget(self) core_storm_listwdgt.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) core_storm_listwdgt.setDragDropMode( QtGui.QAbstractItemView.InternalMove) core_storm_listwdgt.itemSelectionChanged.connect( self.core_storm_selection_change) core_storm_listwdgt.setSortingEnabled(True) core_storm_listwdgt.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) core_storm_listwdgt.customContextMenuRequested.connect(self.list_menu) split = QtGui.QSplitter() split.addWidget(core_storm_listwdgt) split.addWidget(self.view_tab) layout = QtGui.QHBoxLayout() layout.addWidget(split) central_widget = QtGui.QWidget() central_widget.setLayout(layout) self.setCentralWidget(central_widget) self.core_storm_listwdgt = core_storm_listwdgt self.droplet_dict = {} def list_menu(self, position): item = self.core_storm_listwdgt.itemAt(position) droplet = self.droplet_dict[id(item)] def show_pulse_pick(): self.ppfig = PulsesPickFig(droplet.raw_data, item.text()) self.ppfig.show() def show_tlp(): self.tlpfig = TlpFig(droplet.raw_data.tlp_curve, item.text(), droplet.raw_data.leak_evol) self.tlpfig.show() def show_leakage_ivs(): self.leakivsfig = LeakageIVsFig(droplet.raw_data.iv_leak, item.text()) self.leakivsfig.show() def show_leakage_pick(): self.lpfig = LeakagesPickFig(droplet.raw_data, item.text()) self.lpfig.show() def show_reporting(): def update_report(): droplet.analysis.spot_v = self.report_wind.new_spot droplet.analysis.fail_perc = self.report_wind.new_fail droplet.analysis.seuil = self.report_wind.new_seuil droplet.analysis.update_analysis() self.report_wind.view.view.reload() @QtCore.Slot(str) def save_report(save_name): droplet.analysis.save_analysis(save_name) #TODO should rename save_analysis by save def update_report_style(): droplet.analysis.css = self.report_wind.css_str droplet.analysis.update_style() self.report_wind.view.view.reload() #TODO something is wrong with this naming if not hasattr(droplet, "analysis"): droplet.analysis = RawTLPdataAnalysis(droplet) self.report_wind = ReportFrame(droplet.analysis.report.report_name) self.report_wind.c.value_changed.connect(update_report) self.report_wind.c.save_doc.connect(save_report) self.report_wind.css_change.value_changed.connect( update_report_style) self.report_wind.show() menu = QtGui.QMenu(self) #Set pulse picker in context menu pulse_pick_action = QtGui.QAction("Pulse pick tool", self) pulse_pick_action.triggered.connect(show_pulse_pick) pulse_pick_action.setEnabled(droplet.raw_data.has_transient_pulses) pulse_pick_action.setStatusTip( "Visualize transient data from selected TLP-data point(s)" if droplet.raw_data. has_transient_pulses else "Sorry, No transient data available") #Set tlp with leakage evolution in context menu tlp_action = QtGui.QAction("TLP with leakage", self) tlp_action.triggered.connect(show_tlp) tlp_action.setEnabled(droplet.raw_data.has_leakage_evolution) tlp_action.setStatusTip("Visualize TLP with leakage evolution" if droplet.raw_data.has_leakage_evolution else "Sorry, No leakage evolution data available") #Set leakage ivs in context menu leakage_ivs_action = QtGui.QAction("Leakage IVs", self) leakage_ivs_action.triggered.connect(show_leakage_ivs) leakage_ivs_action.setEnabled(droplet.raw_data.has_leakage_ivs) leakage_ivs_action.setStatusTip( "Visualize leakage IVs" if droplet.raw_data. has_leakage_ivs else "Sorry, No leakage IVs available") #Set leakage picker in context menu leakage_pick_action = QtGui.QAction("Leakage pick tool", self) leakage_pick_action.triggered.connect(show_leakage_pick) leakage_pick_action.setEnabled(droplet.raw_data.has_leakage_ivs) leakage_pick_action.setStatusTip( "Visualize leakage data from selected TLP-data point(s)" if droplet .raw_data.has_leakage_ivs else "Sorry, No leakage data available") #Set report tool in context menu report_action = QtGui.QAction("Reporting tool", self) report_action.triggered.connect(show_reporting) report_action.setStatusTip("Visualize report from selected TLP-data") menu.addAction(pulse_pick_action) menu.addAction(tlp_action) menu.addAction(leakage_ivs_action) menu.addAction(leakage_pick_action) menu.addAction(report_action) menu.exec_(self.core_storm_listwdgt.mapToGlobal(position)) def status_bar_show_message(self, message): self.statusBar().showMessage(message) def add_new_droplet(self, raw_data, importer): droplet = importer.load_in_droplet(raw_data, self.core_storm._h5file) self.core_storm.append(View(droplet)) item = QtGui.QListWidgetItem(droplet.exp_name, self.core_storm_listwdgt) item.setToolTip(droplet.raw_data.original_file_name) self.droplet_dict[id(item)] = droplet def core_storm_selection_change(self): items = self.core_storm_listwdgt.selectedItems() droplet_list = [] for item in items: droplet_list.append(self.droplet_dict[id(item)]) self.core_storm.overlay_raw_tlp(self.tlp_overlay.fig, experiment_list=tuple(droplet_list)) def show_about(self): about_str = ("Satellite\n\nversion:" + satellitelib.__version__ + "\n\nCopyright (c) 2013 David Tremouilles\n\n") about_str = (about_str + "Satellite is software dedicated to " + "view and analysis TLP measurements,") about_str = (about_str + "for further information please go on " + "http://code.google.com/p/esdanalysistools/") QtGui.QMessageBox.about(self, "About Satellite", about_str)
class MainWin(QtGui.QMainWindow): # pylint: disable=R0904 def __init__(self, app): QtGui.QMainWindow.__init__(self) self.setWindowTitle("Satellite") icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(dirname(realpath(__file__)) + os.sep + 'satellite.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) app.setWindowIcon(icon) self.resize(800, 600) self.statusBar().showMessage("Welcome in Satellite !") self.view_tab = ViewTab() self.tlp_overlay = TLPOverlayFig() self.view_tab.addTab(self.tlp_overlay, "TLP") self.core_storm = None # pointer to single tlp and pulsepicker figure self.tlpfig = None # single tlp figure self.ppfig = None # single pulse picker figure self.leakivsfig = None # leakage IVs figure self.lpfig = None # leakage IV pulse pick file_menu = self.menuBar().addMenu("&File") #New oef file new_file_action = QtGui.QAction("&New", self) file_menu.addAction(new_file_action) def oef_new(): new_name = getsavefilename( self, "New oef file", './untitled.oef', "Open ESD Format (*.oef)")[0] if len(new_name) != 0: file_name = str(new_name) new_file = h5py.File(file_name, 'w') new_file.close() self.core_storm = Storm(file_name) self.core_storm_listwdgt.clear() self.droplet_dict = {} self.setWindowTitle("Satellite | %s" % file_name) self.import_menu.setEnabled(True) new_file_action.triggered.connect(oef_new) #Open oef file open_action = QtGui.QAction("&Open", self) file_menu.addAction(open_action) def oef_open(): file_name = getopenfilename( self, "Load oef file", '', 'Open ESD Format (*.oef)',)[0] if len(file_name) != 0: self.core_storm = Storm(str(file_name)) self.core_storm_listwdgt.clear() self.droplet_dict = {} for view in self.core_storm: droplet = view.experiment item = QtGui.QListWidgetItem(droplet.exp_name, self.core_storm_listwdgt) item.setToolTip(droplet.exp_name) self.droplet_dict[id(item)] = droplet self.setWindowTitle("Satellite | %s" % file_name) self.import_menu.setEnabled(True) open_action.triggered.connect(oef_open) # Import menu import_menu = file_menu.addMenu("&Import") self.import_menu = import_menu for importer_name in plug_dict.keys(): load_file_action = QtGui.QAction("&%s" % importer_name, self) import_menu.addAction(load_file_action) loader = ImportLoader(importer_name, self) load_file_action.triggered.connect(loader) loader.new_data_ready.connect(self.add_new_droplet) loader.log_message_signal.connect(self.status_bar_show_message) self.import_menu.setEnabled(False) # Quit menu self.menuquit = QtGui.QAction("&Quit", self, shortcut=QtGui.QKeySequence.Close, statusTip="Quit the Application", triggered=self.close) file_menu.addAction(self.menuquit) # Help menu help_menu = self.menuBar().addMenu("&Help") self.about_action = QtGui.QAction("About", self) self.about_action.triggered.connect(self.show_about) self.about_action.setStatusTip("about satellite") help_menu.addAction(self.about_action) #initialize associated QListWidget to the open storm core_storm_listwdgt = QtGui.QListWidget(self) core_storm_listwdgt.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) core_storm_listwdgt.setDragDropMode( QtGui.QAbstractItemView.InternalMove) core_storm_listwdgt.itemSelectionChanged.connect( self.core_storm_selection_change) core_storm_listwdgt.setSortingEnabled(True) core_storm_listwdgt.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) core_storm_listwdgt.customContextMenuRequested.connect(self.list_menu) split = QtGui.QSplitter() split.addWidget(core_storm_listwdgt) split.addWidget(self.view_tab) layout = QtGui.QHBoxLayout() layout.addWidget(split) central_widget = QtGui.QWidget() central_widget.setLayout(layout) self.setCentralWidget(central_widget) self.core_storm_listwdgt = core_storm_listwdgt self.droplet_dict = {} def list_menu(self, position): item = self.core_storm_listwdgt.itemAt(position) droplet = self.droplet_dict[id(item)] def show_pulse_pick(): self.ppfig = PulsesPickFig(droplet.raw_data, item.text()) self.ppfig.show() def show_tlp(): self.tlpfig = TlpFig(droplet.raw_data.tlp_curve, item.text(), droplet.raw_data.leak_evol) self.tlpfig.show() def show_leakage_ivs(): self.leakivsfig = LeakageIVsFig(droplet.raw_data.iv_leak, item.text()) self.leakivsfig.show() def show_leakage_pick(): self.lpfig = LeakagesPickFig(droplet.raw_data, item.text()) self.lpfig.show() def show_reporting(): def update_report(): droplet.analysis.spot_v = self.report_wind.new_spot droplet.analysis.fail_perc = self.report_wind.new_fail droplet.analysis.seuil = self.report_wind.new_seuil droplet.analysis.update_analysis() self.report_wind.view.view.reload() @QtCore.Slot(str) def save_report(save_name): droplet.analysis.save_analysis(save_name) #TODO should rename save_analysis by save def update_report_style(): droplet.analysis.css = self.report_wind.css_str droplet.analysis.update_style() self.report_wind.view.view.reload() #TODO something is wrong with this naming if not hasattr(droplet, "analysis"): droplet.analysis = RawTLPdataAnalysis(droplet) self.report_wind = ReportFrame( droplet.analysis.report.report_name) self.report_wind.c.value_changed.connect(update_report) self.report_wind.c.save_doc.connect(save_report) self.report_wind.css_change.value_changed.connect( update_report_style) self.report_wind.show() menu = QtGui.QMenu(self) #Set pulse picker in context menu pulse_pick_action = QtGui.QAction("Pulse pick tool", self) pulse_pick_action.triggered.connect(show_pulse_pick) pulse_pick_action.setEnabled(droplet.raw_data.has_transient_pulses) pulse_pick_action.setStatusTip( "Visualize transient data from selected TLP-data point(s)" if droplet.raw_data.has_transient_pulses else "Sorry, No transient data available") #Set tlp with leakage evolution in context menu tlp_action = QtGui.QAction("TLP with leakage", self) tlp_action.triggered.connect(show_tlp) tlp_action.setEnabled(droplet.raw_data.has_leakage_evolution) tlp_action.setStatusTip( "Visualize TLP with leakage evolution" if droplet.raw_data.has_leakage_evolution else "Sorry, No leakage evolution data available") #Set leakage ivs in context menu leakage_ivs_action = QtGui.QAction("Leakage IVs", self) leakage_ivs_action.triggered.connect(show_leakage_ivs) leakage_ivs_action.setEnabled(droplet.raw_data.has_leakage_ivs) leakage_ivs_action.setStatusTip( "Visualize leakage IVs" if droplet.raw_data.has_leakage_ivs else "Sorry, No leakage IVs available") #Set leakage picker in context menu leakage_pick_action = QtGui.QAction("Leakage pick tool", self) leakage_pick_action.triggered.connect(show_leakage_pick) leakage_pick_action.setEnabled(droplet.raw_data.has_leakage_ivs) leakage_pick_action.setStatusTip( "Visualize leakage data from selected TLP-data point(s)" if droplet.raw_data.has_leakage_ivs else "Sorry, No leakage data available") #Set report tool in context menu report_action = QtGui.QAction("Reporting tool", self) report_action.triggered.connect(show_reporting) report_action.setStatusTip("Visualize report from selected TLP-data") menu.addAction(pulse_pick_action) menu.addAction(tlp_action) menu.addAction(leakage_ivs_action) menu.addAction(leakage_pick_action) menu.addAction(report_action) menu.exec_(self.core_storm_listwdgt.mapToGlobal(position)) def status_bar_show_message(self, message): self.statusBar().showMessage(message) def add_new_droplet(self, raw_data, importer): droplet = importer.load_in_droplet(raw_data, self.core_storm._h5file) self.core_storm.append(View(droplet)) item = QtGui.QListWidgetItem(droplet.exp_name, self.core_storm_listwdgt) item.setToolTip(droplet.raw_data.original_file_name) self.droplet_dict[id(item)] = droplet def core_storm_selection_change(self): items = self.core_storm_listwdgt.selectedItems() droplet_list = [] for item in items: droplet_list.append(self.droplet_dict[id(item)]) self.core_storm.overlay_raw_tlp(self.tlp_overlay.fig, experiment_list=tuple(droplet_list)) def show_about(self): about_str = ("Satellite\n\nversion:" + satellitelib.__version__ + "\n\nCopyright (c) 2013 David Tremouilles\n\n") about_str = (about_str + "Satellite is software dedicated to " + "view and analysis TLP measurements,") about_str = (about_str + "for further information please go on " + "http://code.google.com/p/esdanalysistools/") QtGui.QMessageBox.about(self, "About Satellite", about_str)