Source code for pyfibre.model.objects.fibre_network
from networkx import Graph
from pyfibre.io.utilities import (
pop_recursive, remove_contraction,
deserialize_networkx_graph,
serialize_networkx_graph
)
from pyfibre.model.tools.analysis import angle_analysis
from pyfibre.model.tools.metrics import (
network_metrics, fibre_metrics, FIBRE_METRICS)
from pyfibre.model.tools.fibre_assigner import FibreAssigner
from pyfibre.model.tools.fibre_utilities import simplify_network
from pyfibre.model.core.base_graph_segment import BaseGraph
from .fibre import Fibre
[docs]class FibreNetwork(BaseGraph):
"""Container for a Networkx Graph
representing a connected fibrous region"""
def __init__(self, *args, fibres=None, red_graph=None, **kwargs):
super(FibreNetwork, self).__init__(*args, **kwargs)
if fibres is None:
fibres = []
self.fibres = fibres
self.red_graph = red_graph
@property
def fibre_assigner(self):
return FibreAssigner()
[docs] def generate_red_graph(self):
return simplify_network(self.graph)
[docs] def generate_fibres(self):
return self.fibre_assigner.assign_fibres(self.graph)
[docs] @classmethod
def from_json(cls, data):
fibres = data.pop('fibres', None)
if fibres is None:
data['fibres'] = []
else:
data['fibres'] = [
Fibre.from_json(kwargs)
if isinstance(kwargs, dict)
else kwargs
for kwargs in fibres
]
for attr in ['graph', 'red_graph']:
graph = data.pop(attr, None)
if isinstance(graph, dict):
data[attr] = deserialize_networkx_graph(graph)
elif graph is None:
data[attr] = Graph()
return cls(**data)
[docs] def to_json(self):
"""Return the object state in a form that can be
serialised as a JSON file"""
state = super(FibreNetwork, self).to_json()
if self.red_graph:
state['red_graph'] = serialize_networkx_graph(state['red_graph'])
state['red_graph'] = pop_recursive(
state['red_graph'], remove_contraction)
state["fibres"] = [
fibre.to_json() for fibre in self.fibres]
return state
[docs] def generate_database(self):
"""Generates a Pandas database with all graph and segment metrics
for assigned image"""
database = network_metrics(
self.graph, self.red_graph, len(self.fibres), 'Fibre')
metrics = fibre_metrics(self.fibres)
database['Fibre Angle SDI'], _ = angle_analysis(
metrics['Fibre Angle'].to_numpy())
metrics = metrics.drop(['Fibre Angle'], axis=1)
mean_metrics = metrics.mean()
for metric in FIBRE_METRICS:
database[f'Mean Fibre {metric}'] = (
mean_metrics[f'Fibre {metric}'])
return database