def run_gui(): logging.basicConfig(level=logging.DEBUG) debug = ("--debug" in sys.argv) plugins = [ CorePlugin(), TasksPlugin(), FlowTaskPlugin(debug=debug), ImportPlugin(), ThresholdPlugin(), HistogramPlugin(), HexbinPlugin(), ScatterplotPlugin(), RangePlugin(), Range2DPlugin(), PolygonPlugin(), BarChartPlugin(), Stats1DPlugin(), BinningPlugin() ] app = CytoflowApplication(id='edu.mit.synbio.cytoflow', plugins=plugins) app.run() logging.shutdown()
def __init__(self): plugins = [ CorePlugin(), TasksPlugin(), DummyExtensionPluginWithDataView() ] super(DummyWfManagerWithPlugins, self).__init__(plugins=plugins)
def __init__(self): plugins = [ CorePlugin(), TasksPlugin(), DummyUIPlugin(), DummyUIPluginOld() ] super(DummyUIWfManager, self).__init__(plugins=plugins)
def __init__(self, filename=None): plugins = [CorePlugin(), TasksPlugin(), ProbeWfManagerPlugin(filename)] super(ProbeWfManager, self).__init__(plugins=plugins) # 'Run' the application by creating windows without an event loop self.run = self._create_windows
def __init__(self): plugins = [CorePlugin(), TasksPlugin(), ProbePyFibreGUIPlugin()] super(ProbePyFibreGUI, self).__init__(plugins=plugins) # 'Run' the application by creating windows # without an event loop self.run = self._create_windows
def main(argv): """ Run the application. """ logging.basicConfig(level=logging.WARNING) plugins = [CorePlugin(), TasksPlugin(), AttractorsPlugin()] app = AttractorsApplication(plugins=plugins) app.run() logging.shutdown()
def launch(): root = logging.getLogger() root.setLevel(logging.DEBUG) shandler = logging.StreamHandler() shandler.setLevel(logging.DEBUG) root.addHandler(shandler) plugins = [CorePlugin(), TasksPlugin(), WellpyPlugin()] app = WellpyApplication(plugins=plugins) app.run()
def test_contributes_service(self): plugins = [ CorePlugin(), TasksPlugin(), FactoryRegistryPlugin(), WfManagerPlugin(workflow_file=None), ExampleCustomUIPlugin() ] wfmanager = WfManager(plugins=plugins) wfmanager.plugin_manager.start() self.assertEqual(len(wfmanager.get_services(IContributedUI)), 2) self.assertEqual(len(wfmanager.get_services(IDataView)), 2)
def main(workflow_file, debug, window_size, profile): """Launches the FORCE workflow manager application""" if debug is False: logging.basicConfig(filename="force_wfmanager.log", filemode="w") else: logging.basicConfig(filename="force_wfmanager.log", filemode="w", level=logging.DEBUG) if profile: import cProfile import pstats profiler = cProfile.Profile() profiler.enable() log = logging.getLogger(__name__) plugins = [ CorePlugin(), TasksPlugin(), FactoryRegistryPlugin(), WfManagerPlugin(workflow_file=workflow_file) ] mgr = extension.ExtensionManager(namespace='force.bdss.extensions', invoke_on_load=True) def import_extensions(ext): log.info("Found extension {}".format(ext.name)) plugins.append(ext.obj) try: mgr.map(import_extensions) except NoMatches: log.info("No extensions found") wfmanager = WfManager(plugins=plugins, window_size=window_size) wfmanager.run() if profile: profiler.disable() from sys import version_info fname = 'force_wfmanager-{}-{}.{}.{}'.format(__version__, version_info.major, version_info.minor, version_info.micro) profiler.dump_stats(fname + '.prof') with open(fname + '.pstats', 'w') as fp: stats = pstats.Stats(profiler, stream=fp).sort_stats('cumulative') stats.print_stats()
def run(debug, profile, log_name): if debug: logging.basicConfig(filename=f"{log_name}.log", filemode="w", level=logging.DEBUG) else: logging.basicConfig(filename=f"{log_name}.log", filemode="w", level=logging.INFO) logger = logging.getLogger(__name__) if profile: import cProfile import pstats profiler = cProfile.Profile() profiler.enable() logger.info(logo(__version__)) plugins = [CorePyFibrePlugin(), TasksPlugin(), PyFibreGUIPlugin()] plugins += load_plugins() pyfibre_gui = PyFibreGUI(plugins=plugins) pyfibre_gui.run() if profile: profiler.disable() from sys import version_info fname = 'pyfibre-{}-{}.{}.{}'.format(__version__, version_info.major, version_info.minor, version_info.micro) profiler.dump_stats(fname + '.prof') with open(fname + '.pstats', 'w') as fp: stats = pstats.Stats(profiler, stream=fp).sort_stats('cumulative') stats.print_stats()
self._create_windows() kernel = self.get_service(IPYTHON_KERNEL_PROTOCOL) kernel.init_ipkernel('qt4') app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app, QtCore.SLOT("quit()")) app.aboutToQuit.connect(kernel.cleanup_consoles) gui.set_trait_later(self, 'application_initialized', self) kernel.ipkernel.start() return started def _application_initialized_fired(self): logger.info('APPLICATION INITIALIZED') if __name__ == '__main__': import logging logging.basicConfig(level=logging.DEBUG) app = ExampleApplication(plugins=[ CorePlugin(), ExamplePlugin(), IPythonKernelPlugin(), IPythonKernelUIPlugin(), TasksPlugin(), ]) app.run()
def run_gui(): debug = ("--debug" in sys.argv) remote_process, remote_connection = start_remote_process(debug) import matplotlib # We want matplotlib to use our backend matplotlib.use('module://cytoflowgui.matplotlib_backend') # getting real tired of the matplotlib deprecation warnings import warnings warnings.filterwarnings('ignore', '.*is deprecated and replaced with.*') from traits.api import push_exception_handler def QtMsgHandler(msg_type, msg_string): # Convert Qt msg type to logging level log_level = [ logging.DEBUG, logging.WARN, logging.ERROR, logging.FATAL ][int(msg_type)] logging.log(log_level, 'Qt message: ' + msg_string.decode('utf-8')) ## monkey-patch envisage for a py3k bug. this is fixed in envisage HEAD, ## so check for version import envisage if envisage.__version__ == '4.6.0': import pickle from envisage.ui.tasks.tasks_application import TasksApplication, TasksApplicationState logger = logging.getLogger(__name__) logger.info("Monkey-patching envisage 4.6.0") def _envisage_load_state(self): """ Loads saved application state, if possible. """ state = TasksApplicationState() filename = os.path.join(self.state_location, 'application_memento') if os.path.exists(filename): # Attempt to unpickle the saved application state. try: with open(filename, 'rb') as f: restored_state = pickle.load(f) if state.version == restored_state.version: state = restored_state else: logger.warn('Discarding outdated application layout') except: # If anything goes wrong, log the error and continue. logger.exception('Restoring application layout from %s', filename) self._state = state def _envisage_save_state(self): """ Saves the application state. """ # Grab the current window layouts. window_layouts = [w.get_window_layout() for w in self.windows] self._state.previous_window_layouts = window_layouts # Attempt to pickle the application state. filename = os.path.join(self.state_location, 'application_memento') try: with open(filename, 'wb') as f: pickle.dump(self._state, f) except: # If anything goes wrong, log the error and continue. logger.exception('Saving application layout') TasksApplication._load_state = _envisage_load_state TasksApplication._save_state = _envisage_save_state from envisage.core_plugin import CorePlugin from envisage.ui.tasks.tasks_plugin import TasksPlugin from pyface.image_resource import ImageResource from cytoflowgui.flow_task import FlowTaskPlugin from cytoflowgui.cytoflow_application import CytoflowApplication from cytoflowgui.op_plugins import ( ImportPlugin, ThresholdPlugin, RangePlugin, QuadPlugin, Range2DPlugin, PolygonPlugin, BinningPlugin, GaussianMixture1DPlugin, GaussianMixture2DPlugin, BleedthroughLinearPlugin, #BleedthroughPiecewisePlugin, BeadCalibrationPlugin, AutofluorescencePlugin, ColorTranslationPlugin, TasbePlugin, ChannelStatisticPlugin, TransformStatisticPlugin, RatioPlugin) from cytoflowgui.view_plugins import ( HistogramPlugin, Histogram2DPlugin, ScatterplotPlugin, BarChartPlugin, Stats1DPlugin, Kde1DPlugin, #Kde2DPlugin, ViolinPlotPlugin, TablePlugin, Stats2DPlugin) # assert(multiprocessing.get_start_method() == "spawn") from cytoflow.utility.custom_traits import Removed, Deprecated Removed.gui = True Deprecated.gui = True from pyface.qt import qt_api cmd_line = " ".join(sys.argv) if qt_api == "pyside": print("Cytoflow uses PyQT; but it is trying to use PySide instead.") print(" - Make sure PyQT is installed.") print( " - If both are installed, and you don't need both, uninstall PySide." ) print(" - If you must have both installed, select PyQT by setting the") print(" environment variable QT_API to \"pyqt\"") print(" * eg, on Linux, type on the command line:") print(" QT_API=\"pyqt\" " + cmd_line) print(" * on Windows, try: ") print(" setx QT_API \"pyqt\"") sys.exit(1) from pyface.qt.QtCore import qInstallMsgHandler qInstallMsgHandler(QtMsgHandler) # if we're frozen, add _MEIPASS to the pyface search path for icons etc if getattr(sys, 'frozen', False): from pyface.resource_manager import resource_manager resource_manager.extra_paths.append(sys._MEIPASS) # @UndefinedVariable # install a global (gui) error handler for traits notifications push_exception_handler(handler=log_notification_handler, reraise_exceptions=debug, main=True) sys.excepthook = log_excepthook plugins = [ CorePlugin(), TasksPlugin(), FlowTaskPlugin(debug=debug, remote_connection=remote_connection) ] # reverse of the order on the toolbar view_plugins = [ TablePlugin(), Stats2DPlugin(), Stats1DPlugin(), BarChartPlugin(), ViolinPlotPlugin(), # Kde2DPlugin(), # disabled until we can make it faster Kde1DPlugin(), Histogram2DPlugin(), ScatterplotPlugin(), HistogramPlugin() ] plugins.extend(view_plugins) op_plugins = [ RatioPlugin(), TransformStatisticPlugin(), ChannelStatisticPlugin(), TasbePlugin(), ColorTranslationPlugin(), AutofluorescencePlugin(), BeadCalibrationPlugin(), # BleedthroughPiecewisePlugin(), BleedthroughLinearPlugin(), GaussianMixture2DPlugin(), GaussianMixture1DPlugin(), BinningPlugin(), PolygonPlugin(), QuadPlugin(), Range2DPlugin(), RangePlugin(), ThresholdPlugin(), ImportPlugin() ] plugins.extend(op_plugins) # these two lines stop pkg_resources from trying to load resources # from the __main__ module, which is frozen (and thus not loadable.) icon = ImageResource('icon') icon.search_path = [] app = CytoflowApplication(id='edu.mit.synbio.cytoflow', plugins=plugins, icon=icon, debug=debug) app.run() remote_process.join() logging.shutdown()
def run_gui(): debug = ("--debug" in sys.argv) remote_process, remote_connection = start_remote_process() # We want matplotlib to use our backend .... in both the GUI and the # remote process import matplotlib matplotlib.use('module://cytoflowgui.matplotlib_backend') # getting real tired of the matplotlib deprecation warnings import warnings warnings.filterwarnings('ignore', '.*is deprecated and replaced with.*') from traits.api import push_exception_handler def QtMsgHandler(msg_type, msg_string): # Convert Qt msg type to logging level log_level = [ logging.DEBUG, logging.WARN, logging.ERROR, logging.FATAL ][int(msg_type)] logging.log(log_level, 'Qt message: ' + msg_string.decode('utf-8')) from envisage.core_plugin import CorePlugin from envisage.ui.tasks.tasks_plugin import TasksPlugin from pyface.image_resource import ImageResource from cytoflowgui.flow_task import FlowTaskPlugin from cytoflowgui.tasbe_task import TASBETaskPlugin from cytoflowgui.export_task import ExportFigurePlugin from cytoflowgui.cytoflow_application import CytoflowApplication from cytoflowgui.op_plugins import ( ImportPlugin, ThresholdPlugin, RangePlugin, QuadPlugin, Range2DPlugin, PolygonPlugin, BinningPlugin, GaussianMixture1DPlugin, GaussianMixture2DPlugin, BleedthroughLinearPlugin, BleedthroughPiecewisePlugin, BeadCalibrationPlugin, AutofluorescencePlugin, ColorTranslationPlugin, TasbePlugin, ChannelStatisticPlugin, TransformStatisticPlugin, RatioPlugin, DensityGatePlugin, FlowPeaksPlugin, KMeansPlugin, PCAPlugin) from cytoflowgui.view_plugins import ( HistogramPlugin, Histogram2DPlugin, ScatterplotPlugin, BarChartPlugin, Stats1DPlugin, Kde1DPlugin, Kde2DPlugin, ViolinPlotPlugin, TablePlugin, Stats2DPlugin, DensityPlugin, ParallelCoordinatesPlugin, RadvizPlugin) from cytoflow.utility.custom_traits import Removed, Deprecated Removed.gui = True Deprecated.gui = True from pyface.qt import qt_api cmd_line = " ".join(sys.argv) if qt_api == "pyside": print("Cytoflow uses PyQT; but it is trying to use PySide instead.") print(" - Make sure PyQT is installed.") print( " - If both are installed, and you don't need both, uninstall PySide." ) print(" - If you must have both installed, select PyQT by setting the") print(" environment variable QT_API to \"pyqt\"") print(" * eg, on Linux, type on the command line:") print(" QT_API=\"pyqt\" " + cmd_line) print(" * on Windows, try: ") print(" setx QT_API \"pyqt\"") sys.exit(1) from pyface.qt.QtCore import qInstallMsgHandler # @UnresolvedImport qInstallMsgHandler(QtMsgHandler) # if we're frozen, add _MEIPASS to the pyface search path for icons etc if getattr(sys, 'frozen', False): from pyface.resource_manager import resource_manager resource_manager.extra_paths.append(sys._MEIPASS) # @UndefinedVariable # install a global (gui) error handler for traits notifications push_exception_handler(handler=log_notification_handler, reraise_exceptions=False, main=True) sys.excepthook = log_excepthook plugins = [ CorePlugin(), TasksPlugin(), FlowTaskPlugin(), TASBETaskPlugin(), ExportFigurePlugin() ] # reverse of the order on the toolbar view_plugins = [ TablePlugin(), Stats2DPlugin(), Stats1DPlugin(), BarChartPlugin(), ViolinPlotPlugin(), Kde2DPlugin(), RadvizPlugin(), ParallelCoordinatesPlugin(), Kde1DPlugin(), DensityPlugin(), Histogram2DPlugin(), ScatterplotPlugin(), HistogramPlugin() ] plugins.extend(view_plugins) op_plugins = [ RatioPlugin(), PCAPlugin(), KMeansPlugin(), FlowPeaksPlugin(), DensityGatePlugin(), TransformStatisticPlugin(), ChannelStatisticPlugin(), TasbePlugin(), ColorTranslationPlugin(), AutofluorescencePlugin(), BeadCalibrationPlugin(), # BleedthroughPiecewisePlugin(), BleedthroughLinearPlugin(), GaussianMixture2DPlugin(), GaussianMixture1DPlugin(), BinningPlugin(), PolygonPlugin(), QuadPlugin(), Range2DPlugin(), RangePlugin(), ThresholdPlugin(), ImportPlugin() ] plugins.extend(op_plugins) # these two lines stop pkg_resources from trying to load resources # from the __main__ module, which is frozen (and thus not loadable.) icon = ImageResource('icon') icon.search_path = [] app = CytoflowApplication(id='edu.mit.synbio.cytoflow', plugins=plugins, icon=icon, remote_connection=remote_connection, debug=debug) app.run() remote_process.join() logging.shutdown()
def main(argv): plugins = [CorePlugin(), TasksPlugin(), PikosPlugin()] app = PikosApplication(plugins) app.run()
# Create windows from the default or saved application layout. self._create_windows() kernel = self.get_service(IPYTHON_KERNEL_PROTOCOL) kernel.init_ipkernel('qt4') app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app, QtCore.SLOT("quit()")) app.aboutToQuit.connect(kernel.cleanup_consoles) gui.set_trait_later(self, 'application_initialized', self) kernel.ipkernel.start() return started def _application_initialized_fired(self): logger.info('APPLICATION INITIALIZED') if __name__ == '__main__': import logging logging.basicConfig(level=logging.DEBUG) app = ExampleApplication( plugins=[ CorePlugin(), ExamplePlugin(), IPythonKernelPlugin(), IPythonKernelUIPlugin(), TasksPlugin(), ] ) app.run()
def run_gui(): import os, sys try: # if we're running as a one-click from a MacOS app, # we need to reset the working directory os.chdir(sys._MEIPASS) except: # if we're not running as a one-click, fail gracefully pass # take care of the 3 places in the cytoflow module that # need different behavior in a GUI import cytoflow cytoflow.RUNNING_IN_GUI = True # this is ridiculous, but here's the situation. Qt5 now uses Chromium # as their web renderer. Chromium needs OpenGL. if you don't # initialize OpoenGL here, things crash on some platforms. # so now i guess we depend on opengl too. from OpenGL import GL # @UnresolvedImport @UnusedImport # check that we're using the right Qt API from pyface.qt import qt_api cmd_line = " ".join(sys.argv) if qt_api == "pyside": print("Cytoflow uses PyQT; but it is trying to use PySide instead.") print(" - Make sure PyQT is installed.") print( " - If both are installed, and you don't need both, uninstall PySide." ) print(" - If you must have both installed, select PyQT by setting the") print(" environment variable QT_API to \"pyqt5\"") print(" * eg, on Linux, type on the command line:") print(" QT_API=\"pyqt5\" " + cmd_line) print(" * on Windows, try: ") print(" setx QT_API \"pyqt5\"") sys.exit(1) # parse args parser = argparse.ArgumentParser(description='Cytoflow GUI') parser.add_argument("--debug", action='store_true') parser.add_argument("filename", nargs='?', default="") args = parser.parse_args() # start the remote process remote_process, remote_connection, queue_listener = start_remote_process() # getting real tired of the matplotlib deprecation warnings import warnings warnings.filterwarnings('ignore', '.*is deprecated and replaced with.*') # if we're frozen, add _MEIPASS to the pyface search path for icons etc if getattr(sys, 'frozen', False): from pyface.resource_manager import resource_manager resource_manager.extra_paths.append(sys._MEIPASS) # @UndefinedVariable # these three lines stop pkg_resources from trying to load resources # from the __main__ module, which is frozen (and thus not loadable.) from pyface.image_resource import ImageResource icon = ImageResource('icon') icon.search_path = [] # monkey patch the resource manager to use SVGs for icons import pyface.resource.resource_manager pyface.resource.resource_manager.ResourceManager.IMAGE_EXTENSIONS.append( '.svg') # monkey patch checklist editor to stop lowercasing import traitsui.qt4.check_list_editor # @UnusedImport traitsui.qt4.check_list_editor.capitalize = lambda s: s # define and install a message handler for Qt errors from traits.api import push_exception_handler def QtMsgHandler(msg_type, msg_context, msg_string): # Convert Qt msg type to logging level log_level = [ logging.DEBUG, logging.WARN, logging.ERROR, logging.FATAL ][int(msg_type)] logging.log(log_level, 'Qt message: ' + msg_string) from pyface.qt.QtCore import qInstallMessageHandler # @UnresolvedImport qInstallMessageHandler(QtMsgHandler) # install a global (gui) error handler for traits notifications push_exception_handler(handler=log_notification_handler, reraise_exceptions=False, main=True) sys.excepthook = log_excepthook # Import, then load, the envisage plugins from envisage.core_plugin import CorePlugin from envisage.ui.tasks.tasks_plugin import TasksPlugin from cytoflowgui.flow_task import FlowTaskPlugin from cytoflowgui.tasbe_task import TASBETaskPlugin from cytoflowgui.export_task import ExportFigurePlugin from cytoflowgui.cytoflow_application import CytoflowApplication from cytoflowgui.op_plugins import ( ImportPlugin, ThresholdPlugin, RangePlugin, QuadPlugin, Range2DPlugin, PolygonPlugin, BinningPlugin, GaussianMixture1DPlugin, GaussianMixture2DPlugin, BleedthroughLinearPlugin, BeadCalibrationPlugin, AutofluorescencePlugin, ColorTranslationPlugin, TasbePlugin, ChannelStatisticPlugin, TransformStatisticPlugin, RatioPlugin, DensityGatePlugin, FlowPeaksPlugin, KMeansPlugin, PCAPlugin) from cytoflowgui.view_plugins import ( HistogramPlugin, Histogram2DPlugin, ScatterplotPlugin, BarChartPlugin, Stats1DPlugin, Kde1DPlugin, Kde2DPlugin, ViolinPlotPlugin, TablePlugin, Stats2DPlugin, DensityPlugin, ParallelCoordinatesPlugin, RadvizPlugin) plugins = [ CorePlugin(), TasksPlugin(), FlowTaskPlugin(), TASBETaskPlugin(), ExportFigurePlugin() ] # ordered as we want them to show up in the toolbar view_plugins = [ HistogramPlugin(), ScatterplotPlugin(), Histogram2DPlugin(), DensityPlugin(), Kde1DPlugin(), Kde2DPlugin(), RadvizPlugin(), ParallelCoordinatesPlugin(), ViolinPlotPlugin(), BarChartPlugin(), Stats1DPlugin(), Stats2DPlugin(), TablePlugin() ] plugins.extend(view_plugins) op_plugins = [ ImportPlugin(), ThresholdPlugin(), RangePlugin(), QuadPlugin(), Range2DPlugin(), PolygonPlugin(), RatioPlugin(), ChannelStatisticPlugin(), TransformStatisticPlugin(), BinningPlugin(), GaussianMixture1DPlugin(), GaussianMixture2DPlugin(), DensityGatePlugin(), KMeansPlugin(), FlowPeaksPlugin(), PCAPlugin(), AutofluorescencePlugin(), BleedthroughLinearPlugin(), BeadCalibrationPlugin(), ColorTranslationPlugin(), TasbePlugin() ] plugins.extend(op_plugins) # start the app app = CytoflowApplication(id='edu.mit.synbio.cytoflow', plugins=plugins, icon=icon, remote_process=remote_process, remote_connection=remote_connection, filename=args.filename, debug=args.debug) from pyface.qt import QtGui QtGui.QApplication.instance().setStyle( QtGui.QStyleFactory.create('Fusion')) app.run() remote_process.join() queue_listener.stop() logging.shutdown()
def run_gui(): multiprocessing.freeze_support() from pyface.qt import qt_api if qt_api == "pyside": print "Cytoflow uses PyQT; but it is trying to use PySide instead." print " - Make sure PyQT is installed." print " - If both are installed, and you don't need both, uninstall PySide." print " - If you must have both installed, select PyQT by setting the" print " environment variable QT_API to \"pyqt\"" print " * eg, on Linux, type on the command line:" print " QT_API=\"pyqt\" python run.py" print " * on Windows, try: " print " setx QT_API \"pyqt\"" sys.exit(1) remote_connection = start_remote_process() from pyface.qt.QtCore import qInstallMsgHandler qInstallMsgHandler(QtMsgHandler) # if we're frozen, add _MEIPASS to the pyface search path for icons etc if getattr(sys, 'frozen', False): from pyface.resource_manager import resource_manager resource_manager.extra_paths.append(sys._MEIPASS) # @UndefinedVariable global debug debug = ("--debug" in sys.argv) # install a global (gui) error handler for traits notifications push_exception_handler(handler=log_notification_handler, reraise_exceptions=debug, main=True) sys.excepthook = log_excepthook plugins = [ CorePlugin(), TasksPlugin(), FlowTaskPlugin(debug=debug, remote_connection=remote_connection) ] # reverse of the order on the toolbar view_plugins = [ TablePlugin(), Stats2DPlugin(), Stats1DPlugin(), BarChartPlugin(), ViolinPlotPlugin(), Kde2DPlugin(), Kde1DPlugin(), Histogram2DPlugin(), ScatterplotPlugin(), HistogramPlugin() ] plugins.extend(view_plugins) op_plugins = [ RatioPlugin(), TransformStatisticPlugin(), ChannelStatisticPlugin(), TasbePlugin(), ColorTranslationPlugin(), AutofluorescencePlugin(), BeadCalibrationPlugin(), BleedthroughPiecewisePlugin(), BleedthroughLinearPlugin(), GaussianMixture2DPlugin(), GaussianMixture1DPlugin(), BinningPlugin(), PolygonPlugin(), QuadPlugin(), Range2DPlugin(), RangePlugin(), ThresholdPlugin(), ImportPlugin() ] plugins.extend(op_plugins) app = CytoflowApplication(id='edu.mit.synbio.cytoflow', plugins=plugins, icon=ImageResource('icon'), debug=debug) app.run() logging.shutdown()