Esempio n. 1
0
    def setUp(self):
        super().setUp()

        plugin = ChannelStatisticPlugin()
        op = plugin.get_operation()

        op.name = "Count"
        op.channel = "Y2-A"
        op.statistic_name = "Count"
        op.by = ['Dox', 'Well']

        wi = WorkflowItem(operation=op)
        self.workflow.workflow.append(wi)

        plugin = TransformStatisticPlugin()
        self.op = op = plugin.get_operation()

        op.name = "Mean"
        op.statistic = ("Count", "Count")
        op.statistic_name = "Count"
        op.by = ["Dox"]
        op.subset_list.append(CategorySubset(name="Well", values=["A", "B"]))

        self.wi = wi = WorkflowItem(operation=op,
                                    status='waiting',
                                    view_error="Not yet plotted")
        self.workflow.workflow.append(wi)
        self.workflow.selected = wi

        self.workflow.wi_waitfor(wi, 'status', "valid")
Esempio n. 2
0
    def setUp(self):
        ImportedDataTest.setUp(self)

        plugin = ChannelStatisticPlugin()
        op = plugin.get_operation()

        op.name = "Count"
        op.channel = "Y2-A"
        op.statistic_name = "Count"
        op.by = ['Dox', 'Well']

        wi = WorkflowItem(operation=op)
        self.workflow.workflow.append(wi)
        self.assertTrue(wait_for(wi, 'status', lambda v: v == 'valid', 30))

        plugin = TransformStatisticPlugin()
        self.op = op = plugin.get_operation()

        op.name = "Mean"
        op.statistic = ("Count", "Count")
        op.statistic_name = "Count"
        op.by = ["Dox"]
        op.subset_list.append(CategorySubset(name="Well", values=["A", "B"]))

        self.wi = wi = WorkflowItem(operation=op)
        self.workflow.workflow.append(wi)
        self.workflow.selected = wi

        self.assertTrue(wait_for(wi, 'status', lambda v: v == 'valid', 30))
Esempio n. 3
0
    def setUp(self):
        ImportedDataTest.setUp(self)

        plugin = ChannelStatisticPlugin()

        op = plugin.get_operation()
        op.name = "MeanByDox"
        op.channel = "Y2-A"
        op.statistic_name = "Geom.SD"
        op.by = ['Dox']

        wi = WorkflowItem(operation=op)
        self.workflow.workflow.append(wi)

        op = plugin.get_operation()
        op.name = "MeanByDoxAndWell"
        op.channel = "Y2-A"
        op.statistic_name = "Geom.SD"
        op.by = ['Dox', 'Well']

        wi = WorkflowItem(operation=op)
        self.workflow.workflow.append(wi)

        op = plugin.get_operation()
        op.name = "MeanByDox"
        op.channel = "Y2-A"
        op.statistic_name = "Geom.Mean"
        op.by = ['Dox']

        self.wi = wi = WorkflowItem(operation=op)
        self.workflow.workflow.append(wi)

        op = plugin.get_operation()
        op.name = "MeanByDoxAndWell"
        op.channel = "Y2-A"
        op.statistic_name = "Geom.Mean"
        op.by = ['Dox', 'Well']

        self.wi = wi = WorkflowItem(operation=op)
        self.workflow.workflow.append(wi)

        self.workflow.selected = wi

        self.assertTrue(wait_for(wi, 'status', lambda v: v == 'valid', 10))

        plugin = TablePlugin()
        self.view = view = plugin.get_view()
        view.statistic = ("MeanByDox", "Geom.Mean")
        view.row_facet = "Dox"

        self.workflow.remote_exec("self.workflow[-1].view_error = 'waiting'")
        self.assertTrue(
            wait_for(self.wi, 'view_error', lambda v: v == "waiting", 30))

        wi.views.append(view)
        wi.current_view = view
        self.workflow.selected = wi

        self.assertTrue(wait_for(self.wi, 'view_error', lambda v: v == "", 30))
