diff --git a/cviewer/action/load_cff.py b/cviewer/action/load_cff.py index f86d3f1..ffc2a69 100644 --- a/cviewer/action/load_cff.py +++ b/cviewer/action/load_cff.py @@ -32,19 +32,20 @@ class OpenFile(Action): path = Str("MenuBar/File/LoadDataMenu") image = ImageResource("cff-open.png", search_path=[IMAGE_PATH]) - # Is the action enabled? + # Is the action enabled? enabled = Bool(True) - # Is the action visible? + # Is the action visible? visible = Bool(True) - ########################################################################### - # 'Action' interface. - ########################################################################### + ########################################################################### + # 'Action' interface. + ########################################################################### + def perform(self, event, cfile=None): """ Performs the action. """ - logger.info('Performing open connectome file action') + logger.info('Performing add data file action') # helper variable to use this function not only in the menubar exec_as_funct = True @@ -55,20 +56,22 @@ def perform(self, event, cfile=None): cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') exec_as_funct = False - wildcard = "All files (*.*)|*.*" \ + wildcard = "All files (*.*)|*.*|" \ + 'All files (*)|*|' \ "Nifti-1 (*.nii.gz)|*.nii.gz|" \ "Gifti (*.gii)|*.gii|" \ "TrackVis tracks (*.trk)|*.trk|" \ - "Network Pickle (*.gpickle)|*.gpickle|" \ - "Network GraphML (*.graphml)|*.graphml|" \ + "NetworkX Pickle (*.gpickle)|*.gpickle|" \ + "NetworkX Pickle (*.pck)|*.pck|" \ + "NetworkX GraphML (*.graphml)|*.graphml|" \ "Numpy Data (*.npy)|*.npy|" \ "Pickle Data (*.pkl)|*.pkl|" \ "Text Data (*.txt)|*.txt|" \ - "CSV Data (*.csv)|*.csv|" + "CSV Data (*.csv)|*.csv" - dlg = FileDialog(wildcard=wildcard,title="Choose a file",\ + dlg = FileDialog(wildcard=wildcard,title="Add Neuroimaging or network data",\ resizeable=False, \ - default_directory=preference_manager.cviewerui.cffpath,) + default_directory=preference_manager.cviewerui.cffpath) if dlg.open() == OK: @@ -90,20 +93,20 @@ def perform(self, event, cfile=None): name = fname, gii_filename = dlg.paths[0]) cfile.obj.add_connectome_surface(csurf) - elif os.path.exists(dlg.paths[0]) and fname.endswith('.trk'): + elif os.path.exists(dlg.paths[0]) and (dlg.paths[0]).endswith('.trk'): ctrk = cfflib.CTrack( name = fname, src = dlg.paths[0]) cfile.obj.add_connectome_track(ctrk) - elif os.path.exists(dlg.paths[0]) and fname.endswith('.gpickle'): - ctrk = cfflib.CNetwork(name = fname, src = dlg.paths[0], + elif os.path.exists(dlg.paths[0]) and (fname.endswith('.gpickle') or fname.endswith('.pck')): + cntwk = cfflib.CNetwork(name = fname, src = dlg.paths[0], fileformat="NXGPickle") - cfile.obj.add_connectome_network(ctrk) + cfile.obj.add_connectome_network(cntwk) elif os.path.exists(dlg.paths[0]) and fname.endswith('.graphml'): - ctrk = cfflib.CNetwork.create_from_graphml(name = fname, + cntwk = cfflib.CNetwork.create_from_graphml(name = fname, ml_filename = dlg.paths[0]) - cfile.obj.add_connectome_network(ctrk) + cfile.obj.add_connectome_network(cntwk) elif os.path.exists(dlg.paths[0]) and fname.endswith('.npy'): cdat = cfflib.CData(name = fname, src = dlg.paths[0], @@ -155,49 +158,49 @@ class OpenCFile(Action): def perform(self, event, cfile=None): """ Performs the action. """ - + logger.info('Performing open connectome file action') - + # helper variable to use this function not only in the menubar exec_as_funct = True - + if cfile is None: # get the instance of the current CFile # with the help of the Service Registry cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') exec_as_funct = False - wildcard = "Connectome Markup File v2.0 (meta.cml)|meta.cml|" \ - "Connectome File Format v2.0 (*.cff)|*.cff|" \ - "All files (*.*)|*.*" + wildcard = "Connectome File Format v2.0 (*.cff)|*.cff|" \ + "Connectome Markup File v2.0 (meta.cml)|meta.cml|" \ + "All files (*.*)|*.*" + dlg = FileDialog(wildcard=wildcard,title="Choose a Connectome File",\ resizeable=False, \ - default_directory=preference_manager.cviewerui.cffpath,) + default_directory=preference_manager.cviewerui.cffpath) if dlg.open() == OK: - + if not os.path.isfile(dlg.path): logger.error("File '%s' does not exist!"%dlg.path) return - + # if file exists and has .cff ending if os.path.exists(dlg.paths[0]) and (dlg.paths[0]).endswith('.cff'): - + # close the cfile if one is currently loaded cfile.close_cfile() - + # load cfile data cfile.load_cfile(dlg.paths[0]) - + self.window.status_bar_manager.message='' elif os.path.exists(dlg.paths[0]) and (dlg.paths[0]).endswith('meta.cml'): cfile.close_cfile() cfile.load_cfile(dlg.paths[0], ismetacml = True) - else: logger.info('Could not load file: '+ dlg.paths) - - + + class SaveCFile(Action): """ An action that save aconnectome file """ diff --git a/cviewer/plugins/codeoracle/actions.py b/cviewer/plugins/codeoracle/actions.py index 47bffb6..7a52430 100644 --- a/cviewer/plugins/codeoracle/actions.py +++ b/cviewer/plugins/codeoracle/actions.py @@ -11,8 +11,416 @@ # Logging imports import logging logger = logging.getLogger('root.'+__name__) +from nipype.interfaces.base import isdefined +from interfaces import (plot_nodes, plot_edges, plot_surfaces, +plot_labels_by_phrase, plot_labels_by_degree, plot_volumes, create_rotation_frames) +class PlotTracks(Action): + tooltip = "Plots tracks using Dipy's FVTK module" + description = "Plots tracks using Dipy's FVTK module" + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + from ctrack_action import TrackParameter + import nibabel as nb, nibabel.trackvis as trk + from dipy.viz import fvtk + import numpy as np + cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') + so = TrackParameter(cfile) + choices = False + if not len(so.tracks.keys()) == 1: + choices = True + if choices: + so.edit_traits(kind='livemodal') + track_name = so.tracks[so.tracks.keys()[0]]['name'] + if not track_name == "None": + tracks, header = cfile.obj.get_by_name(track_name).data + tmpname = '/tmp/' + track_name + '.trk' + trk.write(tmpname, tracks, header) + del tracks + tracks, hdr = trk.read(tmpname, True, None) + streams_fixed = ((ii[0]) for ii in tracks) + #streams = list(streams_fixed) + streams = streams_fixed + r=fvtk.ren() + for stream in streams: + fvtk.add(r, fvtk.line(stream, fvtk.blue, opacity=0.2, linewidth=2) ) + fvtk.show(r, title = "Fibers", size = (500,500)) + +class ShowHideNetworkName(Action): + tooltip = "Show/Hide Network Name" + description = "Show/Hide Network Name" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + + from mayavi import mlab + cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') + currentfig = mlab.gcf() + figure_title = currentfig.name + #network = no.netw[no.graph]['name'] + #graph = cfile.obj.get_by_name(network).data + x = 0.02 + y = 0.02 + width = 0.3 + text = figure_title + mlab.text(x,y,text,width=width) + +class ShowHideNodeLegend(Action): + tooltip = "Show/Hide Node Legend" + description = "Show/Hide Node Legend" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + from mayavi import mlab + cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') + mlab.scalarbar(orientation='horizontal') + + +class ShowHideEdgeLegend(Action): + tooltip = "Show/Hide Edge Legend" + description = "Show/Hide Edge Legend" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + + from mayavi import mlab + cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') + mlab.scalarbar(orientation='vertical') + +class PlotVolume(Action): + """ Open a new file in the text editor + """ + tooltip = "Plot Volume" + description = "Plot Volume" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + + from cvolume_action import VolumeParameter + cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') + import nibabel as nb + from mayavi import mlab + currentfig = mlab.gcf() + figure_title = currentfig.name + + so = VolumeParameter(cfile) + choices = False + if not len(so.volumes.keys()) == 1: + choices = True + if choices: + so.edit_traits(kind='livemodal') + + volume_name = so.volumes[so.volume]['name'] + if not volume_name == "None": + volume = cfile.obj.get_by_name(volume_name).data + tmpname = '/tmp/' + volume_name + '.nii' + nb.save(volume, tmpname) + if isdefined(figure_title): + mlab.figure(figure_title) + else: + mlab.figure(tmpname) + plot_volumes(tmpname) + +class NewFigure(Action): + tooltip = "New Figure" + description = "New Figure" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + + from mayavi import mlab + mlab.figure() + +class ClearFigure(Action): + tooltip = "Clear Figure" + description = "Clear Figure" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + + from mayavi import mlab + mlab.clf() + +class PlotSurface(Action): + """ Open a new file in the text editor + """ + tooltip = "Plot Surface" + description = "Plot Surface" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + + from csurface_action import SurfaceFileParameter + cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') + import nibabel.gifti as gifti + from mayavi import mlab + currentfig = mlab.gcf() + figure_title = currentfig.name + + so = SurfaceFileParameter(cfile) + choices = False + if not len(so.surface_da.keys()) == 1: + choices = True + if choices: + so.edit_traits(kind='livemodal') + surface_name = so.surface_da[so.surface]['name'] + label_name = so.labels_da[so.labels]['name'] + if not surface_name == "None": + surface = cfile.obj.get_by_name(surface_name).data + tmpname = '/tmp/' + surface_name + '.gii' + gifti.write(surface, tmpname) + if isdefined(figure_title): + mlab.figure(figure_title) + else: + mlab.figure(tmpname) + + if not label_name == "None": + labels = cfile.obj.get_by_name(label_name).data + tmplabelname = '/tmp/' + label_name + '.gii' + gifti.write(labels, tmplabelname) + plot_surfaces(tmpname, tmplabelname) + else: + plot_surfaces(tmpname) + + +class PlotLabelsByDegree(Action): + tooltip = "Plot labels by degree" + description = "Plots node labels for nodes with the specified degree (e.g. 3)" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + from cnetwork_action import NodeLabelByDegreeParameter + cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') + from mayavi import mlab + currentfig = mlab.gcf() + figure_title = currentfig.name + + no = NodeLabelByDegreeParameter(cfile) + choices = False + if len(no.netw.keys()) == 1: + for key in no.netw[no.netw.keys()[0]].keys(): + options = no.netw[no.netw.keys()[0]][key] + if isinstance(options, str): + options = [options] + if not len(options) == 1: + choices = True + break + else: + choices = True + if choices: + no.edit_traits(kind='livemodal') + if not no.netw[no.graph]['name'] == "None": + import tempfile + import networkx as nx + + myf = tempfile.mktemp(suffix='.py', prefix='my') + network = no.netw[no.graph]['name'] + graph = cfile.obj.get_by_name(network).data + tmpname = '/tmp/' + network + '.pck' + nx.write_gpickle(graph, tmpname) + node_position = no.node_position + node_label_key = no.node_label + degree = no.degree + + if isdefined(figure_title): + mlab.figure(figure_title) + else: + mlab.figure(tmpname) + plot_labels_by_degree(tmpname, degree, node_position, node_label_key) + +class PlotNetwork(Action): + tooltip = "Plot Network" + description = "Plots nodes and edges from a selected network" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + from cnetwork_action import NoLabelNetworkParameter + cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') + from mayavi import mlab + currentfig = mlab.gcf() + figure_title = currentfig.name + + no = NoLabelNetworkParameter(cfile) + choices = False + if len(no.netw.keys()) == 1: + for key in no.netw[no.netw.keys()[0]].keys(): + options = no.netw[no.netw.keys()[0]][key] + if isinstance(options, str): + options = [options] + if not len(options) == 1: + choices = True + break + else: + choices = True + if choices: + no.edit_traits(kind='livemodal') + if not no.netw[no.graph]['name'] == "None": + import tempfile + import networkx as nx + + myf = tempfile.mktemp(suffix='.py', prefix='my') + network = no.netw[no.graph]['name'] + graph = cfile.obj.get_by_name(network).data + tmpname = '/tmp/' + network + '.pck' + nx.write_gpickle(graph, tmpname) + node_position = no.node_position + edge_key = no.edge_value + + if isdefined(figure_title): + mlab.figure(figure_title) + else: + mlab.figure(tmpname) + plot_edges(tmpname, node_position, edge_key) + plot_nodes(tmpname, node_position, scalar_key='value') + +class PlotEdges(Action): + tooltip = "Plot edges" + description = "Plots edges from a selected network" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + from cnetwork_action import EdgeParameter + cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') + from mayavi import mlab + currentfig = mlab.gcf() + figure_title = currentfig.name + + no = EdgeParameter(cfile) + choices = False + if len(no.netw.keys()) == 1: + for key in no.netw[no.netw.keys()[0]].keys(): + options = no.netw[no.netw.keys()[0]][key] + if isinstance(options, str): + options = [options] + if not len(options) == 1: + choices = True + break + else: + choices = True + if choices: + no.edit_traits(kind='livemodal') + + if not no.netw[no.graph]['name'] == "None": + import tempfile + import networkx as nx + + myf = tempfile.mktemp(suffix='.py', prefix='my') + network = no.netw[no.graph]['name'] + graph = cfile.obj.get_by_name(network).data + tmpname = '/tmp/' + network + '.pck' + nx.write_gpickle(graph, tmpname) + node_position = no.node_position + edge_key = no.edge_value + + if isdefined(figure_title): + mlab.figure(figure_title) + else: + mlab.figure(tmpname) + plot_edges(tmpname, node_position, edge_key) + + +class PlotLabelsByPhrase(Action): + tooltip = "Plot labels" + description = "Plots node labels that contain the entered text (e.g. occipital)" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + from cnetwork_action import NodeLabelByPhraseParameter + cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') + from mayavi import mlab + currentfig = mlab.gcf() + figure_title = currentfig.name + + no = NodeLabelByPhraseParameter(cfile) + no.edit_traits(kind='livemodal') + + if not no.netw[no.graph]['name'] == "None": + import tempfile + import networkx as nx + + myf = tempfile.mktemp(suffix='.py', prefix='my') + network = no.netw[no.graph]['name'] + graph = cfile.obj.get_by_name(network).data + tmpname = '/tmp/' + network + '.pck' + nx.write_gpickle(graph, tmpname) + node_position = no.node_position + node_label_key = no.node_label + phrase = no.phrase + + if isdefined(figure_title): + mlab.figure(figure_title) + else: + mlab.figure(in_file) + plot_labels_by_phrase(tmpname, phrase, node_position, node_label_key) + +class PlotNodes(Action): + tooltip = "Plot Nodes" + description = "Plots nodes from a selected network" + + # The WorkbenchWindow the action is attached to. + window = Any() + + def perform(self, event=None): + from cnetwork_action import NodeParameter + cfile = self.window.application.get_service('cviewer.plugins.cff2.cfile.CFile') + from mayavi import mlab + currentfig = mlab.gcf() + figure_title = currentfig.name + + no = NodeParameter(cfile) + choices = False + if len(no.netw.keys()) == 1: + for key in no.netw[no.netw.keys()[0]].keys(): + options = no.netw[no.netw.keys()[0]][key] + if isinstance(options, str): + options = [options] + if not len(options) == 1: + choices = True + break + else: + choices = True + if choices: + no.edit_traits(kind='livemodal') + + if not no.netw[no.graph]['name'] == "None": + import tempfile + import networkx as nx + myf = tempfile.mktemp(suffix='.py', prefix='my') + network = no.netw[no.graph]['name'] + graph = cfile.obj.get_by_name(network).data + tmpname = '/tmp/' + network + '.pck' + nx.write_gpickle(graph, tmpname) + node_position = no.node_position + if isdefined(figure_title): + mlab.figure(figure_title) + else: + mlab.figure(in_file) + plot_nodes(tmpname, node_position, scalar_key='value') class NetworkVizTubes(Action): tooltip = "Show 3D Network with Tubes" diff --git a/cviewer/plugins/codeoracle/cnetwork_action.py b/cviewer/plugins/codeoracle/cnetwork_action.py index e7cd237..ebca7e0 100644 --- a/cviewer/plugins/codeoracle/cnetwork_action.py +++ b/cviewer/plugins/codeoracle/cnetwork_action.py @@ -91,10 +91,7 @@ def __init__(self, cfile, **traits): class NetworkParameter(HasTraits): - engine = Enum("Mayavi", ["Mayavi"]) - view = View( - Item('engine', label = "Engine"), Item('graph', label = "Graph"), Item('node_position', label = "Node Positions"), Item('edge_value', label="Edge Value"), @@ -161,4 +158,373 @@ def __init__(self, cfile, **traits): self.add_trait('edge_value', Enum(self.netw[firstk]['ev']) ) self.add_trait('node_label', Enum(self.netw[firstk]['lab']) ) +class NodeParameter(HasTraits): + + view = View( + Item('graph', label = "Graph"), + Item('node_position', label = "Node Positions"), + id='cviewer.plugins.codeoracle.nodeparameter', + buttons=['OK'], + resizable=True, + title = "Plot Nodes" + ) + + def _graph_changed(self, value): + self.remove_trait("node_position") + self.add_trait('node_position', Enum(self.netw[value]['pos']) ) + + def __init__(self, cfile, **traits): + super(NodeParameter, self).__init__(**traits) + + self.netw = {} + + for cobj in cfile.connectome_network: + if cobj.loaded: + if isinstance(cobj, CNetwork): + # add more info + a=cobj.obj.data.nodes_iter(data=True) + n, dn = a.next() + npos = [] + lab = [] + for k in dn.keys(): + if 'position' in k or 'pos' in k or 'location' in k: + npos.append(k) + if len(npos) == 0: + npos = ["None"] + + self.netw[cobj.name] = {'name' : cobj.obj.name, 'pos' : npos} + + if len(self.netw) == 0: + self.netw["None"] = {'name' : "None", 'pos' : "None"} + + self.add_trait('graph', Enum(self.netw.keys()) ) + firstk = self.netw.keys()[0] + self.add_trait('node_position', Enum(self.netw[firstk]['pos']) ) + +class NodeLabelByPhraseParameter(HasTraits): + + view = View( + Item('graph', label = "Graph"), + Item('node_position', label = "Node Positions"), + Item('node_label', label="Node Label"), + Item('phrase', label="Phrase"), + id='cviewer.plugins.codeoracle.networkparameter', + buttons=['OK'], + resizable=True, + title = "Plot Nodes" + ) + + def _graph_changed(self, value): + self.remove_trait("node_position") + self.remove_trait("edge_value") + self.remove_trait("node_label") + self.add_trait('node_position', Enum(self.netw[value]['pos']) ) + # fixme: does not update the edge value (e.g. when none) + self.add_trait('edge_value', Enum(self.netw[value]['ev']) ) + self.add_trait('node_label', Enum(self.netw[value]['lab']) ) + self.add_trait('phrase', Str() ) + + def __init__(self, cfile, **traits): + super(NodeLabelByPhraseParameter, self).__init__(**traits) + + self.netw = {} + + for cobj in cfile.connectome_network: + if cobj.loaded: + if isinstance(cobj, CNetwork): + # add more info + a=cobj.obj.data.nodes_iter(data=True) + n, dn = a.next() + npos = [] + lab = [] + for k in dn.keys(): + if 'position' in k or 'pos' in k or 'location' in k: + npos.append(k) + if 'name' in k or 'label' in k: + lab.append(k) + if len(npos) == 0: + npos = ["None"] + if len(lab) == 0: + lab = ["None"] + + a=cobj.obj.data.edges_iter(data=True) + if len(cobj.obj.data.edges()) == 0: + ev = ["None"] + else: + e1, e2, de = a.next() + ev = [] + for k in de.keys(): + if isinstance(de[k], float) or isinstance(de[k], int): + ev.append(k) + if len(ev) == 0: + ev = ["None"] + + self.netw[cobj.name] = {'name' : cobj.obj.name, + 'ev' : ev, 'pos' : npos, 'lab' : lab} + + if len(self.netw) == 0: + self.netw["None"] = {'name' : "None", 'ev' : "None", 'pos' : "None", 'lab' : "None"} + + self.add_trait('graph', Enum(self.netw.keys()) ) + firstk = self.netw.keys()[0] + self.add_trait('node_position', Enum(self.netw[firstk]['pos']) ) + self.add_trait('edge_value', Enum(self.netw[firstk]['ev']) ) + self.add_trait('node_label', Enum(self.netw[firstk]['lab']) ) + self.add_trait('phrase', Str() ) + +class EdgeParameter(HasTraits): + + view = View( + Item('graph', label = "Graph"), + Item('node_position', label = "Node Positions"), + Item('edge_value', label="Edge Value"), + id='cviewer.plugins.codeoracle.edgeparameter', + buttons=['OK'], + resizable=True, + title = "Plot edges" + ) + + def _graph_changed(self, value): + self.remove_trait("node_position") + self.remove_trait("edge_value") + self.add_trait('node_position', Enum(self.netw[value]['pos']) ) + self.add_trait('edge_value', Enum(self.netw[value]['ev']) ) + + + def __init__(self, cfile, **traits): + super(EdgeParameter, self).__init__(**traits) + + self.netw = {} + for cobj in cfile.connectome_network: + if cobj.loaded: + if isinstance(cobj, CNetwork): + # add more info + a=cobj.obj.data.nodes_iter(data=True) + n, dn = a.next() + npos = [] + lab = [] + for k in dn.keys(): + if 'position' in k or 'pos' in k or 'location' in k: + npos.append(k) + if len(npos) == 0: + npos = ["None"] + if len(lab) == 0: + lab = ["None"] + + a=cobj.obj.data.edges_iter(data=True) + if len(cobj.obj.data.edges()) == 0: + ev = ["None"] + else: + e1, e2, de = a.next() + ev = [] + for k in de.keys(): + if isinstance(de[k], float) or isinstance(de[k], int): + ev.append(k) + if len(ev) == 0: + ev = ["None"] + + self.netw[cobj.name] = {'name' : cobj.obj.name, + 'ev' : ev, 'pos' : npos} + + if len(self.netw) == 0: + self.netw["None"] = {'name' : "None", 'ev' : "None", 'pos' : "None"} + + self.add_trait('graph', Enum(self.netw.keys()) ) + firstk = self.netw.keys()[0] + self.add_trait('node_position', Enum(self.netw[firstk]['pos']) ) + self.add_trait('edge_value', Enum(self.netw[firstk]['ev']) ) + +class NodeLabelByDegreeParameter(HasTraits): + + view = View( + Item('graph', label = "Graph"), + Item('node_position', label = "Node Positions"), + Item('node_label', label="Node Label"), + Item('degree', label="Minimum Degree"), + id='cviewer.plugins.codeoracle.networkparameter', + buttons=['OK'], + resizable=True, + title = "Plot Nodes" + ) + + def _graph_changed(self, value): + self.remove_trait("node_position") + self.remove_trait("edge_value") + self.remove_trait("node_label") + self.add_trait('node_position', Enum(self.netw[value]['pos']) ) + # fixme: does not update the edge value (e.g. when none) + self.add_trait('edge_value', Enum(self.netw[value]['ev']) ) + self.add_trait('node_label', Enum(self.netw[value]['lab']) ) + self.add_trait('degree', Int() ) + + def __init__(self, cfile, **traits): + super(NodeLabelByDegreeParameter, self).__init__(**traits) + + self.netw = {} + + for cobj in cfile.connectome_network: + if cobj.loaded: + if isinstance(cobj, CNetwork): + # add more info + a=cobj.obj.data.nodes_iter(data=True) + n, dn = a.next() + npos = [] + lab = [] + for k in dn.keys(): + if 'position' in k or 'pos' in k or 'location' in k: + npos.append(k) + if 'name' in k or 'label' in k: + lab.append(k) + if len(npos) == 0: + npos = ["None"] + if len(lab) == 0: + lab = ["None"] + + a=cobj.obj.data.edges_iter(data=True) + if len(cobj.obj.data.edges()) == 0: + ev = ["None"] + else: + e1, e2, de = a.next() + ev = [] + for k in de.keys(): + if isinstance(de[k], float) or isinstance(de[k], int): + ev.append(k) + if len(ev) == 0: + ev = ["None"] + + self.netw[cobj.name] = {'name' : cobj.obj.name, + 'ev' : ev, 'pos' : npos, 'lab' : lab} + + if len(self.netw) == 0: + self.netw["None"] = {'name' : "None", 'ev' : "None", 'pos' : "None", 'lab' : "None"} + + self.add_trait('graph', Enum(self.netw.keys()) ) + firstk = self.netw.keys()[0] + self.add_trait('node_position', Enum(self.netw[firstk]['pos']) ) + self.add_trait('edge_value', Enum(self.netw[firstk]['ev']) ) + self.add_trait('node_label', Enum(self.netw[firstk]['lab']) ) + self.add_trait('degree', Int() ) + +class RotationMovieParameter(HasTraits): + + view = View( + Item('graph', label = "Graph"), + Item('x', label="Rotation around x-axis"), + Item('y', label="Rotation around y-axis"), + Item('z', label="Rotation around z-axis"), + id='cviewer.plugins.codeoracle.rotationmovieparameter', + buttons=['OK'], + resizable=True, + title = "Rotation Movie" + ) + + def __init__(self, cfile, **traits): + super(RotationMovieParameter, self).__init__(**traits) + + self.netw = {} + + for cobj in cfile.connectome_network: + if cobj.loaded: + if isinstance(cobj, CNetwork): + # add more info + a=cobj.obj.data.nodes_iter(data=True) + n, dn = a.next() + npos = [] + lab = [] + for k in dn.keys(): + if 'position' in k or 'pos' in k or 'location' in k: + npos.append(k) + if 'name' in k or 'label' in k: + lab.append(k) + if len(npos) == 0: + npos = ["None"] + if len(lab) == 0: + lab = ["None"] + + a=cobj.obj.data.edges_iter(data=True) + if len(cobj.obj.data.edges()) == 0: + ev = ["None"] + else: + e1, e2, de = a.next() + ev = [] + for k in de.keys(): + if isinstance(de[k], float) or isinstance(de[k], int): + ev.append(k) + if len(ev) == 0: + ev = ["None"] + + self.netw[cobj.name] = {'name' : cobj.obj.name, + 'ev' : ev, 'pos' : npos, 'lab' : lab} + + if len(self.netw) == 0: + self.netw["None"] = {'name' : "None", 'ev' : "None", 'pos' : "None", 'lab' : "None"} + + self.add_trait('graph', Enum(self.netw.keys()) ) + self.add_trait('x', Float() ) + self.add_trait('y', Float() ) + self.add_trait('z', Float() ) + +class NoLabelNetworkParameter(HasTraits): + + view = View( + Item('graph', label = "Graph"), + Item('node_position', label = "Node Positions"), + Item('edge_value', label="Edge Value"), + id='cviewer.plugins.codeoracle.nolabelnetworkparameter', + buttons=['OK'], + resizable=True, + title = "3D Network Generator Script" + ) + + def _graph_changed(self, value): + self.remove_trait("node_position") + self.remove_trait("edge_value") + self.add_trait('node_position', Enum(self.netw[value]['pos']) ) + self.add_trait('edge_value', Enum(self.netw[value]['ev']) ) + + def __init__(self, cfile, **traits): + super(NoLabelNetworkParameter, self).__init__(**traits) + + self.netw = {} + + for cobj in cfile.connectome_network: + if cobj.loaded: + if isinstance(cobj, CNetwork): + # add more info + a=cobj.obj.data.nodes_iter(data=True) + n, dn = a.next() + npos = [] + lab = [] + for k in dn.keys(): + if 'position' in k or 'pos' in k or 'location' in k: + npos.append(k) + if 'name' in k or 'label' in k: + lab.append(k) + if len(npos) == 0: + npos = ["None"] + if len(lab) == 0: + lab = ["None"] + + a=cobj.obj.data.edges_iter(data=True) + if len(cobj.obj.data.edges()) == 0: + ev = ["None"] + else: + e1, e2, de = a.next() + ev = [] + for k in de.keys(): + if isinstance(de[k], float) or isinstance(de[k], int): + ev.append(k) + if len(ev) == 0: + ev = ["None"] + + self.netw[cobj.name] = {'name' : cobj.obj.name, + 'ev' : ev, 'pos' : npos} + + if len(self.netw) == 0: + self.netw["None"] = {'name' : "None", 'ev' : "None", 'pos' : "None"} + + self.add_trait('graph', Enum(self.netw.keys()) ) + firstk = self.netw.keys()[0] + self.add_trait('node_position', Enum(self.netw[firstk]['pos']) ) + self.add_trait('edge_value', Enum(self.netw[firstk]['ev']) ) diff --git a/cviewer/plugins/codeoracle/csurface_action.py b/cviewer/plugins/codeoracle/csurface_action.py index 3ff2210..3b1cb80 100644 --- a/cviewer/plugins/codeoracle/csurface_action.py +++ b/cviewer/plugins/codeoracle/csurface_action.py @@ -7,11 +7,8 @@ class SurfaceParameter(HasTraits): - - engine = Enum("Mayavi", ["Mayavi"]) - + view = View( - Item('engine', label = "Use Engine"), Item('pointset', label = "Pointset"), Item('faces', label = "Faces"), Item('labels', label="labels"), @@ -59,6 +56,42 @@ def __init__(self, cfile, **traits): self.add_trait('pointset', Enum(self.pointset_da.keys()) ) self.add_trait('faces', Enum(self.faces_da.keys()) ) self.add_trait('labels', Enum(self.labels_da.keys()) ) + +class SurfaceFileParameter(HasTraits): + + view = View( + Item('surface', label = "Surface"), + Item('labels', label="labels"), + id='cviewer.plugins.codeoracle.surfacefileparameter', + buttons=['OK'], + resizable=True, + title = "Create surface ..." + ) + + def __init__(self, cfile, **traits): + super(SurfaceFileParameter, self).__init__(**traits) + self.surface_da = {} + self.labels_da = {} + + for cobj in cfile.connectome_surface: + if cobj.loaded: + for i, cdobj in enumerate(cobj.darrays): + if cdobj.data.intent == 1008: + self.surface_da[cobj.name + ' / ' + cdobj.dname + ' (%s)' % str(i)] = {'name' : cobj.obj.name, + 'da_idx' : i} + + if cdobj.data.intent == 1002: + self.labels_da[cobj.name + ' / ' + cdobj.dname + ' (%s)' % str(i)] = {'name' : cobj.obj.name, + 'da_idx' : i} + + if len(self.surface_da) == 0: + self.surface_da["None"] = {'name' : "None"} + + if len(self.labels_da) == 0: + self.labels_da["None"] = {'name' : "None"} + + self.add_trait('surface', Enum(self.surface_da.keys()) ) + self.add_trait('labels', Enum(self.labels_da.keys()) ) diff --git a/cviewer/plugins/codeoracle/cvolume_action.py b/cviewer/plugins/codeoracle/cvolume_action.py index 3fc0315..138bd37 100644 --- a/cviewer/plugins/codeoracle/cvolume_action.py +++ b/cviewer/plugins/codeoracle/cvolume_action.py @@ -6,12 +6,9 @@ from cviewer.plugins.cff2.cvolume import CVolume class VolumeParameter(HasTraits): - - engine = Enum("Mayavi", ["Mayavi"]) - + view = View( - Item('engine', label = "Use Engine"), - Item('myvolume', label = "Volume"), + Item('volume', label = "Volume"), id='cviewer.plugins.codeoracle.volumeparameter', buttons=['OK'], resizable=True, @@ -31,5 +28,5 @@ def __init__(self, cfile, **traits): if len(self.volumes) == 0: self.volumes["None"] = {'name' : "None"} - self.add_trait('myvolume', Enum(self.volumes.keys()) ) + self.add_trait('volume', Enum(self.volumes.keys()) ) diff --git a/cviewer/plugins/codeoracle/interfaces.py b/cviewer/plugins/codeoracle/interfaces.py new file mode 100644 index 0000000..a977207 --- /dev/null +++ b/cviewer/plugins/codeoracle/interfaces.py @@ -0,0 +1,267 @@ +from nipype.interfaces.base import (BaseInterface, BaseInterfaceInputSpec, traits, + File, TraitedSpec, InputMultiPath, + OutputMultiPath, isdefined) +from nipype.utils.filemanip import split_filename +import os, os.path as op +import networkx as nx +import numpy as np +import pickle +from enthought.mayavi import mlab +from enthought.tvtk.api import tvtk +import logging +from nipype.utils.misc import package_check +import warnings + +logging.basicConfig() +iflogger = logging.getLogger('interface') + +try: + package_check('enthought') + +except Exception, e: + warnings.warn('Enthought/Mayavi/TVTK not installed') +try: + package_check('cviewer') +except Exception, e: + warnings.warn('ConnectomeViewer not installed') + +else: + from dipy.tracking.utils import density_map + + +def get_positions_and_vectors(ntwk, position_key='dn_position', edge_key='weight'): + ntwk_position_array = get_positions(ntwk, position_key) + vectors, start_positions, end_positions, ev = get_vectors(ntwk, ntwk_position_array, edge_key) + return ntwk_position_array, vectors, start_positions, end_positions, ev + + +def get_positions(ntwk, position_key="dn_position"): + ntwk = nx.read_gpickle(ntwk) + num_ntwk_nodes = ntwk.number_of_nodes() + ntwk_position_array = np.zeros( (num_ntwk_nodes, 3) ) + for i, nodeid in enumerate(ntwk.nodes()): + ntwk_pos = ntwk.node[nodeid][position_key] + ntwk_pos = np.array(ntwk_pos) + ntwk_position_array[i,:] = ntwk_pos + return ntwk_position_array + + +def get_vectors(ntwk, ntwk_position_array, edge_key='weight'): + ntwk = nx.read_gpickle(ntwk) + edges = np.array(ntwk.edges()) + ev = np.zeros( (ntwk.number_of_edges(), 1) ) + for i,d in enumerate(ntwk.edges_iter(data=True)): + ev[i] = d[2][edge_key] + # ensure that we are setting the correct edge + assert d[0] == edges[i,0] and d[1] == edges[i,1] + edges = edges - 1 # Need to subtract one because the array index starts at zero + start_positions = ntwk_position_array[edges[:, 0], :].T + end_positions = ntwk_position_array[edges[:, 1], :].T + vectors = end_positions - start_positions + return vectors, start_positions, end_positions, ev + + +def plot_text_and_scalarbar(phrase): + """ + Adds text and scale bar + """ + x = 0.02 + y = 0.02 + width = 0.3 + text = ntwk_name + mlab.text(x,y,phrase,width=width) + #mlab.scalarbar(myvectors,'Mean Fiber Length (mm)', 'vertical') + #mlab.scalarbar(ntwk_nodes, ntwk_name, 'vertical') + + +def plot_nodes(ntwk, position_key='dn_position', scalar_key='value'): + ntwk_position_array = get_positions(ntwk, position_key) + ntwk = nx.read_gpickle(ntwk) + node_scalar_key = 'value' + scalars = np.zeros( (len(ntwk.nodes()),) ) + for i,data in enumerate(ntwk.nodes(data=True)): + if data[1].has_key(scalar_key): + scalars[i] = float(data[1][scalar_key]) + x, y, z = ntwk_position_array[:,0], ntwk_position_array[:,1], ntwk_position_array[:,2] + nodesource = mlab.pipeline.scalar_scatter(x, y, z, scalars, name = scalar_key + ' Node Source') + ntwk_nodes = mlab.pipeline.glyph(nodesource, scale_factor=1.5, scale_mode='none', name = scalar_key + ' Nodes', mode='sphere') + ntwk_nodes.glyph.color_mode = 'color_by_scalar' + + +def plot_labels_by_phrase(ntwk, phrase, position_key='dn_position', node_label_key='dn_name'): + ntwk_position_array = get_positions(ntwk, position_key) + ntwk = nx.read_gpickle(ntwk) + nodes = ntwk.nodes_iter() + for node in nodes: + node_name = str(ntwk.node[node][node_label_key]) + row_index = node - 1 + if node_name.rfind(phrase) >= 0: + label = ntwk.node[node][node_label_key] + mlab.text3d(ntwk_position_array[row_index,0], + ntwk_position_array[row_index,1], + ntwk_position_array[row_index,2], + ' ' + label, + name = 'Node ' + label) + + +def plot_labels_by_degree(ntwk, degree, position_key='dn_position', node_label_key='dn_name'): + ntwk_position_array = get_positions(ntwk, position_key) + ntwk = nx.read_gpickle(ntwk) + nodes = ntwk.nodes_iter() + for node in nodes: + node_degree = ntwk.degree(node) + row_index = node - 1 + if node_degree >= degree: + label = ntwk.node[node][node_label_key] + mlab.text3d(ntwk_position_array[row_index,0], + ntwk_position_array[row_index,1], + ntwk_position_array[row_index,2], + ' ' + label, + name = 'Node ' + label) + + +def plot_edges(ntwk, position_key='dn_position', edge_key='weight'): + ntwk_position_array, vectors, start_positions, end_positions, ev = get_positions_and_vectors(ntwk, position_key, edge_key) + ntwk = nx.read_gpickle(ntwk) + vectorsrc = mlab.pipeline.vector_scatter(start_positions[0], + start_positions[1], + start_positions[2], + vectors[0], + vectors[1], + vectors[2], + name = edge_key) + da = tvtk.DoubleArray(name=edge_key) + da.from_array(ev) + vectorsrc.mlab_source.dataset.point_data.add_array(da) + vectorsrc.mlab_source.dataset.point_data.scalars = da.to_array() + vectorsrc.mlab_source.dataset.point_data.scalars.name = edge_key + + vectorsrc.outputs[0].update() # need to update the boundaries + # Add a thresholding filter to threshold the edges + thres = mlab.pipeline.threshold(vectorsrc, name="Thresholding") + + myvectors = mlab.pipeline.vectors(thres,colormap='hot', + #mode='cylinder', + name=edge_key, + #scale_factor=1, + #resolution=20, + # make the opacity of the actor depend on the scalar. + transparent=True, + scale_mode = 'vector') + myvectors.glyph.glyph_source.glyph_source.glyph_type = 'dash' + # vectors.glyph.glyph_source.glyph_source.radius = 0.01 + myvectors.glyph.color_mode = 'color_by_scalar' + myvectors.glyph.glyph.clamping = False + + +def plot_surfaces(surface_file, label_file="None"): + import nibabel.gifti as gifti + surface_file = gifti.read(surface_file) + vertices = surface_file.darrays[0].data + faces = surface_file.darrays[1].data + if label_file == "None": + labels = None + else: + label_file = gifti.read(label_file) + labels = label_file.darrays[0].data + labels = labels.ravel() + assert vertices.shape[0] == len(labels) + + if len(faces.shape) == 1: + faces = faces.reshape( (len(faces) / 3, 3) ) + + x, y, z = vertices[:,0], vertices[:,1], vertices[:,2] + x = x + 128 + y = y + 128 + z = z - 128 + mlab.triangular_mesh(x, y, z, faces, scalars = labels) + + +def plot_volumes(image_file): + import nibabel as nb + image = nb.load(image_file) + image_data = image.get_data() + affine = image.get_affine() + center = np.r_[0, 0, 0, 1] + data_src = mlab.pipeline.scalar_field(image_data) + data_src.spacing = np.diag(affine)[:3] + data_src.origin = np.dot(affine, center)[:3] + mlab.pipeline.outline(data_src) + image_plane_widget = mlab.pipeline.image_plane_widget(data_src, name=image_file) + image_plane_widget.ipw.plane_orientation = 'x_axes' + image_plane_widget.ipw.reslice_interpolate = 'nearest_neighbour' + image_plane_widget.ipw.slice_index = int(image_data.shape[0]/2) + +def create_rotation_frames(out_folder, out_name, frames=4, ext='.png'): + for frame in range(1,frames+1): + f = mlab.gcf() + f.scene.camera.azimuth(1) + name = '%04d' %frame + out_frame = op.join(out_folder, out_name) + name + ext + f.scene.render() + mlab.savefig(out_frame) + +class RotationMovieInputSpec(BaseInterfaceInputSpec): + in_file = File(exists=True, mandatory=True, desc='Networks for node removal subjects') + number_of_frames = traits.Int(360, usedefault=True, desc='Number of frames to generate') + x_degrees = traits.Int(360, usedefault=True, desc='Degrees to rotate around the x axis') + y_degrees = traits.Int(0, usedefault=True, desc='Degrees to rotate around the y axis') + z_degrees = traits.Int(0, usedefault=True, desc='Degrees to rotate around the z axis') + output_as_mpeg = traits.Bool(False, usedefault=True, desc='Option to save the output networks in an mpeg movie file') + output_mpeg_file = File('rotation.mpg', usedefault=True, desc='The output images saved as an mpeg movie file') + +class RotationMovieOutputSpec(TraitedSpec): + mpeg_file = File(desc='The output networks saved in a single mpeg file') + out_files = OutputMultiPath(File(desc='Output sequence of images')) + +class RotationMovie(BaseInterface): + """ + Creates a movie by plotting single frames and combining them using ffmpeg + + Example + ------- + + >>> import nipype.interfaces.connectomeviewer as cv + >>> rm = cv.RotationMovie() + >>> rm.inputs.in_files = ['subj1.pck', 'subj2.pck'] # doctest: +SKIP + >>> rm.run() # doctest: +SKIP + """ + input_spec = RotationMovieInputSpec + output_spec = RotationMovieOutputSpec + + def _run_interface(self, runtime): + global out_paths + out_paths = [] + create_rotation_frames(out_directory, 'const1', 360) + for in_file in self.inputs.in_files: + if idx == 0: + out_path = get_out_paths(in_file) + remove_nodes_named(in_file, phrase, out_path) + else: + remove_nodes_named(out_path, phrase, out_path) + out_paths.append(out_path) + + if self.inputs.output_as_cff: + out_paths = get_out_paths(self.inputs.in_files) + convert.inputs.gpickled_networks = out_paths + iflogger.info(out_paths) + convert.inputs.out_file = op.abspath(self.inputs.output_cff_file) + convert.run() + iflogger.info('Saving output CFF file as {out}'.format(out=op.abspath(self.inputs.output_cff_file))) + + isolate_list = [] + for idx, out_file in enumerate(out_paths): + graph = nx.read_gpickle(out_file) + n_isolates = len(nx.isolates(graph)) + iflogger.info('File: {f} has {n} unconnected nodes'.format(f=out_file, n=n_isolates)) + isolate_list.append(n_isolates) + iflogger.info(isolate_list) + return runtime + + def _list_outputs(self): + outputs = self.output_spec().get() + out_paths = get_out_paths(self.inputs.in_files) + outputs['out_files'] = out_paths + if self.inputs.output_as_cff: + outputs['mpeg_file'] = op.abspath(self.inputs.output_cff_file) + return outputs diff --git a/cviewer/plugins/codeoracle/oracle_action_set.py b/cviewer/plugins/codeoracle/oracle_action_set.py index 11f7a44..9640336 100644 --- a/cviewer/plugins/codeoracle/oracle_action_set.py +++ b/cviewer/plugins/codeoracle/oracle_action_set.py @@ -96,7 +96,6 @@ path = "MenuBar/Code Oracle/Connectome/CTrack/Analysis" ) - nipype_bet = Action( id = "OracleNipypeBet", class_name = "cviewer.plugins.codeoracle.actions.NipypeBet", @@ -104,6 +103,103 @@ path = "MenuBar/Code Oracle/Other/Nipype" ) +nipype_PlotNodes = Action( + id = "NipypePlotNodes", + class_name = "cviewer.plugins.codeoracle.actions.PlotNodes", + name = "Plot Nodes", + path = "MenuBar/Plotting" +) + +nipype_PlotEdges = Action( + id = "NipypePlotEdges", + class_name = "cviewer.plugins.codeoracle.actions.PlotEdges", + name = "Plot Edges", + path = "MenuBar/Plotting" +) + +nipype_PlotLabelsByPhrase = Action( + id = "NipypePlotLabelsByPhrase", + class_name = "cviewer.plugins.codeoracle.actions.PlotLabelsByPhrase", + name = "Plot Labels By Phrase", + path = "MenuBar/Plotting" +) + +nipype_PlotLabelsByDegree = Action( + id = "NipypePlotLabelsByDegree", + class_name = "cviewer.plugins.codeoracle.actions.PlotLabelsByDegree", + name = "Plot Labels By Degree", + path = "MenuBar/Plotting" +) + +nipype_PlotNetwork = Action( + id = "NipypePlotNetwork", + class_name = "cviewer.plugins.codeoracle.actions.PlotNetwork", + name = "Plot Network", + path = "MenuBar/Plotting" +) + +nipype_RecordVideo = Action( + id = "NipypeRecordVideo", + class_name = "cviewer.plugins.codeoracle.actions.RecordVideo", + name = "Record Video", + path = "MenuBar/Plotting" +) + +nipype_PlotSurface = Action( + id = "NipypePlotSurface", + class_name = "cviewer.plugins.codeoracle.actions.PlotSurface", + name = "Plot Surface", + path = "MenuBar/Plotting" +) + +ClearFigure = Action( + id = "ClearFigure", + class_name = "cviewer.plugins.codeoracle.actions.ClearFigure", + name = "Clear Figure", + path = "MenuBar/Plotting" +) + +NewFigure = Action( + id = "NewFigure", + class_name = "cviewer.plugins.codeoracle.actions.NewFigure", + name = "New Figure", + path = "MenuBar/Plotting" +) + +ShowHideEdgeLegend = Action( + id = "ShowHideEdgeLegend", + class_name = "cviewer.plugins.codeoracle.actions.ShowHideEdgeLegend", + name = "Show/Hide Edge Legend", + path = "MenuBar/Plotting" +) + +ShowHideNodeLegend = Action( + id = "ShowHideNodeLegend", + class_name = "cviewer.plugins.codeoracle.actions.ShowHideNodeLegend", + name = "Show/Hide Node Legend", + path = "MenuBar/Plotting" +) + +ShowHideNetworkName = Action( + id = "ShowHideNetworkName", + class_name = "cviewer.plugins.codeoracle.actions.ShowHideNetworkName", + name = "Show/Hide Network Name", + path = "MenuBar/Plotting" +) + +nipype_PlotVolume = Action( + id = "PlotVolume", + class_name = "cviewer.plugins.codeoracle.actions.PlotVolume", + name = "Plot Volume", + path = "MenuBar/Plotting" +) + +PlotTracks = Action( + id = "PlotTracks", + class_name = "cviewer.plugins.codeoracle.actions.PlotTracks", + name = "Plot Tracks", + path = "MenuBar/Plotting" +) class OracleActionSet(WorkbenchActionSet): """ The actionset for the Oracle plugin """ @@ -123,5 +219,19 @@ class OracleActionSet(WorkbenchActionSet): xnat_pushpull, nipype_bet, networkrepo, - writegexf + writegexf, + nipype_PlotNodes, + nipype_PlotLabelsByPhrase, + nipype_PlotLabelsByDegree, + nipype_PlotEdges, + nipype_PlotSurface, + nipype_PlotNetwork, + nipype_PlotVolume, + NewFigure, + ClearFigure, + ShowHideEdgeLegend, + ShowHideNodeLegend, + ShowHideNetworkName, + PlotTracks, + #nipype_RecordVideo, ] diff --git a/cviewer/plugins/codeoracle/scripts.py b/cviewer/plugins/codeoracle/scripts.py index 7432bcd..b434974 100644 --- a/cviewer/plugins/codeoracle/scripts.py +++ b/cviewer/plugins/codeoracle/scripts.py @@ -483,6 +483,9 @@ def compute_angle_array(tracksobj, downsampling = 3): # Create triangular surface mesh x, y, z = vertices[:,0], vertices[:,1], vertices[:,2] +x = x + 128 +y = y + 128 +z = z - 128 mlab.triangular_mesh(x, y, z, faces, scalars = labels) """ @@ -658,15 +661,13 @@ def showfibfvtk(fibarr, colarr, percentage = 100): create_label = [] # Assume node id's are integers -nr_nodes = len(g.nodes()) +nr_nodes = np.max(g.nodes()) position_array = np.zeros( (nr_nodes, 3) ) for i,nodeid in enumerate(g.nodes()): pos = g.node[nodeid][position_key] # apply a conversion procedure if the position # is a tuple store as string # we need a numpy array in the end - if type(pos) is str or unicode: - pos = tuple(float(s) for s in pos[1:-1].split(',')) pos = np.array(pos) position_array[i,:] = pos diff --git a/cviewer/plugins/ui/cviewer_ui_action_set.py b/cviewer/plugins/ui/cviewer_ui_action_set.py index 90e07f9..c5a7455 100644 --- a/cviewer/plugins/ui/cviewer_ui_action_set.py +++ b/cviewer/plugins/ui/cviewer_ui_action_set.py @@ -90,7 +90,7 @@ open_file2 = Action( id = "ConnectomeFile", - name = "&Open data file ...", + name = "&Add data ...", class_name = "cviewer.action.load_cff:" "OpenFile", path = "MenuBar/File", diff --git a/setup.py b/setup.py index 2c0cfbd..6fa950f 100755 --- a/setup.py +++ b/setup.py @@ -45,7 +45,6 @@ def _traits_version(pkg_name): from setup_egg import extra_setuptools_args package_check('networkx', INFO_VARS['networkx_min_version']) package_check('mayavi', INFO_VARS['mayavi_min_version'],version_getter=_mayavi_version) - package_check('traits', INFO_VARS['traits_min_version'],version_getter=_traits_version) # extra_setuptools_args can be defined from the line above, but it can # also be defined here because setup.py has been exec'ed from