Source code for cytoflowgui.experiment_pane_model

#!/usr/bin/env python3.8
# coding: latin-1

# (c) Massachusetts Institute of Technology 2015-2018
# (c) Brian Teague 2018-2022
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

"""
cytoflowgui.experiment_pane_model
--------------------------------

The classes that provide the model for the `ExperimentBrowserDockPane`.
"""

from traits.api import Instance, Str, Tuple
from traitsui.api import TreeEditor, TreeNodeObject, ObjectTreeNode

from .workflow import WorkflowItem


[docs]class WorkflowItemNode(TreeNodeObject): """A tree node for the Experiment""" wi = Instance(WorkflowItem) label = 'WorkflowItem'
[docs] def tno_get_label(self, _): return self.label
[docs] def tno_allows_children(self, node): return True
[docs] def tno_has_children(self, node): return True
[docs] def tno_get_menu(self, _): return False
[docs] def tno_get_children(self, _): return [ChannelsNode(wi = self.wi), ConditionsNode(wi = self.wi), StatisticsNode(wi = self.wi)]
[docs]class ChannelsNode(TreeNodeObject): """A tree node for the group of channels""" wi = Instance(WorkflowItem) label = "Channels"
[docs] def tno_get_label(self, node): return self.label
[docs] def tno_allows_children(self, node): return True
[docs] def tno_has_children(self, node): return True
[docs] def tno_get_menu(self, _): return False
[docs] def tno_get_icon(self, node, is_expanded): return "@icons:list_node"
[docs] def tno_get_children(self, _): return [ChannelNode(wi = self.wi, channel = x) for x in self.wi.channels]
[docs]class ChannelNode(TreeNodeObject): """A tree node for a single channel""" wi = Instance(WorkflowItem) """The `WorkflowItem` that this channel is part of""" channel = Str()
[docs] def tno_get_label(self, _): return self.channel
[docs] def tno_allows_children(self, _): return True
[docs] def tno_has_children(self, _): return True
[docs] def tno_get_menu(self, _): return False
[docs] def tno_get_icon(self, node, is_expanded): return "@icons:int_node"
[docs] def tno_get_children(self, _): return [StringNode(name = k, value = str(self.wi.metadata[self.channel][k])) for k in self.wi.metadata[self.channel].keys()]
[docs]class ConditionsNode(TreeNodeObject): """A tree node for all the conditions""" wi = Instance(WorkflowItem) label = "Conditions"
[docs] def tno_get_label(self, _): return self.label
[docs] def tno_allows_children(self, node): return True
[docs] def tno_has_children(self, node): return True
[docs] def tno_get_menu(self, _): return False
[docs] def tno_get_icon(self, node, is_expanded): return "@icons:set_node"
[docs] def tno_get_children(self, _): return [ConditionNode(wi = self.wi, condition = x) for x in self.wi.conditions.keys()]
[docs]class ConditionNode(TreeNodeObject): """A tree node for a single condition""" wi = Instance(WorkflowItem) """The `WorkflowItem` that this condition is part of""" condition = Str()
[docs] def tno_get_label(self, _): return self.condition
[docs] def tno_allows_children(self, _): return True
[docs] def tno_has_children(self, _): return True
[docs] def tno_get_menu(self, _): return False
[docs] def tno_get_icon(self, node, is_expanded): return "@icons:string_node"
[docs] def tno_get_children(self, _): # condition = self.wi.conditions[self.condition] # values = condition.sort_values() # dtype = pd.Series(list(values)).dtype # if dtype.kind == 'b': # ret = [StringNode(name = 'Type', # value = 'boolean')] # elif dtype.kind in "ifu": # ret = [StringNode(name = 'Type', # value = 'numeric'), # StringNode(name = 'Values', # value = ', '.join([str(x) for x in values]))] # elif dtype.kind in "OSU": # ret = [StringNode(name = 'Type', # value = 'categorical'), # StringNode(name = 'Values', # value = ', '.join(values))] return [StringNode(name = k, value = str(self.wi.metadata[self.condition][k])) for k in self.wi.metadata[self.condition].keys()]
[docs]class StatisticsNode(TreeNodeObject): """A tree node for all the statistics""" wi = Instance(WorkflowItem) label = "Statistics"
[docs] def tno_get_label(self, _): return self.label
[docs] def tno_allows_children(self, node): return True
[docs] def tno_has_children(self, node): return True
[docs] def tno_get_menu(self, _): return False
[docs] def tno_get_icon(self, node, is_expanded): return "@icons:dict_node"
[docs] def tno_get_children(self, _): return [StatisticNode(wi = self.wi, statistic = x) for x in self.wi.statistics.keys()]
[docs]class StatisticNode(TreeNodeObject): """A tree node for a single statistic""" wi = Instance(WorkflowItem) """The `WorkflowItem` that this condition is part of""" statistic = Tuple()
[docs] def tno_get_label(self, _): return str(self.statistic)
[docs] def tno_allows_children(self, _): return True
[docs] def tno_has_children(self, _): return True
[docs] def tno_get_menu(self, _): return False
[docs] def tno_get_icon(self, node, is_expanded): return "@icons:other_node"
[docs] def tno_get_children(self, _): statistic = self.wi.statistics[self.statistic] ret = [StringNode(name = 'Operation', value = self.statistic[0]), StringNode(name = 'Name', value = self.statistic[1])] if statistic.index.nlevels == 1: ret.append(StringNode(name = 'Facet Name', value = str(statistic.index.names[0]))) ret.append(StringNode(name = 'Facet Levels', value = ", ".join([str(x) for x in statistic.index.values]))) else: for i, name in enumerate(statistic.index.names): ret.append(StringNode(name = 'Facet ' + str(i), value = name)) ret.append(StringNode(name = 'Facet ' + str(i) + ' Levels', value = ', '.join([str(x) for x in statistic.index.levels[i]]))) return ret
[docs]class StringNode(TreeNodeObject): """ A tree node for strings """ #: Name of the value name = Str() #: User-specified override of the default label label = Str() #: The value itself value = Str()
[docs] def tno_allows_children(self, node): return False
[docs] def tno_has_children(self, node): return False
[docs] def tno_get_menu(self, _): return False
[docs] def tno_get_icon(self, node, is_expanded): return "@icons:complex_node"
[docs] def tno_get_label(self, node): """ Gets the label to display for a specified object. """ if self.label != "": return self.label if self.name == "": return self.format_value(self.value) return "%s: %s" % (self.name, self.format_value(self.value))
[docs] def format_value(self, value): """ Returns the formatted version of the value. """ return repr(value)
experiment_tree_editor = TreeEditor( editable = False, auto_open = 2, hide_root = True, lines_mode = "off", nodes = [ ObjectTreeNode( node_for = [ WorkflowItemNode, ChannelsNode, ChannelNode, ConditionsNode, ConditionNode, StatisticsNode, StatisticNode, StringNode ], rename = False, rename_me = False, copy = False, delete = False, delete_me = False)])