Esempio n. 4
0
    def setUp(self):
        super().setUp()

        stats_plugin = ChannelStatisticPlugin()

        stats_op_3 = stats_plugin.get_operation()
        stats_op_3.name = "MeanByDoxIP2"
        stats_op_3.channel = "B1-A"
        stats_op_3.statistic_name = "Geom.Mean"
        stats_op_3.by = ['Dox', 'IP']
        stats_op_3.subset_list.append(
            CategorySubset(name="Well", values=['A', 'B']))
        stats_op_3.subset_list.append(
            RangeSubset(name="Dox", values=[1.0, 10.0, 100.0]))
        stats_op_3.subset_list.append(
            RangeSubset(name="IP", values=[1.0, 10.0]))

        stats_wi_3 = WorkflowItem(operation=stats_op_3,
                                  status="waiting",
                                  view_error="Not yet plotted")
        self.workflow.workflow.append(stats_wi_3)
        self.workflow.wi_waitfor(stats_wi_3, 'status', 'valid')

        stats_op_4 = stats_plugin.get_operation()
        stats_op_4.name = "SDByDoxIP2"
        stats_op_4.channel = "B1-A"
        stats_op_4.statistic_name = "Geom.SD"
        stats_op_4.by = ['Dox', 'IP']
        stats_op_4.subset_list.append(
            CategorySubset(name="Well", values=['A', 'B']))
        stats_op_4.subset_list.append(
            RangeSubset(name="Dox", values=[1.0, 10.0, 100.0]))
        stats_op_4.subset_list.append(
            RangeSubset(name="IP", values=[1.0, 10.0]))

        stats_wi_4 = WorkflowItem(operation=stats_op_4,
                                  status="waiting",
                                  view_error="Not yet plotted")
        self.workflow.workflow.append(stats_wi_4)
        self.workflow.wi_waitfor(stats_wi_4, 'status', 'valid')

        self.wi = wi = self.workflow.workflow[-1]

        self.view = view = Stats2DWorkflowView()
        wi.views.append(view)
        wi.current_view = view

        super().setUpView()

        self.workflow.selected = wi
        self.workflow.wi_waitfor(self.wi, 'view_error', '')
Esempio n. 5
0
    def activated(self):
        # add the import op
        self.add_operation(ImportPlugin().id)
        self.model.selected = self.model.workflow[0]

        # if we're debugging, add a few data bits
        if self.debug:
            from cytoflow import Tube

            import_op = self.model.workflow[0].operation
            import_op.conditions["Dox"] = "float"
            import_op.conditions["Replicate"] = "int"

            tube1 = Tube(file="../cytoflow/tests/data/Plate01/CFP_Well_A4.fcs",
                         conditions={
                             "Dox": 0.0,
                             "Replicate": 1
                         })

            tube2 = Tube(file="../cytoflow/tests/data/Plate01/RFP_Well_A3.fcs",
                         conditions={
                             "Dox": 10.0,
                             "Replicate": 1
                         })

            tube3 = Tube(file="../cytoflow/tests/data/Plate01/CFP_Well_B4.fcs",
                         conditions={
                             "Dox": 0.0,
                             "Replicate": 2
                         })

            tube4 = Tube(file="../cytoflow/tests/data/Plate01/RFP_Well_A6.fcs",
                         conditions={
                             "Dox": 10.0,
                             "Replicate": 2
                         })

            import_op.tubes = [tube1, tube2, tube3, tube4]

            self.add_operation(ChannelStatisticPlugin().id)
            stat_op = self.model.workflow[1].operation
            stat_op.name = "Test"
            stat_op.channel = "Y2-A"
            stat_op.statistic_name = "Geom.Mean"
            stat_op.by = ["Dox", "Replicate"]
            self.model.selected = self.model.workflow[1]

        self.model.modified = False
