Source code for ClearMap.IO.GT
# -*- coding: utf-8 -*-
"""
GT
==
Interface to read and write graph tool files.
Note
----
The module utilizes the gt writer/reader from graph_tool.
See also
--------
:mod`ClearMap.Analysis.Graphs`
"""
__author__ = 'Christoph Kirst <christoph.kirst.ck@gmail.com>'
__license__ = 'GPLv3 - GNU General Public License v3 (see LICENSE.txt)'
__copyright__ = 'Copyright © 2020 by Christoph Kirst'
__webpage__ = 'http://idisco.info'
__download__ = 'http://www.github.com/ChristophKirst/ClearMap2'
import ClearMap.Analysis.Graphs.GraphGt as ggt
import ClearMap.IO.Source as src
###############################################################################
### Source classe
###############################################################################
[docs]
class Source(src.Source):
"""GT graph source."""
def __init__(self, location = None, graph = None, name = None):
"""GT source class construtor.
Arguments
---------
location : str or None
The filename of the graph source.
graph : Graph or None
The graph object
"""
super(Source, self).__init__(name=name);
if isinstance(location, ggt.Graph):
graph = location;
location = None;
self._location = location;
self._graph = graph;
@property
def name(self):
return "Graph-Source";
@property
def location(self):
return self._location;
@location.setter
def location(self, value):
if value != self.location:
self._location = value;
@property
def graph(self):
"""The underlying graph.
Returns
-------
graph : Graph
The underlying graph of this source.
"""
if self._graph is None:
self._graph = _graph(self.location);
return self._graph;
@graph.setter
def graph(self, value):
self._graph = value;
@property
def shape(self):
"""The shape of the source.
Returns
-------
shape : tuple
The shape of the source.
"""
return self.graph.shape;
@shape.setter
def shape(self, value):
self.graph.shape = value;
[docs]
def as_virtual(self):
return VirtualSource(source=self);
[docs]
def as_real(self):
return self;
### Generic
[docs]
def info(self):
self.graph.info();
[docs]
def write(self, location = None):
if location is None:
location = self.location;
return _write(location, self.graph);
[docs]
def read(self, location = None):
if location is None:
location = self.location;
self._graph = _graph(location);
[docs]
def copy(self):
return Source(graph=self.graph.copy())
### Formatting
def __str__(self):
try:
name = self.name;
name = '%s' % name if name is not None else '';
except:
name ='';
try:
graph = self._graph.__str__()[5:];
except:
graph = '';
try:
location = self.location;
location = '%s' % location if location is not None else '';
if len(location) > 100:
location = location[:50] + '...' + location[-50:]
if len(location) > 0:
location = '{%s}' % location;
except:
location = '';
return name + graph + location
[docs]
class VirtualSource(src.VirtualSource):
def __init__(self, source = None, location = None, name = None):
if source is not None and location is None:
location = source.location;
super(VirtualSource, self).__init__(location=location, name=name);
@property
def name(self):
return 'Virtual-Graph-Source';
[docs]
def as_virtual(self):
return self;
[docs]
def as_real(self):
return Source(location=self.location);
@property
def graph(self):
"""The underlying graph.
Returns
-------
graph : Graph
The underlying graph of this source.
"""
if self._graph is None:
self._graph = _graph(self.location);
return self._graph;
@graph.setter
def graph(self, value):
raise NotImplementedError("Cannot set virtual graph")
@property
def shape(self):
"""The shape of the source.
Returns
-------
shape : tuple
The shape of the source.
"""
return self.graph.shape;
@shape.setter
def shape(self, value):
raise NotImplementedError("Cannot set shape of virtual graph")
###############################################################################
### IO Interface
###############################################################################
[docs]
def is_graph(source):
"""Checks if this source is a graph source"""
if isinstance(source, Source):
return True;
if isinstance(source, str) and len(source) >= 2 and source[-2:] == 'gt':
return True;
return False;
[docs]
def read(source, as_source = None, **kwargs):
"""Read graph from a file.
Arguments
---------
source : str
The name of the graph file.
slicing : slice, Slice or None
An optional sub-slice to consider.
as_source : bool
If True, return results as a source.
Returns
-------
graph : Graph or Source
The graph as a Graph class or source.
"""
if not isinstance(source, Source):
source = Source(source);
if as_source:
return source
else:
return source.graph;
[docs]
def write(sink, graph, **kwargs):
"""Write graph to a file.
Arguments
---------
sink : str
The name of the CSV file.
graph : Graph
The data to write into the CSV file.
Returns
-------
sink : grpah or source
The sink graph file.
"""
if not isinstance(sink, Source):
sink = Source(sink);
return _write(sink, graph);
[docs]
def create(location = None, **kwargs):
raise NotImplementedError('Creating graph files not implemented yet!')
###############################################################################
### Helpers
###############################################################################
def _graph(location, **kwargs):
"""Read graph from file.
Arguments
---------
location : str
Location of the csv array data.
Returns
-------
graph : Graph
The graph as a Graph object.
"""
graph = ggt.load(location);
return graph;
def _write(filename, graph, **args):
"""Write graph to file.
"""
ggt.save(filename, graph)
return filename
###############################################################################
### Tests
###############################################################################
[docs]
def test():
"""Test GT module"""
import os
import ClearMap.Analysis.Graphs.GraphGt as ggt
import ClearMap.IO.GT as gt
location = 'test.gt';
g = ggt.Graph(n_vertices=10)
s = gt.Source(graph=g, location=location);
s.shape = (1,2,3);
print(s)
s.write();
r = gt.Source(location=location)
print(r.shape)
os.remove(location)