Source code for openalea.hydroroot.analysis

"""Analysis procedures for Hydroroot.

Define a set of methods to ease the analysis and simulation.
"""
import pandas
# from openalea.hydroroot.main import hydroroot
from openalea.mtg.traversal import pre_order2
from openalea.mtg.algo import orders


[docs] def nb_roots(g, l, root=1, dl=1e-4, max_order=None): """ Compute the number of segments intercepted at a given length from the base. :param g: (MTG) :param l: (length) - the length in m at which to count the intercepts :param root: (int) - the root vertex from which the tree traversal start (Default value = 1) :param dl: (float) - length in m of MTG segments (Default value = 1e-4) :param max_order: (int) - maximum order of considering roots (Default value = None) :returns: - number of segments """ length = {} if 'mylength' in g.property_names(): length = g.property('mylength') else: for v in pre_order2(g, root): pid = g.parent(v) length[v] = length[pid] + dl if pid else dl g.properties()['mylength'] = length order = None if max_order is not None: if 'order' in g.property_names(): order = g.property('order') else: order = orders(g, scale=g.max_scale()) count = 0 for v in g: if order and order.get(v) >= max_order: continue pid = g.parent(v) if pid and (length[pid] <= l <= length[v]): count += 1 return count
[docs] def intercept(g, dists, dl=1e-4, max_order=None): """ Compute intercepts (the number of segments intercepted) at given lengths from the base given as list of float .. seealso:: :func:`nb_roots` :param g: (MTG) :param dists: (list of Float) list of distances in m :param dl: (float) - length in m of MTG segments (Default value = 1e-4) :param max_order: (int) - maximum order of considering roots (Default value = None) :returns: - intercepts: list of number of segments intercepted according to distances in dists """ # F. Bauget 2021-07-09 : added dl to arguments intercepts = [nb_roots(g, x, dl = dl, max_order=max_order) for x in dists] return intercepts
def read_data(data): """ :Deprecated: Merge data and return a Dataframe. :param data: """ names = ('relative_position', 'internode_length', 'LR_length', 'distance_to_tip') df = None for d in data: pd = pandas.read_csv(d, sep=';', header=1, names=names) pd.sort('distance_to_tip', inplace=True) pd.LR_length.cumsum() pd['cum'] = pd.LR_length.cumsum() pd['length'] = pd.internode_length.cumsum() if df is None: df = pd else: df = df.append(pd) pd = df pd['cumsum'] = pd.LR_length.cumsum() pd.sort('distance_to_tip', inplace=True) return pd