Esempio n. 6
0
    def setUp(self):
        ImportedDataTest.setUp(self)

        plugin = ChannelStatisticPlugin()

        op = plugin.get_operation()
        op.name = "MeanByDox"
        op.channel = "Y2-A"
        op.statistic_name = "Geom.SD"
        op.by = ['Dox', 'Well']

        wi = WorkflowItem(operation=op)
        self.workflow.workflow.append(wi)

        op = plugin.get_operation()
        op.name = "MeanByDox"
        op.channel = "Y2-A"
        op.statistic_name = "Geom.Mean"
        op.by = ['Dox', 'Well']
        op.subset_list.append(CategorySubset(name="Well", values=["A", "B"]))

        self.wi = wi = WorkflowItem(operation=op)
        self.workflow.workflow.append(wi)
        self.workflow.selected = wi

        self.assertTrue(wait_for(wi, 'status', lambda v: v == 'valid', 10))

        plugin = Stats1DPlugin()
        self.view = view = plugin.get_view()
        view.statistic = ("MeanByDox", "Geom.Mean")
        view.variable = "Dox"
        view.huefacet = "Well"

        self.workflow.remote_exec("self.workflow[-1].view_error = 'waiting'")
        self.assertTrue(
            wait_for(self.wi, 'view_error', lambda v: v == "waiting", 5))

        wi.views.append(view)
        wi.current_view = view
        self.workflow.selected = wi

        self.assertTrue(wait_for(self.wi, 'view_error', lambda v: v == "", 5))
Esempio n. 7
0
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()
Esempio n. 8
0
    def setUp(self):
        super().setUp()

        import_plugin = ImportPlugin()
        import_op = import_plugin.get_operation()

        from cytoflow import Tube

        import_op.conditions = {
            "Dox": "float",
            "IP": "float",
            "Well": "category"
        }

        self.cwd = os.path.dirname(os.path.abspath(__file__))

        tube1 = Tube(file=self.cwd +
                     "/../../cytoflow/tests/data/Plate01/CFP_Well_A4.fcs",
                     conditions={
                         "Dox": 1.0,
                         "IP": 1.0,
                         "Well": 'A'
                     })

        tube2 = Tube(file=self.cwd +
                     "/../../cytoflow/tests/data/Plate01/RFP_Well_A3.fcs",
                     conditions={
                         "Dox": 1.0,
                         "IP": 10.0,
                         "Well": 'B'
                     })

        tube3 = Tube(file=self.cwd +
                     "/../../cytoflow/tests/data/Plate01/YFP_Well_A7.fcs",
                     conditions={
                         "Dox": 10.0,
                         "IP": 1.0,
                         "Well": 'A'
                     })

        tube4 = Tube(file=self.cwd +
                     "/../../cytoflow/tests/data/Plate01/CFP_Well_B4.fcs",
                     conditions={
                         "Dox": 10.0,
                         "IP": 10.0,
                         "Well": 'B'
                     })

        tube5 = Tube(file=self.cwd +
                     "/../../cytoflow/tests/data/Plate01/RFP_Well_A6.fcs",
                     conditions={
                         "Dox": 100.0,
                         "IP": 1.0,
                         "Well": 'A'
                     })

        tube6 = Tube(file=self.cwd +
                     "/../../cytoflow/tests/data/Plate01/YFP_Well_C7.fcs",
                     conditions={
                         "Dox": 100.0,
                         "IP": 100.0,
                         "Well": 'B'
                     })

        import_op.tubes = [tube1, tube2, tube3, tube4, tube5, tube6]

        wi = WorkflowItem(operation=import_op,
                          status="waiting",
                          view_error="Not yet plotted")
        self.workflow.workflow.append(wi)

        import_op.do_estimate = True
        self.workflow.wi_waitfor(wi, 'status', 'valid')
        self.assertTrue(
            self.workflow.remote_eval("self.workflow[0].result is not None"))

        stats_plugin = ChannelStatisticPlugin()

        stats_op_1 = stats_plugin.get_operation()
        stats_op_1.name = "MeanByDoxIP"
        stats_op_1.channel = "Y2-A"
        stats_op_1.statistic_name = "Geom.Mean"
        stats_op_1.by = ['Dox', 'IP']
        stats_op_1.subset_list.append(
            CategorySubset(name="Well", values=['A', 'B']))
        stats_op_1.subset_list.append(
            RangeSubset(name="Dox", values=[1.0, 10.0, 100.0]))
        stats_op_1.subset_list.append(
            RangeSubset(name="IP", values=[1.0, 10.0]))

        stats_wi_1 = WorkflowItem(operation=stats_op_1,
                                  status="waiting",
                                  view_error="Not yet plotted")
        self.workflow.workflow.append(stats_wi_1)
        self.workflow.wi_waitfor(stats_wi_1, 'status', 'valid')

        stats_op_2 = stats_plugin.get_operation()
        stats_op_2.name = "SDByDoxIP"
        stats_op_2.channel = "Y2-A"
        stats_op_2.statistic_name = "Geom.SD"
        stats_op_2.by = ['Dox', 'IP']
        stats_op_2.subset_list.append(
            CategorySubset(name="Well", values=['A', 'B']))
        stats_op_2.subset_list.append(
            RangeSubset(name="Dox", values=[1.0, 10.0, 100.0]))
        stats_op_2.subset_list.append(
            RangeSubset(name="IP", values=[1.0, 10.0]))

        stats_wi_2 = WorkflowItem(operation=stats_op_2,
                                  status="waiting",
                                  view_error="Not yet plotted")
        self.workflow.workflow.append(stats_wi_2)
        self.workflow.selected = stats_wi_2
        self.workflow.wi_waitfor(stats_wi_2, 'status', 'valid')
