Source code for pylogeny.JSONWriter
''' Serialize a phylogenetic landscape into a JSON object. '''
# Date: Jan 27 2014
# Author: Alex Safatli
# E-mail: safatli@cs.dal.ca
from landscapeWriter import landscapeWriter
import json
import landscape
[docs]class JSONWriter(landscapeWriter):
''' Writes a landscape and associated node information to a JSON
object. '''
[docs] def __init__(self, ls, name):
''' Instantiates this writer.
:param ls: a landscape object
:type ls: a :class:`.landscape.landscape` object
:param name: the name of this landscape
:type name: a string
'''
super(JSONWriter,self).__init__(ls,name)
[docs] def nodeToJSON(self,node):
''' Returns a JSON formatted node, given a node ID.
:param node: a name of a tree/node in the graph
:type node: a string
'''
n = self.landscape.getVertex(node)
ml,pars = n.getScore()
og = n.getOrigin()
lmax = n.isLocalOptimum()
mimpr = n.getBestImprovement()
expl = n.isExplored()
dg = len(n.getNeighbors())
val = int(n.isFailed())
return {'name':str(node),'group':int(node),
'ml':ml,'parsimony':pars,'origin':og,
'explored':expl,'degree':dg,
'isLocalMax':lmax,'maximprov':str(mimpr),
'value':val}
def _jsonNodes(self):
for node in self.graph.node:
if self.graph.degree(node) > 0:
yield self.nodeToJSON(node)
def _jsonEdges(self,jsonNodes):
nodeli = [x['group'] for x in jsonNodes]
for node in nodeli:
neighbors = self.graph.neighbors(node)
for neigh in neighbors:
if neigh in nodeli:
yield {'source':nodeli.index(node),
'target':nodeli.index(neigh),
'value': 1}
def _jsonGraph(self,nodes=None):
# Initialize variables.
if not nodes: nodes = self._jsonNodes()
ls = self.landscape
locks = ls.locks
toVis = []
allScore = True
# Check scores.
for node in nodes:
# Get node's log-likelihood score.
nS = node['ml']
if (nS == None): allScore = False
else: toVis.append(node)
if len(toVis) == 0: allScore = False
return toVis, allScore
[docs] def getOnlyImprovements(self,groups=None):
# Are there any groups to uncollapse?
if (groups == None): groups = list()
# Get all relevant nodes.
nodes,inds = [self.nodeToJSON(0)],[0]
paths = self.landscape.iterAllPathsOfBestImprovement()
for path in paths:
for it in path:
if not it in inds:
nodes.append(self.nodeToJSON(it))
inds.append(it)
# Get node and link information.
nodes, aS = self._jsonGraph(nodes)
links = [x for x in self._jsonEdges(nodes)]
out = json.dumps(
{"nodes":nodes,"links":links,"graphid":self.name,
"scored":aS},sort_keys=True,indent=4,separators=(',',': '))
return out
[docs] def getCompleteLandscape(self):
''' Returns the landscape as a JSON string.
:return: a JSON string
'''
return self.getJSON()
[docs] def getJSON(self):
''' Returns the landscape as a JSON string.
:return: a JSON string
'''
# Get node and link information.
nodes, aS = self._jsonGraph()
nodes = [node for node in nodes if node['ml'] != None]
links = [x for x in self._jsonEdges(nodes)]
# Output to JSON string.
out = json.dumps({"nodes":nodes,"links":links,"graphid":self.name,
"scored":aS},sort_keys=True,indent=4,separators=
(',',': '))
return out