Esempio n. 9
0
    def setUp(self):
        super().setUp()

        plugin = ChannelStatisticPlugin()
        
        op = plugin.get_operation()
        op.name = "MeanByDox"
        op.channel = "Y2-A"
        op.statistic_name = "Geom.SD"
        op.by = ['Dox']

        wi = WorkflowItem(operation = op,
                          status = 'waiting',
                          view_error = "Not yet plotted")        
        self.workflow.workflow.append(wi)
        
        op = plugin.get_operation()
        op.name = "MeanByDoxAndWell"
        op.channel = "Y2-A"
        op.statistic_name = "Geom.SD"
        op.by = ['Dox', 'Well']

        wi = WorkflowItem(operation = op,
                          status = 'waiting',
                          view_error = "Not yet plotted")        
        self.workflow.workflow.append(wi)
        
        op = plugin.get_operation()
        op.name = "MeanByDox"
        op.channel = "Y2-A"
        op.statistic_name = "Geom.Mean"
        op.by = ['Dox']
                
        wi = WorkflowItem(operation = op,
                          status = 'waiting',
                          view_error = "Not yet plotted")        
        self.workflow.workflow.append(wi)
        
        op = plugin.get_operation()
        op.name = "MeanByDoxAndWell"
        op.channel = "Y2-A"
        op.statistic_name = "Geom.Mean"
        op.by = ['Dox', 'Well']
                
        self.wi = wi = WorkflowItem(operation = op,
                                    status = 'waiting',
                                    view_error = "Not yet plotted")        
        self.workflow.workflow.append(wi)
        
        self.workflow.selected = wi

        self.workflow.wi_waitfor(wi, 'status', "valid")
        
        plugin = TablePlugin()
        self.view = view = plugin.get_view()
        view.statistic = ("MeanByDox", "Geom.Mean")
        view.row_facet = "Dox"
        
        self.workflow.wi_sync(self.wi, 'view_error', 'waiting')
  
        wi.views.append(view)
        wi.current_view = view
        self.workflow.selected = wi
        
        self.workflow.wi_waitfor(self.wi, 'view_error', '')
Esempio n. 10
0
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()
Esempio n. 11
0
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()