Welcome to mycelyso’s documentation!

See mycelyso Readme for information.

Indices and tables

Contents:

_images/mycelyso-banner.png

mycelyso Readme

https://img.shields.io/pypi/v/mycelyso.svg https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat https://travis-ci.org/modsim/mycelyso.svg?branch=master https://ci.appveyor.com/api/projects/status/0jcyc25y81tp4iua/branch/master?svg=true https://img.shields.io/docker/build/modsim/mycelyso.svg https://img.shields.io/pypi/l/mycelyso.svg https://zenodo.org/badge/doi/10.5281/zenodo.376281.svg https://zenodo.org/badge/doi/10.1186/s12859-019-3004-1.svg

Frontmatter

Installation and Analysis Tutorial Videos

 

These videos shows how to download and unpack mycelyso as well as to run a test analysis using the pre-packages Windows version of mycelyso.

Publication

When using mycelyso for scientific applications, please cite our publication:

Sachs CC, Koepff J, Wiechert W, Grünberger A, Nöh K (2019) mycelyso – high-throughput analysis of Streptomyces mycelium live cell imaging data BMC Bioinformatics, volume 20, 452, doi: 10.1186/s12859-019-3004-1

It is available on the BMC Bioinformatics homepage at DOI: 10.1186/s12859-019-3004-1

Documentation

Documentation can be built using sphinx, but is available online as well at Read the Docs.

License

mycelyso is free/libre open source software under the 2-clause BSD License. See License

Getting mycelyso and Datasets

Example Datasets

You can find an example dataset deposited at zenodo DOI: 10.5281/zenodo.376281.

Ways to install mycelyso

Pre-Bundled Windows Application

If you don’t have a Python 3 installation ready, and want to just run mycelyso, we you can download a pre-packaged version for 64-bit versions of Windows (mycelyso-win64.zip) from AppVeyor.

Please note, that, instead of python -m mycelyso or python -m mycelyso_inspector, the calls would then be mycelyso.exe or mycelyso_inspector.exe.

Docker

Please see the Docker section near the end.

Packages for the conda Package manager

While mycelyso is a pure Python package, it has some dependencies which are a bit more complex to build and might not be present in the PyPI (Python Package Index). Thankfully the conda Package manager / Anaconda environment provides all packages necessary in an easy to use manner. To use it, please download Anaconda (Miniconda could be downloaded as well, but as most packages included in Anaconda are needed anyways, it does hardly provide a size benefit).

You have to enable the necessary channels (we aim to add mycelyso to bioconda lateron):

> conda config --add channels conda-forge
> conda config --add channels bioconda
> conda config --add channels csachs

> conda install -y mycelyso mycelyso-inspector

Please note that this readme assumes you are starting with a fresh install of Anaconda/Miniconda. If you start with an existing installation, individual dependency packages might need to be updated.

Packages from PyPI (for advanced users)

If you have a working Python 3 installation and can eventually fix missing dependencies, you can as well use the PyPI version:

> pip install --user mycelyso mycelyso-inspector

Directly from github (for advanced users)

> pip install --user https://github.com/modsim/mycelyso/archive/master.zip mycelyso-inspector

mycelyso Quickstart

mycelyso is packaged as a Python module, to run it, use the following syntax:

> python -m mycelyso

Which will produce the help screen:

mycelyso INFO
  MYCElium   anaLYsis __ SOftware
  ___   __ _________ / /_ _____ ___         Developed  2015 - 2019 by
 /  ' \/ // / __/ -_) / // (_-</ _ \ __
/_/_/_/\_, /\__/\__/_/\_, /___/\___/'  \.   Christian   C.  Sachs  at
      /___/          /___/              |
            \    `           __     ,''''   Modeling&Simulation Group
             \    `----._ _,'  `'  _/
              ---'       ''      `-'        Research  Centre  Juelich

               For more information visit: github.com/modsim/mycelyso

If you use this software in a publication, please cite our paper:

Sachs CC, Koepff J, Wiechert W, Grünberger A, Nöh K (2019)
mycelyso – high-throughput analysis of Streptomyces mycelium live cell imaging data
BMC Bioinformatics, volume 20, 452, doi: 10.1186/s12859-019-3004-1

usage: __main__.py [-h] [-m MODULES] [-n PROCESSES] [--prompt]
                   [-tp TIMEPOINTS] [-mp POSITIONS] [-t TUNABLE]
                   [--tunables-show] [--tunables-load TUNABLES_LOAD]
                   [--tunables-save TUNABLES_SAVE] [--meta META]
                   [--interactive] [--output OUTPUT]
                   input

positional arguments:
  input                 input file

optional arguments:
  -h, --help            show this help message and exit
  -m MODULES, --module MODULES
  -n PROCESSES, --processes PROCESSES
  --prompt, --prompt
  -tp TIMEPOINTS, --timepoints TIMEPOINTS
  -mp POSITIONS, --positions POSITIONS
  -t TUNABLE, --tunable TUNABLE
  --tunables-show
  --tunables-load TUNABLES_LOAD
  --tunables-save TUNABLES_SAVE
  --meta META, --meta META
  --interactive, --interactive
  --output OUTPUT, --output OUTPUT

To run an analysis, just pass the appropriate filename as a parameter. The desired timepoints can be selected via the --timepoints switch, and if the file contains multiple positions, they can be selected with --positions. Supported file formats are TIFF, OME-TIFF, Nikon ND2 and Zeiss CZI.

The analysis will use all cores present by default. While this is generally desirable, it might lead to consuming too much memory (as each parallel acting process needs a certain additionally amount of memory). If you notice that mycelyso takes up too much memory, try limiting the number of processes via -n. If you choose -n 0, the code will additionally not use the parallel subsystem (multiprocessing).

Running an analysis

To analyze the example dataset, run: (-t BoxDetection=1 is used, as the spores were grown in rectangular growth chambers, which are to be detected. Otherwise, the software will use the whole image, or cropping values as set via -t CropWidth=.../-t CropHeight=.... If the data is pre-segmented (i.e. input is a binary image stack), choose -t SkipBinarization=1.

> python -m mycelyso S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff -t BoxDetection=1

Optionally, you can inspect the segmentation and produced graph on a per-frame basis before running a complete analysis, by adding the --interactive flag, in which case mycelyso will start an interactive viewer.

mycelyso stores all data compressed in HDF5 files, by default it will write a file called output.h5 (can be changed with --output).

> ls -lh --time-style=+
total 1.3G
-rw-rw-r-- 1 sachs sachs 5.4M  output.h5
-rw-rw-r-- 1 sachs sachs 1.5G  S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff

Multiple datasets/positions can be stored in the same file, it will only make problems if the same position is about to be analyzed twice. Binary masks/skeletons are stored in the HDF5 file, as well as GraphML representations of the tracking graphs. The HDF5 file can be investigated with standard HDF5 tools, tabular data is to be opened with pandas, as it is stored with its format.

Results visualization using mycelyso Inspector

However, since the raw data is only interesting if you want to perform custom analyses, it is much more straightforward to use the integrated visualization tool mycelyso Inspector as a helper to take a look at the results:

> python -m mycelyso_inspector

mycelyso Inspector will output the URL it is serving content at, and by default automatically open a browser window with it.

In mycelyso Inspector, you have various information displays: On the top, the HDF5 file / analyzed dataset / position can be selected. On the left, there is a list of graphs available. In the middle, there is the currently selected graph displayed. On the right, there is general information about the whole position (colony level statistics), below the main part is a table with information about individual tracks, and scrolled further down is the possibility to show individual graph tracking in 2D or a colony growth oversight in 3D. Sticky at the bottom is binarized or skeletonized timeline of the position.

The data to all graphs can be downloaded as tab separated text by pressing the right mouse button on a certain graph link (in the left menu) and choosing ‘Save As’.

Information: Occasional warnings in the console about invalid values are due to missing/invalid data points, and are of no particular concern.

WARNING: mycelyso Inspector will serve results from all HDF5 (.h5) files found in the current directory via an embedded webserver. Furthermore as a research tool, no special focus was laid on security, as such, you are assumed to prevent unauthorized access to the tool if you choose to use an address accessible by third parties.

Setting calibration data for TIFF files

TIFF files provide no standard way to set temporal information per frame. To set these parameters manually, e.g. a pixel size of 0.09 µm/pixel and an acquisition interval of 600 s (10 min) use:

> python -m mycelyso "the_file.tif?calibration=0.09;interval=600"

Tunable Parameters

The analysis’ internal workings are dependent upon some tunable parameters. All tunables are listed in the tunables documentation subpage. To check their current value, you can view them all using the --tunables-show command line option, which will as well print documentation. To set individual ones to a different values one can use -t SomeTunable=NewValue. Individual tunables are documented within the API documentation as well.

> python -m mycelyso --tunables-show
> python -m mycelyso -t SomeTunable=42

Docker

Docker a tool allowing for software to be run in pre-defined, encapsulated environments called containers. To run mycelyso via Docker, an image is used which is a self-contained Linux system with mycelyso installed, which can either be preloaded or will be downloaded on the fly.

Use the following commands to run mycelyso via Docker:

To analyze:

> docker run --tty --interactive --rm --volume `pwd`:/data --user `id -u` modsim/mycelyso <parameters ...>

To run mycelyso Inspector:

> docker run --tty --interactive --rm --volume `pwd`:/data --user `id -u` --publish 8888:8888 --entrypoint python modsim/mycelyso -m mycelyso_inspector <parameters ...>

To run interactive mode (display on local X11, under Linux):

> docker run --tty --interactive --rm --volume `pwd`:/data --user `id -u` --env DISPLAY=$DISPLAY --volume /tmp/.X11-unix:/tmp/.X11-unix modsim/mycelyso --interactive <parameters ...>

General remarks: --tty is used to allocate a tty, necessary for interactive usage, like --interactive which connects to stdin/stdout. The --rm switch tells docker to remove the container (not image) again after use. As aforementioned, docker is containerized, i.e. unless explicitly stated, no communication with the outside is possible. Therefore via --volume the current working directory is mapped into the container.

Third Party Licenses

Note that this software contains the following portions from other authors, under the following licenses (all BSD-flavoured):

mycelyso/pilyso/imagestack/readers/external/czifile.py:
czifile.py by Christoph Gohlke, licensed BSD (see file head).
Copyright (c) 2013-2015, Christoph Gohlke, 2013-2015, The Regents of the University of California

License

The 2-clause BSD License

Copyright (c) 2015-2019 Christian C. Sachs, Forschungszentrum Jülich GmbH. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Example HDF5 Insights

This Jupyter Notebook should give a brief overview how to programmatically analyze the HDF5 files produced by mycelyso. Please note that you can always inspect these files with mycelyso Inspector as well, this tutorial should just give you a hint how to open these files if you might want to write your own analyses.

First, it is assumed that an output.h5 is present in the current directory, with an analysis of the example dataset contained.

You can fetch the example dataset by running get-dataseth.sh or download it manually at https://zenodo.org/record/376281.

Afterwards, analyze it with:

> python -m mycelyso S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff -t BoxDetection=1

Afterwards, you will have an output.h5 in the residing in the directory.

We will be using Pandas to read our data, while the non-tabular data could easily be read with any other HDF5 compatible tool, the tabular data is layed out in a chunked format particular to Pandas, and as such it is easiest to open it with Pandas.

First, some general setup …

%matplotlib inline
%config InlineBackend.figure_formats=['svg']
import pandas
pandas.options.display.max_columns = None
import numpy as np
import networkx as nx
from networkx.readwrite import GraphMLReader

from matplotlib import pyplot, ticker
pyplot.rcParams.update({
    'figure.figsize': (10, 6), 'svg.fonttype': 'none',
    'font.sans-serif': 'Arial', 'font.family': 'sans-serif',
    'image.cmap': 'gray_r', 'image.interpolation': 'none'
})

Opening the HDF5 file

We will load the output.h5 using pandas.HDFStore

store = pandas.HDFStore('output.h5', 'r')
store
<class 'pandas.io.pytables.HDFStore'>
File path: output.h5
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/result_table                                                                          frame        (shape->[1,208])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/result_table_collected                                                                frame        (shape->[136,27])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000001            frame        (shape->[22,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000002            frame        (shape->[29,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000003            frame        (shape->[11,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000004            frame        (shape->[23,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000005            frame        (shape->[16,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000006            frame        (shape->[14,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000007            frame        (shape->[12,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000008            frame        (shape->[9,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000009            frame        (shape->[17,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000010            frame        (shape->[11,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000011            frame        (shape->[8,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000012            frame        (shape->[7,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000013            frame        (shape->[10,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000014            frame        (shape->[5,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000015            frame        (shape->[7,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000016            frame        (shape->[5,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000017            frame        (shape->[7,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000018            frame        (shape->[8,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000019            frame        (shape->[8,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_individual_track_table_aux_tables/track_table_aux_tables_000000020            frame        (shape->[7,8])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/_mapping_track_table_aux_tables/track_table_aux_tables_000000000               frame        (shape->[20,2])
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/tables/track_table/track_table_000000000                                              frame        (shape->[20,66])

Now let’s dive a bit into the HDF5 file.

Remember that HDF5 stands for Hierarchical Data Format 5 …

root = store.get_node('/')

print("Root:")
print(repr(root))
print()
print("/results:")
print(repr(root.results))
Root:
/ (RootGroup) ''
  children := ['results' (Group)]

/results:
/results (Group) ''
  children := ['mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff' (Group)]

The key names are dependent on the on-disk path of the analyzed file. Assuming there is only one file analyzed with one position in the file, we pick the first …

for image_file in root.results:
    print(image_file)
    for position in image_file:
        print(position)
        break
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff (Group) ''
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected (Group) ''

We can now investigate what data is available for that particular position

There is e.g., (binary) data, there are images, and there are various tabular datasets

print("data")
print(position.data)
for node in position.data:
    print(node)

print()

print("nodes")
print(position.images)
for node in position.images:
    print(node)

print()
data
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/data (Group) ''
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/data/banner (Group) ''
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/data/graphml (Group) ''
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/data/overall_graphml (Group) ''
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/data/tunables (Group) ''
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/data/version (Group) ''

nodes
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/images (Group) ''
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/images/binary (Group) ''
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected/images/skeleton (Group) ''

Accessing Graph and Image Data

Let’s for example start with pulling out an image from the file, and displaying it …

binary_images = list(position.images.binary)
skeleton_images = list(position.images.skeleton)

n = 120

total = len(binary_images)
assert 0 <= n < total

print("Total count of images: %d" % (total,))

fig, (ax_l, ax_r) = pyplot.subplots(1, 2, sharey=True)

fig.suptitle('Images of Timepoint #%d:' % (n,))

ax_l.imshow(binary_images[n])
ax_l.set_title('Binary Image')

ax_r.imshow(skeleton_images[n])
ax_r.set_title('Skeleton')
Total count of images: 136
Text(0.5,1,'Skeleton')
_images/Example_HDF5_Insights_12_2.svg

Let’s now take a look at the graph data present for the position, display it and overlay it onto the image data …

# The graph structure is saved in GraphML
draw_parameters = dict(node_size=25, node_color='darkgray', linewidths=0, edge_color='darkgray', with_labels=False)

#graphml_data = list([np.array(graphml).tobytes() for graphml in list(position.data.graphml)])
graphml_data = list(position.data.graphml)

graph, = GraphMLReader()(string=np.array(graphml_data[n]).tobytes())

# the following draw function needs separate positions...
# each node has its position saved as attributes:

example_node_id = list(sorted(graph.node.keys()))[1]

print("Example node: %s: %r" % (example_node_id, graph.node[example_node_id],))

other_node_id = list(sorted(graph.adj[example_node_id].keys(), reverse=True))[0]

print("Some other node: %s" % (other_node_id,))


print("The distance between the two nodes is: %.2f px" % (graph.adj[example_node_id][other_node_id]['weight']))

pyplot.title('Graph Representation of Timepoint #%d:' % (n,))

# first draw the graph,
pos = {n_id: (n['x'], n['y']) for n_id, n in graph.node.items()}
nx.draw_networkx(graph, pos=pos, **draw_parameters)

example_nodes = [graph.node[node_id] for node_id in [example_node_id, other_node_id]]

# mark on top the two choosen sample nodes
pyplot.scatter([p['x'] for p in example_nodes], [p['y'] for p in example_nodes], zorder=2)

# then show the corresponding binarized image
pyplot.imshow(binary_images[n])
Example node: 1: {'x': 543.0, 'y': 91.0}
Some other node: 4
The distance between the two nodes is: 192.05 px
<matplotlib.image.AxesImage at 0x7f89d9770128>
_images/Example_HDF5_Insights_14_2.svg

Accessing Tabular Data

In the next few cells we’ll take a look at the tabular data stored in the HDF5 file.

There is for example the result_table, which contains compounded information about the whole position:

result_table = store[position.result_table._v_pathname]
result_table
_mapping_track_table_aux_tables banner covered_area_linear_regression_intercept covered_area_linear_regression_pvalue covered_area_linear_regression_rvalue covered_area_linear_regression_slope covered_area_linear_regression_stderr covered_area_logarithmic_regression_intercept covered_area_logarithmic_regression_pvalue covered_area_logarithmic_regression_rvalue covered_area_logarithmic_regression_slope covered_area_logarithmic_regression_stderr covered_area_optimized_linear_regression_begin covered_area_optimized_linear_regression_begin_index covered_area_optimized_linear_regression_end covered_area_optimized_linear_regression_end_index covered_area_optimized_linear_regression_intercept covered_area_optimized_linear_regression_pvalue covered_area_optimized_linear_regression_rvalue covered_area_optimized_linear_regression_slope covered_area_optimized_linear_regression_stderr covered_area_optimized_logarithmic_regression_begin covered_area_optimized_logarithmic_regression_begin_index covered_area_optimized_logarithmic_regression_end covered_area_optimized_logarithmic_regression_end_index covered_area_optimized_logarithmic_regression_intercept covered_area_optimized_logarithmic_regression_pvalue covered_area_optimized_logarithmic_regression_rvalue covered_area_optimized_logarithmic_regression_slope covered_area_optimized_logarithmic_regression_stderr covered_ratio_linear_regression_intercept covered_ratio_linear_regression_pvalue covered_ratio_linear_regression_rvalue covered_ratio_linear_regression_slope covered_ratio_linear_regression_stderr covered_ratio_logarithmic_regression_intercept covered_ratio_logarithmic_regression_pvalue covered_ratio_logarithmic_regression_rvalue covered_ratio_logarithmic_regression_slope covered_ratio_logarithmic_regression_stderr covered_ratio_optimized_linear_regression_begin covered_ratio_optimized_linear_regression_begin_index covered_ratio_optimized_linear_regression_end covered_ratio_optimized_linear_regression_end_index covered_ratio_optimized_linear_regression_intercept covered_ratio_optimized_linear_regression_pvalue covered_ratio_optimized_linear_regression_rvalue covered_ratio_optimized_linear_regression_slope covered_ratio_optimized_linear_regression_stderr covered_ratio_optimized_logarithmic_regression_begin covered_ratio_optimized_logarithmic_regression_begin_index covered_ratio_optimized_logarithmic_regression_end covered_ratio_optimized_logarithmic_regression_end_index covered_ratio_optimized_logarithmic_regression_intercept covered_ratio_optimized_logarithmic_regression_pvalue covered_ratio_optimized_logarithmic_regression_rvalue covered_ratio_optimized_logarithmic_regression_slope covered_ratio_optimized_logarithmic_regression_stderr filename filename_complete graph_edge_count_linear_regression_intercept graph_edge_count_linear_regression_pvalue graph_edge_count_linear_regression_rvalue graph_edge_count_linear_regression_slope graph_edge_count_linear_regression_stderr graph_edge_count_logarithmic_regression_intercept graph_edge_count_logarithmic_regression_pvalue graph_edge_count_logarithmic_regression_rvalue graph_edge_count_logarithmic_regression_slope graph_edge_count_logarithmic_regression_stderr graph_edge_count_optimized_linear_regression_begin graph_edge_count_optimized_linear_regression_begin_index graph_edge_count_optimized_linear_regression_end graph_edge_count_optimized_linear_regression_end_index graph_edge_count_optimized_linear_regression_intercept graph_edge_count_optimized_linear_regression_pvalue graph_edge_count_optimized_linear_regression_rvalue graph_edge_count_optimized_linear_regression_slope graph_edge_count_optimized_linear_regression_stderr graph_edge_count_optimized_logarithmic_regression_begin graph_edge_count_optimized_logarithmic_regression_begin_index graph_edge_count_optimized_logarithmic_regression_end graph_edge_count_optimized_logarithmic_regression_end_index graph_edge_count_optimized_logarithmic_regression_intercept graph_edge_count_optimized_logarithmic_regression_pvalue graph_edge_count_optimized_logarithmic_regression_rvalue graph_edge_count_optimized_logarithmic_regression_slope graph_edge_count_optimized_logarithmic_regression_stderr graph_edge_length_linear_regression_intercept graph_edge_length_linear_regression_pvalue graph_edge_length_linear_regression_rvalue graph_edge_length_linear_regression_slope graph_edge_length_linear_regression_stderr graph_edge_length_logarithmic_regression_intercept graph_edge_length_logarithmic_regression_pvalue graph_edge_length_logarithmic_regression_rvalue graph_edge_length_logarithmic_regression_slope graph_edge_length_logarithmic_regression_stderr graph_edge_length_optimized_linear_regression_begin graph_edge_length_optimized_linear_regression_begin_index graph_edge_length_optimized_linear_regression_end graph_edge_length_optimized_linear_regression_end_index graph_edge_length_optimized_linear_regression_intercept graph_edge_length_optimized_linear_regression_pvalue graph_edge_length_optimized_linear_regression_rvalue graph_edge_length_optimized_linear_regression_slope graph_edge_length_optimized_linear_regression_stderr graph_edge_length_optimized_logarithmic_regression_begin graph_edge_length_optimized_logarithmic_regression_begin_index graph_edge_length_optimized_logarithmic_regression_end graph_edge_length_optimized_logarithmic_regression_end_index graph_edge_length_optimized_logarithmic_regression_intercept graph_edge_length_optimized_logarithmic_regression_pvalue graph_edge_length_optimized_logarithmic_regression_rvalue graph_edge_length_optimized_logarithmic_regression_slope graph_edge_length_optimized_logarithmic_regression_stderr graph_endpoint_count_linear_regression_intercept graph_endpoint_count_linear_regression_pvalue graph_endpoint_count_linear_regression_rvalue graph_endpoint_count_linear_regression_slope graph_endpoint_count_linear_regression_stderr graph_endpoint_count_logarithmic_regression_intercept graph_endpoint_count_logarithmic_regression_pvalue graph_endpoint_count_logarithmic_regression_rvalue graph_endpoint_count_logarithmic_regression_slope graph_endpoint_count_logarithmic_regression_stderr graph_endpoint_count_optimized_linear_regression_begin graph_endpoint_count_optimized_linear_regression_begin_index graph_endpoint_count_optimized_linear_regression_end graph_endpoint_count_optimized_linear_regression_end_index graph_endpoint_count_optimized_linear_regression_intercept graph_endpoint_count_optimized_linear_regression_pvalue graph_endpoint_count_optimized_linear_regression_rvalue graph_endpoint_count_optimized_linear_regression_slope graph_endpoint_count_optimized_linear_regression_stderr graph_endpoint_count_optimized_logarithmic_regression_begin graph_endpoint_count_optimized_logarithmic_regression_begin_index graph_endpoint_count_optimized_logarithmic_regression_end graph_endpoint_count_optimized_logarithmic_regression_end_index graph_endpoint_count_optimized_logarithmic_regression_intercept graph_endpoint_count_optimized_logarithmic_regression_pvalue graph_endpoint_count_optimized_logarithmic_regression_rvalue graph_endpoint_count_optimized_logarithmic_regression_slope graph_endpoint_count_optimized_logarithmic_regression_stderr graph_junction_count_linear_regression_intercept graph_junction_count_linear_regression_pvalue graph_junction_count_linear_regression_rvalue graph_junction_count_linear_regression_slope graph_junction_count_linear_regression_stderr graph_junction_count_logarithmic_regression_intercept graph_junction_count_logarithmic_regression_pvalue graph_junction_count_logarithmic_regression_rvalue graph_junction_count_logarithmic_regression_slope graph_junction_count_logarithmic_regression_stderr graph_junction_count_optimized_linear_regression_begin graph_junction_count_optimized_linear_regression_begin_index graph_junction_count_optimized_linear_regression_end graph_junction_count_optimized_linear_regression_end_index graph_junction_count_optimized_linear_regression_intercept graph_junction_count_optimized_linear_regression_pvalue graph_junction_count_optimized_linear_regression_rvalue graph_junction_count_optimized_linear_regression_slope graph_junction_count_optimized_linear_regression_stderr graph_junction_count_optimized_logarithmic_regression_begin graph_junction_count_optimized_logarithmic_regression_begin_index graph_junction_count_optimized_logarithmic_regression_end graph_junction_count_optimized_logarithmic_regression_end_index graph_junction_count_optimized_logarithmic_regression_intercept graph_junction_count_optimized_logarithmic_regression_pvalue graph_junction_count_optimized_logarithmic_regression_rvalue graph_junction_count_optimized_logarithmic_regression_slope graph_junction_count_optimized_logarithmic_regression_stderr graph_node_count_linear_regression_intercept graph_node_count_linear_regression_pvalue graph_node_count_linear_regression_rvalue graph_node_count_linear_regression_slope graph_node_count_linear_regression_stderr graph_node_count_logarithmic_regression_intercept graph_node_count_logarithmic_regression_pvalue graph_node_count_logarithmic_regression_rvalue graph_node_count_logarithmic_regression_slope graph_node_count_logarithmic_regression_stderr graph_node_count_optimized_linear_regression_begin graph_node_count_optimized_linear_regression_begin_index graph_node_count_optimized_linear_regression_end graph_node_count_optimized_linear_regression_end_index graph_node_count_optimized_linear_regression_intercept graph_node_count_optimized_linear_regression_pvalue graph_node_count_optimized_linear_regression_rvalue graph_node_count_optimized_linear_regression_slope graph_node_count_optimized_linear_regression_stderr graph_node_count_optimized_logarithmic_regression_begin graph_node_count_optimized_logarithmic_regression_begin_index graph_node_count_optimized_logarithmic_regression_end graph_node_count_optimized_logarithmic_regression_end_index graph_node_count_optimized_logarithmic_regression_intercept graph_node_count_optimized_logarithmic_regression_pvalue graph_node_count_optimized_logarithmic_regression_rvalue graph_node_count_optimized_logarithmic_regression_slope graph_node_count_optimized_logarithmic_regression_stderr meta_pos meta_t metadata overall_graphml track_table track_table_aux_tables tunables version
0 0 0 -209.368383 2.532537e-24 0.734525 0.008969 0.000716 NaN NaN NaN NaN NaN 39345.176144 65 78338.287784 130 -994.607791 1.677850e-22 0.884206 0.020906 0.001391 47147.290182 78 78338.287784 130 -2.303539 1.205272e-63 0.998338 0.000119 9.727372e-07 -0.028316 2.532537e-24 0.734525 0.000001 9.681107e-08 NaN NaN NaN NaN NaN 39345.176144 65 78338.287784 130 -0.134516 1.677850e-22 0.884206 0.000003 1.881839e-07 47147.290182 78 78338.287784 130 -11.211959 1.205272e-63 0.998338 0.000119 9.727372e-07 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff /mycelyso/S_lividans_TK24_Complex_Medium_nd046... -28.385481 6.207684e-15 0.604935 0.001209 0.000138 NaN NaN NaN NaN NaN 54942.33151 91 81340.338617 136 -445.363712 4.994880e-15 0.873456 0.007417 0.000631 54942.33151 91 81340.338617 136 -8.772886 3.728079e-27 0.966964 0.000178 0.000007 -189.301864 6.799061e-22 0.706908 0.008101 0.0007 NaN NaN NaN NaN NaN 39345.176144 65 81340.338617 136 -1139.396801 1.110753e-23 0.877234 0.023302 0.001535 47147.290182 78 81340.338617 136 -2.78033 3.708275e-66 0.997503 0.000123 0.000001 -10.07769 1.265490e-16 0.633514 0.000465 0.000049 NaN NaN NaN NaN NaN 54942.33151 91 81340.338617 136 -157.23131 1.693324e-16 0.892893 0.002662 0.000205 54942.33151 91 81340.338617 136 -6.582629 2.789480e-35 0.986286 0.000136 0.000003 -11.862853 3.182848e-15 0.61005 0.00048 0.000054 NaN NaN NaN NaN NaN 54942.33151 91 78338.287784 130 -110.650737 1.217144e-17 0.929788 0.001887 0.000123 62741.237858 104 78338.287784 130 -6.592383 2.291108e-19 0.983605 0.000134 0.000005 -21.940543 5.114994e-16 0.623593 0.000945 0.000102 NaN NaN NaN NaN NaN 54942.33151 91 81340.338617 136 -333.239213 8.587192e-16 0.883997 0.005585 0.00045 54942.33151 91 81340.338617 136 -7.695156 7.400355e-30 0.975361 0.00016 0.000006 0 -1 0 0 21 0 0

Then there is the result_table_collected, which contains collected information about every single frame of the time series of one position:

result_table_collected = store[position.result_table_collected._v_pathname]
result_table_collected
area binary calibration covered_area covered_ratio crop_b crop_l crop_r crop_t filename graph_edge_count graph_edge_length graph_endpoint_count graph_junction_count graph_node_count graphml image_sha256_hash input_height input_width meta_pos meta_t metadata shift_x shift_y skeleton timepoint tunables_hash
0 7393.965475 0 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 0 FLHyF8lkwKef9Q9yEWsgOFzYc4qFCpKyirTRsfsR7/g= 128.245 57.655 0 0 3.0 3.0 0 356.745246 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
1 7393.965475 1 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 1 494VC0oqeVoCO/0IYeZnowKoultCZe+iYTW5/xRIfXQ= 128.245 57.655 0 1 0.0 0.0 1 954.331815 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
2 7393.965475 2 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 2 kg3NjTylgz8a9Z7wnSSmEgxZHxP0tAaj1dxCWuGaMec= 128.245 57.655 0 2 -3.0 -2.0 2 1548.970068 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
3 7393.965475 3 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 3 S6KmMEQmUxMdLbpBnAyTs01xKaGIBjtgP1g/Raq9zqg= 128.245 57.655 0 3 -6.0 -4.0 3 2152.429459 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
4 7393.965475 4 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 4 EM4yxCU5tahPntThJVNQtAus2R69jCszYck1ZHFDhX4= 128.245 57.655 0 4 -4.0 -5.0 4 2754.315663 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
5 7393.965475 5 0.065 11.766625 0.001591 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 5.5 22.899434 5 0 5 5 c+9vT5uE1ozpUvzrkp1EQcG03GORVwOTjxjrZqRPQn4= 128.245 57.655 0 5 -9.0 -5.0 5 3349.845006 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
6 7393.965475 6 0.065 21.931975 0.002966 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 15.5 41.708488 11 1 12 6 xvSVz5s+PLa4Sj8oHuz83v2KXW8W//20bogdtZYFYps= 128.245 57.655 0 6 -8.0 -4.0 6 3954.256373 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
7 7393.965475 7 0.065 18.877300 0.002553 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 11.5 38.285793 9 0 9 7 LDTibVqcoMtulQHwHHQUgtHV1xUFeIk+AnZxudajBL0= 128.245 57.655 0 7 -7.0 -6.0 7 4548.847011 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
8 7393.965475 8 0.065 11.306100 0.001529 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 9.0 21.241934 7 0 7 8 a3O6yoCLPmRkTBo/O7VFHi62Yc2lxx3w7b4BXKCskPk= 128.245 57.655 0 8 -8.0 -5.0 8 5149.800172 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
9 7393.965475 9 0.065 19.612450 0.002652 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 19.0 37.788097 12 3 15 9 R8zOCET5fdw+UveaB1/weWXLjxRewlTgsh6JAe1cl2A= 128.245 57.655 0 9 -9.0 -3.0 9 5747.743609 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
10 7393.965475 10 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 10 bwg71JuWU476X8llCcc7HIpK2W+telAz9PmUgbbG3GI= 128.245 57.655 0 10 -5.0 -4.0 10 6346.900296 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
11 7393.965475 11 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 11 58LrEPmBMhek4StJU2otfhjiYm3Im5//cRvAgkj05mo= 128.245 57.655 0 11 -4.0 -6.0 11 6946.751259 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
12 7393.965475 12 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 12 gpa2zMzRM8K2KE6Lr2AxIaLb+F/gdhuX8XrpRDvxlv8= 128.245 57.655 0 12 -4.0 -5.0 12 7543.367799 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
13 7393.965475 13 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 13 /KsfU2o48XgIY2W1oXsqn6nHxUHs/J/Wv1Z7nj0ZZOk= 128.245 57.655 0 13 -7.0 -4.0 13 8144.258055 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
14 7393.965475 14 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 14 DxApSHRIomGrqNpBitjQEo7QhFrEynEJ8ZmKJrvplnY= 128.245 57.655 0 14 -2.0 -4.0 14 8747.270315 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
15 7393.965475 15 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 15 Co1f04WWFLOobP5pOvdHqNsqTWIINGAZDb73YRPrEMo= 128.245 57.655 0 15 -2.0 -5.0 15 9342.921723 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
16 7393.965475 16 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 16 c4qXuABN6T/+Kqhl1Mu+dDc4DeaFoA6/+/P0O1oXurs= 128.245 57.655 0 16 -4.0 -5.0 16 9944.746882 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
17 7393.965475 17 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 17 rW1XbA7JoDeobq+O88KRJPV2sIinal/XU9yWVK5duzs= 128.245 57.655 0 17 -4.0 -6.0 17 10546.833173 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
18 7393.965475 18 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 18 4VRvPwGvoi38OdaAH11CJhGkpwIjLmbVoXU9VPxOjpw= 128.245 57.655 0 18 -2.0 -6.0 18 11142.278725 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
19 7393.965475 19 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 19 lGBlKy1m69uZFS4+z2qOu01U4TAepF98z5Qy0rgpKq4= 128.245 57.655 0 19 -4.0 -5.0 19 11748.821861 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
20 7393.965475 20 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 20 suQeImrAqjZDCOeXIo7jXiAo1EbKWi7RHyjg/K92eeo= 128.245 57.655 0 20 -5.0 -5.0 20 12354.980074 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
21 7393.965475 21 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 21 g/nSp2+luy9+GumMUPJZjNTIq/fEsVAZDftXGWzWeT8= 128.245 57.655 0 21 -3.0 -5.0 21 12944.765587 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
22 7393.965475 22 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 22 BovPeepsLCC72gmUDKXJRPCAlQ62ZbcCw6khY2exoVQ= 128.245 57.655 0 22 -2.0 -7.0 22 13545.854889 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
23 7393.965475 23 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 23 6ddbC20/XQcL62LLIthfgKK1+hZ471gas/x47xAErgU= 128.245 57.655 0 23 -5.0 -6.0 23 14146.223223 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
24 7393.965475 24 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 24 sKWUFcK2/AkvT7VsD479I5RyUSh42fg419mJ+7NGElc= 128.245 57.655 0 24 -2.0 -4.0 24 14748.335994 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
25 7393.965475 25 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 25 5j1pPeyhTmt8DTk2PXJJY+qXzQLof67lF3iSqHQ7fYs= 128.245 57.655 0 25 3.0 -6.0 25 15343.735260 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
26 7393.965475 26 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 26 uhGgSzijhmEGPdb+vseY5QkDZXRZDiSaAgKqGYgLNY4= 128.245 57.655 0 26 1.0 -7.0 26 15953.863397 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
27 7393.965475 27 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 27 VXsOEGRfM7I4HccxdR/32rUj3tZrSypiQk5SFztQ8BQ= 128.245 57.655 0 27 0.0 -4.0 27 16542.758080 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
28 7393.965475 28 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 28 vjbM5PQTup+sY2oxC7pA0TkBf5sE8TQnR+EkW02XyPU= 128.245 57.655 0 28 0.0 -4.0 28 17142.263416 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
29 7393.965475 29 0.065 0.000000 0.000000 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 0.0 0.000000 0 0 0 29 SO9ouW//cxEuF6b5JioGV6TFtg5CsMLKAoTdx8TPIis= 128.245 57.655 0 29 0.0 -7.0 29 17740.279887 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
106 7393.965475 106 0.065 210.666950 0.028492 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 19.5 170.239411 9 8 17 106 uAHtyApJzNnPOYnpdVOIKWkvOYSmlCkO8ZC9u2gta5o= 128.245 57.655 0 106 0.0 -1.0 106 63947.249755 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
107 7393.965475 107 0.065 207.519325 0.028066 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 20.0 180.808115 10 7 17 107 25jns/xT4PLo4Jxf505fLowf+A2qcVQmWq4ke+5VCMI= 128.245 57.655 0 107 4.0 -2.0 107 64543.707035 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
108 7393.965475 108 0.065 219.763375 0.029722 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 21.5 190.435276 11 7 18 108 OWqQprg2kii5dkmOoNCNbmM2z3lehAazAPO9IRYf9Xo= 128.245 57.655 0 108 2.0 -1.0 108 65139.869557 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
109 7393.965475 109 0.065 247.859625 0.033522 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 25.5 195.382602 12 10 22 109 1qt2o2cQ3+57QE0ZsjDBJPnuBVSWuafV54gucUCPje8= 128.245 57.655 0 109 -1.0 0.0 109 65741.778848 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
110 7393.965475 110 0.065 264.658225 0.035794 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 25.5 210.104377 13 10 23 110 fq3wG1zJ0pYaf1oRLGPElzHf1YE1Qx/TNhCJecgfw48= 128.245 57.655 0 110 0.0 -1.0 110 66340.189219 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
111 7393.965475 111 0.065 280.556900 0.037944 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 39.5 235.773869 18 15 33 111 vSbq+a0wytKuNcRRbUhf8pTJSyWM4kGIuD4SO1R5lh8= 128.245 57.655 0 111 -1.0 -1.0 111 66943.783533 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
112 7393.965475 112 0.065 294.051550 0.039769 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 35.5 248.187748 16 14 30 112 EyE6YpZWqRtaLGY6P7Ls5SbX4NOCZSIt+79qYEa7CfQ= 128.245 57.655 0 112 -2.0 -1.0 112 67544.224723 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
113 7393.965475 113 0.065 316.444050 0.042798 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 36.5 260.646633 17 14 31 113 xMiJu6s5Aibr9FDuX53pjMfDo/NdaTfDU1JBizujn+M= 128.245 57.655 0 113 -3.0 -1.0 113 68144.223215 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
114 7393.965475 114 0.065 342.820725 0.046365 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 40.0 281.374211 19 15 34 114 K+xpRjw5CaAnpr5Wn+S3JBznhdGApuFuWaRgIzjrD98= 128.245 57.655 0 114 -2.0 -2.0 114 68741.153508 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
115 7393.965475 115 0.065 370.257875 0.050076 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 40.5 312.852562 18 16 34 115 Mb4MgU9eSza1UKpwZMoYe9vFydo+CgkQIXXlqImQsT0= 128.245 57.655 0 115 -3.0 -2.0 115 69343.336711 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
116 7393.965475 116 0.065 400.344100 0.054145 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 46.5 336.659457 22 17 39 116 YhrWJOJHelwSMWZ5cireuPWOQerJ3ncgmYWSDmrdeq0= 128.245 57.655 0 116 -6.0 0.0 116 69940.686151 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
117 7393.965475 117 0.065 433.286425 0.058600 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 47.5 368.660910 20 18 38 117 sE4DE63xAmb5NKVMReP7pab2izYSVM6UJAm5DkN0VXg= 128.245 57.655 0 117 -5.0 -1.0 117 70540.386399 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
118 7393.965475 118 0.065 481.265525 0.065089 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 46.5 411.026463 20 18 38 118 81kFT/ZS0drUpl6kKYXzQw/XjlQzxIzPAmd3nL11+jg= 128.245 57.655 0 118 -4.0 -3.0 118 71141.753863 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
119 7393.965475 119 0.065 528.095425 0.071422 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 46.5 442.766625 21 19 40 119 M82K/jsBao445C6NKVnTNij+l6tWyNlSw353uGNiDLY= 128.245 57.655 0 119 -2.0 -3.0 119 71748.778771 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
120 7393.965475 120 0.065 588.665025 0.079614 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 52.0 501.050286 24 19 43 120 uzYdD+ar88aFulsNSqkm0WcNqly45OVPfXdiC2PoGn4= 128.245 57.655 0 120 1.0 -1.0 120 72342.288541 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
121 7393.965475 121 0.065 637.928525 0.086277 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 57.5 542.781477 25 22 47 121 Xnoke73h5X3pqffz22tt/XS5zFL58NQRj3FRRLRVdh0= 128.245 57.655 0 121 1.0 -1.0 121 72942.162923 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
122 7393.965475 122 0.065 616.833100 0.083424 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 60.0 561.784642 25 23 48 122 /xYS1ZdSkDs7iGCM7EUOEplVF6IvONSJfQS/gUjYfbo= 128.245 57.655 0 122 3.0 -3.0 122 73543.257127 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
123 7393.965475 123 0.065 735.441525 0.099465 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 73.5 630.276997 31 29 60 123 u74v7IA9x4990zS2p78PeME6W+CjG3X2WQCoCt4zpzM= 128.245 57.655 0 123 -1.0 -1.0 123 74140.149509 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
124 7393.965475 124 0.065 780.298350 0.105532 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 79.5 682.208179 32 31 63 124 OoMxDjS6CVZqgFUIt9i3uE3edYm+cQgUGHmVAfoMCpk= 128.245 57.655 0 124 -2.0 -2.0 124 74739.753889 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
125 7393.965475 125 0.065 821.783625 0.111142 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 90.5 720.402085 34 37 71 125 QunbYZfVig1yXaR7CahU9lp7tbutNgRNCV2trlfH2ag= 128.245 57.655 0 125 -2.0 -3.0 125 75342.294086 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
126 7393.965475 126 0.065 840.644025 0.113693 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 94.5 750.562416 37 37 74 126 WxArF1YP7mcIyfJ5BwCADhyzu3HjH/EArvQ/ughWwag= 128.245 57.655 0 126 -2.0 -1.0 126 75940.191470 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
127 7393.965475 127 0.065 853.923200 0.115489 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 109.5 773.762895 42 42 84 127 JNQ60hSinRysv9iHUDlvWbajC3pxmetHJCy4umA78k8= 128.245 57.655 0 127 -4.0 -1.0 127 76540.684802 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
128 7393.965475 128 0.065 908.451050 0.122864 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 120.5 826.868598 45 48 93 128 DM/8MVnM0IlU4i6dsYVg6pvjKOEQ0G4+ie+lacKNzto= 128.245 57.655 0 128 -4.0 -1.0 128 77143.279996 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
129 7393.965475 129 0.065 928.084625 0.125519 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 137.0 854.965852 56 51 107 129 vJ6ddwOacUWSEuKgYavl9YYYDhHkZ22SGGd6i5nCv5s= 128.245 57.655 0 129 -3.0 -3.0 129 77739.277364 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
130 7393.965475 130 0.065 995.219875 0.134599 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 164.5 931.113953 59 65 124 130 EMfLUv7Hu2b7NJOcjA4BGr748D3i+uQYqBR3D1+Olyk= 128.245 57.655 0 130 -5.0 -2.0 130 78338.287784 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
131 7393.965475 131 0.065 1042.451150 0.140987 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 177.5 982.963010 63 70 133 131 PZNqH1IrTEzf49uuqlNYGyjdzrx4buvzZJonsP68Etg= 128.245 57.655 0 131 -5.0 -2.0 131 78943.246053 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
132 7393.965475 132 0.065 1043.646825 0.141148 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 186.0 982.474030 61 75 136 132 1fAdMd5ruK5y/zwSWuqWqcCelW2sBWElCNhU6zhaovY= 128.245 57.655 0 132 1.0 -2.0 132 79540.788485 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
133 7393.965475 133 0.065 1023.569625 0.138433 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 191.5 1029.805448 73 73 146 133 bUVUBoCP3NhJCFHhGjHu3czbHLuJQxTkg2iCE6jqeJs= 128.245 57.655 0 133 7.0 -3.0 133 80140.704110 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
134 7393.965475 134 0.065 1035.670025 0.140070 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 218.5 1074.944651 85 80 165 134 mh5CCpK+8DkzZ0Jb95x+XF1OLShiK/B/12l78G/UVgY= 128.245 57.655 0 134 5.0 -1.0 134 80741.868186 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...
135 7393.965475 135 0.065 1135.342000 0.153550 1978 754 1642 4 S_lividans_TK24_Complex_Medium_nd046_138.ome.tiff 279.0 1201.021333 96 113 209 135 ZdYdZ9ud5oLdOJP5XVD1633MzPXv4GR6EjzZLtCgpNo= 128.245 57.655 0 135 4.0 0.0 135 81340.338617 VERSION:1:SHA256:iNevP0W3i5SsPhjSobMn0xCxU+e/Y...

136 rows × 27 columns

The per-frame informations contain e.g. the graph length (i.e. the mycelium length), which can be plotted over time:

timepoint = result_table_collected.timepoint / (60*60)
length = result_table_collected.graph_edge_length

pyplot.title('Length over Time')

pyplot.xlabel('Time [h]')
pyplot.ylabel('Length [µm]')

pyplot.plot(timepoint, length)
[<matplotlib.lines.Line2D at 0x7f89d964edd8>]
_images/Example_HDF5_Insights_20_1.svg

Last but not least, we will look at mycelium level tracking data in the track_table. The track_table is a level deeper in the HDF5 structure, next to tables with individual tracks.

track_table = store[list(position.tables.track_table)[0]._v_pathname]
track_table
aux_table count duration logarithmic_normalized_regression_intercept logarithmic_normalized_regression_pvalue logarithmic_normalized_regression_rvalue logarithmic_normalized_regression_slope logarithmic_normalized_regression_stderr logarithmic_plain_regression_intercept logarithmic_plain_regression_pvalue logarithmic_plain_regression_rvalue logarithmic_plain_regression_slope logarithmic_plain_regression_stderr maximum_distance maximum_distance_num minimum_distance minimum_distance_num normalized_regression_intercept normalized_regression_pvalue normalized_regression_rvalue normalized_regression_slope normalized_regression_stderr optimized_logarithmic_normalized_regression_begin optimized_logarithmic_normalized_regression_begin_index optimized_logarithmic_normalized_regression_end optimized_logarithmic_normalized_regression_end_index optimized_logarithmic_normalized_regression_intercept optimized_logarithmic_normalized_regression_pvalue optimized_logarithmic_normalized_regression_rvalue optimized_logarithmic_normalized_regression_slope optimized_logarithmic_normalized_regression_stderr optimized_logarithmic_regression_begin optimized_logarithmic_regression_begin_index optimized_logarithmic_regression_end optimized_logarithmic_regression_end_index optimized_logarithmic_regression_intercept optimized_logarithmic_regression_pvalue optimized_logarithmic_regression_rvalue optimized_logarithmic_regression_slope optimized_logarithmic_regression_stderr optimized_normalized_regression_begin optimized_normalized_regression_begin_index optimized_normalized_regression_end optimized_normalized_regression_end_index optimized_normalized_regression_intercept optimized_normalized_regression_pvalue optimized_normalized_regression_rvalue optimized_normalized_regression_slope optimized_normalized_regression_stderr optimized_regression_begin optimized_regression_begin_index optimized_regression_end optimized_regression_end_index optimized_regression_intercept optimized_regression_pvalue optimized_regression_rvalue optimized_regression_slope optimized_regression_stderr plain_regression_intercept plain_regression_pvalue plain_regression_rvalue plain_regression_slope plain_regression_stderr timepoint_begin timepoint_center timepoint_end
0 0 22 12596.588071 -7.600037 1.711806e-24 0.997499 0.000182 0.000003 -5.825405 1.711806e-24 0.997499 0.000182 0.000003 57.906361 1.0 5.898107 1.0 -29.091215 1.307881e-14 0.975429 0.000686 0.000035 42345.743439 0 54942.331510 21 -7.700575 1.019580e-23 0.997723 0.000184 0.000003 42345.743439 0 54942.331510 21 -5.925944 1.019580e-23 0.997723 0.000184 0.000003 42345.743439 0 54942.331510 21 -27.740900 4.146086e-14 0.976412 0.000657 0.000033 42345.743439 0 54942.331510 21 -163.618808 4.146086e-14 0.976412 0.003874 0.000197 -171.583111 1.307881e-14 0.975429 0.004046 0.000204 42345.743439 48644.037475 54942.331510
1 1 29 16795.074294 -4.477290 1.479542e-29 0.995785 0.000078 0.000001 -0.891770 1.479542e-29 0.995785 0.000078 0.000001 141.762974 10.0 36.072102 1.0 -9.033740 1.851875e-28 0.994916 0.000169 0.000003 58547.219791 0 75342.294086 29 -4.477290 1.479542e-29 0.995785 0.000078 0.000001 58547.219791 0 75342.294086 29 -0.891770 1.479542e-29 0.995785 0.000078 0.000001 58547.219791 0 75342.294086 29 -9.033740 1.851875e-28 0.994916 0.000169 0.000003 58547.219791 0 75342.294086 29 -325.865976 1.851875e-28 0.994916 0.006103 0.000119 -325.865976 1.851875e-28 0.994916 0.006103 0.000119 58547.219791 66944.756938 75342.294086
2 2 11 5999.376544 -15.868380 6.611100e-08 0.982767 0.000263 0.000016 -15.056252 6.611100e-08 0.982767 0.000263 0.000016 11.042346 3.0 2.252696 1.0 -40.384477 4.331466e-12 0.997984 0.000677 0.000014 60944.406990 0 66943.783533 11 -15.868380 6.611100e-08 0.982767 0.000263 0.000016 60944.406990 0 66943.783533 11 -15.056252 6.611100e-08 0.982767 0.000263 0.000016 60944.406990 0 66943.783533 11 -40.384477 4.331466e-12 0.997984 0.000677 0.000014 60944.406990 0 66943.783533 11 -90.973931 4.331466e-12 0.997984 0.001525 0.000032 -90.973931 4.331466e-12 0.997984 0.001525 0.000032 60944.406990 63944.095262 66943.783533
3 3 23 13195.742519 -5.125910 7.206502e-28 0.998462 0.000085 0.000001 -1.566050 7.206502e-28 0.998462 0.000085 0.000001 111.155492 8.0 35.158275 1.0 -8.832037 1.632991e-21 0.993789 0.000160 0.000004 60944.406990 0 74140.149509 23 -5.125910 7.206502e-28 0.998462 0.000085 0.000001 60944.406990 0 74140.149509 23 -1.566050 7.206502e-28 0.998462 0.000085 0.000001 60944.406990 0 74140.149509 23 -8.832037 1.632991e-21 0.993789 0.000160 0.000004 60944.406990 0 74140.149509 23 -310.519177 1.632991e-21 0.993789 0.005611 0.000137 -310.519177 1.632991e-21 0.993789 0.005611 0.000137 60944.406990 67542.278249 74140.149509
4 4 16 8999.505265 -21.524270 1.726340e-09 0.964524 0.000350 0.000026 -21.201628 1.726340e-09 0.964524 0.000350 0.000026 44.678233 2.0 1.380772 1.0 -223.912438 1.341946e-12 0.987353 0.003504 0.000150 63342.783276 0 72342.288541 15 -22.604725 5.227294e-09 0.965929 0.000367 0.000027 63342.783276 0 72342.288541 15 -22.282082 5.227294e-09 0.965929 0.000367 0.000027 63342.783276 0 72342.288541 15 -215.096004 7.149179e-12 0.987747 0.003370 0.000148 63342.783276 0 72342.288541 15 -296.998464 7.149179e-12 0.987747 0.004654 0.000204 -309.171945 1.341946e-12 0.987353 0.004838 0.000208 63342.783276 67842.535909 72342.288541
5 5 14 7801.478279 -23.838927 1.409835e-09 0.978374 0.000370 0.000023 -23.438081 1.409835e-09 0.978374 0.000370 0.000023 41.950146 6.0 1.493087 1.0 -185.970032 6.770607e-07 0.938601 0.002806 0.000298 65741.778848 0 73543.257127 14 -23.838927 1.409835e-09 0.978374 0.000370 0.000023 65741.778848 0 73543.257127 14 -23.438081 1.409835e-09 0.978374 0.000370 0.000023 65741.778848 0 73543.257127 14 -185.970032 6.770607e-07 0.938601 0.002806 0.000298 65741.778848 0 73543.257127 14 -277.669359 6.770607e-07 0.938601 0.004190 0.000445 -277.669359 6.770607e-07 0.938601 0.004190 0.000445 65741.778848 69642.517987 73543.257127
6 6 12 6600.509694 -43.722131 3.190588e-05 0.914065 0.000690 0.000097 -46.108926 3.190588e-05 0.914065 0.000690 0.000097 23.474375 1.0 0.091924 1.0 -2616.983966 1.009138e-08 0.983252 0.039382 0.002308 65741.778848 0 72342.288541 12 -43.722131 3.190588e-05 0.914065 0.000690 0.000097 65741.778848 0 72342.288541 12 -46.108926 3.190588e-05 0.914065 0.000690 0.000097 65741.778848 0 72342.288541 12 -2616.983966 1.009138e-08 0.983252 0.039382 0.002308 65741.778848 0 72342.288541 12 -240.563324 1.009138e-08 0.983252 0.003620 0.000212 -240.563324 1.009138e-08 0.983252 0.003620 0.000212 65741.778848 69042.033694 72342.288541
7 7 9 4801.564644 -30.119407 1.333225e-05 0.970975 0.000459 0.000043 -30.124026 1.333225e-05 0.970975 0.000459 0.000043 12.486205 2.0 0.995391 1.0 -138.693554 1.941910e-04 0.937004 0.002094 0.000295 66340.189219 0 71141.753863 9 -30.119407 1.333225e-05 0.970975 0.000459 0.000043 66340.189219 0 71141.753863 9 -30.124026 1.333225e-05 0.970975 0.000459 0.000043 66340.189219 0 71141.753863 9 -138.693554 1.941910e-04 0.937004 0.002094 0.000295 66340.189219 0 71141.753863 9 -138.054322 1.941910e-04 0.937004 0.002084 0.000294 -138.054322 1.941910e-04 0.937004 0.002084 0.000294 66340.189219 68740.971541 71141.753863
8 8 17 9596.901268 -22.271064 1.733538e-09 0.957300 0.000343 0.000027 -21.766331 1.733538e-09 0.957300 0.000343 0.000027 57.441002 1.0 1.656543 1.0 -242.634692 9.760773e-15 0.991591 0.003592 0.000121 66943.783533 0 76540.684802 17 -22.271064 1.733538e-09 0.957300 0.000343 0.000027 66943.783533 0 76540.684802 17 -21.766331 1.733538e-09 0.957300 0.000343 0.000027 66943.783533 0 76540.684802 17 -242.634692 9.760773e-15 0.991591 0.003592 0.000121 66943.783533 0 76540.684802 17 -401.934870 9.760773e-15 0.991591 0.005950 0.000201 -401.934870 9.760773e-15 0.991591 0.005950 0.000201 66943.783533 71742.234168 76540.684802
9 9 11 5998.379390 -29.357547 1.979017e-06 0.963090 0.000446 0.000042 -29.552716 1.979017e-06 0.963090 0.000446 0.000042 15.516987 1.0 0.822696 1.0 -194.768001 4.833247e-09 0.990387 0.002907 0.000135 66943.783533 0 72942.162923 11 -29.357547 1.979017e-06 0.963090 0.000446 0.000042 66943.783533 0 72942.162923 11 -29.552716 1.979017e-06 0.963090 0.000446 0.000042 66943.783533 0 72942.162923 11 -194.768001 4.833247e-09 0.990387 0.002907 0.000135 66943.783533 0 72942.162923 11 -160.234763 4.833247e-09 0.990387 0.002392 0.000111 -160.234763 4.833247e-09 0.990387 0.002392 0.000111 66943.783533 69942.973228 72942.162923
10 10 8 4198.065326 -48.245996 6.569861e-06 0.986152 0.000710 0.000049 -48.636193 6.569861e-06 0.986152 0.000710 0.000049 11.633879 1.0 0.676924 1.0 -275.022799 1.801673e-05 0.980590 0.004022 0.000328 68144.223215 0 72342.288541 8 -48.245996 6.569861e-06 0.986152 0.000710 0.000049 68144.223215 0 72342.288541 8 -48.636193 6.569861e-06 0.986152 0.000710 0.000049 68144.223215 0 72342.288541 8 -275.022799 1.801673e-05 0.980590 0.004022 0.000328 68144.223215 0 72342.288541 8 -186.169501 1.801673e-05 0.980590 0.002722 0.000222 -186.169501 1.801673e-05 0.980590 0.002722 0.000222 68144.223215 70243.255878 72342.288541
11 11 7 3600.022869 -47.066691 5.996060e-04 0.960051 0.000645 0.000084 -46.870044 5.996060e-04 0.960051 0.000645 0.000084 14.274661 1.0 1.217315 1.0 -220.575522 1.034271e-07 0.998762 0.003009 0.000067 73543.257127 0 77143.279996 6 -53.306342 1.709971e-03 0.966044 0.000729 0.000097 73543.257127 0 77143.279996 6 -53.109695 1.709971e-03 0.966044 0.000729 0.000097 73543.257127 0 77143.279996 6 -215.315060 2.582288e-06 0.998688 0.002938 0.000075 73543.257127 0 77143.279996 6 -262.106238 2.582288e-06 0.998688 0.003576 0.000092 -268.509877 1.034271e-07 0.998762 0.003662 0.000082 73543.257127 75343.268562 77143.279996
12 12 10 5400.638976 -53.862847 4.870276e-09 0.994214 0.000728 0.000028 -54.398991 4.870276e-09 0.994214 0.000728 0.000028 24.758931 2.0 0.585000 1.0 -604.374842 1.170390e-04 0.926455 0.008061 0.001158 74140.149509 0 79540.788485 9 -56.645897 4.971286e-09 0.996980 0.000764 0.000023 74140.149509 0 79540.788485 9 -57.182041 4.971286e-09 0.996980 0.000764 0.000023 74140.149509 0 79540.788485 9 -546.454943 9.685289e-04 0.899213 0.007296 0.001342 74140.149509 0 79540.788485 9 -319.676142 9.685289e-04 0.899213 0.004268 0.000785 -353.559282 1.170390e-04 0.926455 0.004716 0.000677 74140.149509 76840.468997 79540.788485
13 13 5 2400.535293 -16.201586 1.183782e-04 0.997865 0.000219 0.000008 -12.961744 1.183782e-04 0.997865 0.000219 0.000008 43.186267 2.0 25.529693 1.0 -20.386272 1.192592e-06 0.999900 0.000288 0.000002 74140.149509 0 76540.684802 5 -16.201586 1.183782e-04 0.997865 0.000219 0.000008 74140.149509 0 76540.684802 5 -12.961744 1.183782e-04 0.997865 0.000219 0.000008 74140.149509 0 76540.684802 5 -20.386272 1.192592e-06 0.999900 0.000288 0.000002 74140.149509 0 76540.684802 5 -520.455259 1.192592e-06 0.999900 0.007363 0.000060 -520.455259 1.192592e-06 0.999900 0.007363 0.000060 74140.149509 75340.417155 76540.684802
14 14 7 3598.533895 -16.153025 4.230040e-06 0.994534 0.000217 0.000010 -12.834299 4.230040e-06 0.994534 0.000217 0.000010 60.150146 6.0 27.625136 1.0 -23.722413 8.119266e-10 0.999822 0.000331 0.000003 74739.753889 0 78338.287784 6 -17.117733 2.071218e-05 0.996282 0.000229 0.000010 74739.753889 0 78338.287784 6 -13.799007 2.071218e-05 0.996282 0.000229 0.000010 74739.753889 0 78338.287784 6 -23.752887 1.191299e-07 0.999718 0.000331 0.000004 74739.753889 0 78338.287784 6 -656.176742 1.191299e-07 0.999718 0.009145 0.000109 -655.334883 8.119266e-10 0.999822 0.009134 0.000077 74739.753889 76539.020837 78338.287784
15 15 5 2398.096314 -68.488528 2.257037e-03 0.984743 0.000904 0.000092 -68.048039 2.257037e-03 0.984743 0.000904 0.000092 13.458499 2.0 1.553467 1.0 -248.736869 7.521336e-04 0.992672 0.003283 0.000231 75940.191470 0 78338.287784 5 -68.488528 2.257037e-03 0.984743 0.000904 0.000092 75940.191470 0 78338.287784 5 -68.048039 2.257037e-03 0.984743 0.000904 0.000092 75940.191470 0 78338.287784 5 -248.736869 7.521336e-04 0.992672 0.003283 0.000231 75940.191470 0 78338.287784 5 -386.404560 7.521336e-04 0.992672 0.005099 0.000358 -386.404560 7.521336e-04 0.992672 0.005099 0.000358 75940.191470 77139.239627 78338.287784
16 16 7 3600.019308 -49.432006 1.254883e-03 0.946159 0.000651 0.000100 -49.208246 1.254883e-03 0.946159 0.000651 0.000100 13.193879 3.0 1.250772 1.0 -226.581932 4.779667e-05 0.985555 0.002972 0.000228 76540.684802 0 80140.704110 6 -59.321733 1.200094e-03 0.971580 0.000779 0.000095 76540.684802 0 80140.704110 6 -59.097972 1.200094e-03 0.971580 0.000779 0.000095 76540.684802 0 80140.704110 6 -253.568080 2.703497e-05 0.995752 0.003320 0.000154 76540.684802 0 80140.704110 6 -317.155764 2.703497e-05 0.995752 0.004153 0.000192 -283.402256 4.779667e-05 0.985555 0.003717 0.000286 76540.684802 78340.694456 80140.704110
17 17 8 4201.183384 -56.353086 8.712980e-04 0.928338 0.000745 0.000122 -56.645388 8.712980e-04 0.928338 0.000745 0.000122 20.648160 2.0 0.746543 1.0 -515.121693 2.645955e-06 0.989783 0.006731 0.000396 76540.684802 0 80741.868186 8 -56.353086 8.712980e-04 0.928338 0.000745 0.000122 76540.684802 0 80741.868186 8 -56.645388 8.712980e-04 0.928338 0.000745 0.000122 76540.684802 0 80741.868186 8 -515.121693 2.645955e-06 0.989783 0.006731 0.000396 76540.684802 0 80741.868186 8 -384.560643 2.645955e-06 0.989783 0.005025 0.000296 -384.560643 2.645955e-06 0.989783 0.005025 0.000296 76540.684802 78641.276494 80741.868186
18 18 8 4201.183384 -47.728816 5.333120e-04 0.939326 0.000630 0.000094 -46.987604 5.333120e-04 0.939326 0.000630 0.000094 29.877832 4.0 2.098478 1.0 -284.175628 2.057823e-04 0.956015 0.003721 0.000466 76540.684802 0 80741.868186 8 -47.728816 5.333120e-04 0.939326 0.000630 0.000094 76540.684802 0 80741.868186 8 -46.987604 5.333120e-04 0.939326 0.000630 0.000094 76540.684802 0 80741.868186 8 -284.175628 2.057823e-04 0.956015 0.003721 0.000466 76540.684802 0 80741.868186 8 -596.336198 2.057823e-04 0.956015 0.007807 0.000978 -596.336198 2.057823e-04 0.956015 0.007807 0.000978 76540.684802 78641.276494 80741.868186
19 19 7 3598.588190 -39.294228 4.651180e-04 0.963940 0.000514 0.000063 -38.611318 4.651180e-04 0.963940 0.000514 0.000063 15.595845 1.0 1.979630 1.0 -136.822009 1.485273e-05 0.990960 0.001786 0.000108 77143.279996 0 80741.868186 6 -42.144383 2.888146e-03 0.955793 0.000550 0.000085 77143.279996 0 80741.868186 6 -41.461473 2.888146e-03 0.955793 0.000550 0.000085 77143.279996 0 80741.868186 6 -123.330258 1.094731e-05 0.997297 0.001613 0.000059 77143.279996 0 80741.868186 6 -244.148263 1.094731e-05 0.997297 0.003193 0.000118 -270.856935 1.485273e-05 0.990960 0.003535 0.000214 77143.279996 78942.574091 80741.868186

Let’s find the longest track and try to visualize it:

track_table.sort_values(by=['count'], ascending=False, inplace=True)
particular_tracking_table = track_table.aux_table[0]  # the first

_mapping_track_table_aux_tables = store[list(position.tables._mapping_track_table_aux_tables)[0]._v_pathname]

index = _mapping_track_table_aux_tables.query('_index == @particular_tracking_table').individual_table

the_longest_track = store[getattr(position.tables._individual_track_table_aux_tables, 'track_table_aux_tables_%09d' % (index,))._v_pathname]

the_longest_track
distance distance_num node_id_a node_id_b node_next_id_a node_next_id_b timepoint track_table_number
0 5.898107 1.0 0 1 0 1 42345.743439 0
1 7.083879 1.0 0 1 0 2 42943.263915 0
2 7.251955 1.0 0 2 0 1 43545.771926 0
3 8.919651 1.0 0 1 0 1 44144.751331 0
4 9.688499 1.0 0 1 0 1 44744.694663 0
5 11.311585 1.0 0 1 0 1 45344.289949 0
6 12.540052 1.0 0 1 0 1 45939.743908 0
7 14.456596 1.0 0 1 0 1 46545.171155 0
8 16.146596 1.0 0 1 0 1 47147.290182 0
9 18.101215 1.0 0 1 0 1 47744.704740 0
10 20.143139 1.0 0 1 0 1 48338.214147 0
11 22.355845 1.0 0 1 0 1 48945.238245 0
12 25.077399 1.0 0 1 0 1 49539.787734 0
13 27.538952 1.0 0 1 0 1 50142.246928 0
14 31.024734 1.0 0 1 0 1 50745.344198 0
15 33.735136 1.0 0 1 0 1 51344.796590 0
16 37.211679 1.0 0 1 0 1 51944.723954 0
17 40.819015 1.0 0 1 0 1 52542.958177 0
18 45.219417 1.0 0 1 0 1 53141.803414 0
19 49.032112 1.0 0 1 0 1 53741.353184 0
20 53.111341 1.0 0 1 0 1 54341.241176 0
21 57.906361 1.0 0 1 1 2 54942.331510 0
timepoint = the_longest_track.timepoint / (60*60)
length = the_longest_track.distance

pyplot.title('Length over Time')

pyplot.xlabel('Time [h]')
pyplot.ylabel('Length [µm]')

pyplot.plot(timepoint, length)
[<matplotlib.lines.Line2D at 0x7f89d9621470>]
_images/Example_HDF5_Insights_25_1.svg

Now all tracked hyphae:

pyplot.title('Length over Time')

pyplot.xlabel('Time [h]')
pyplot.ylabel('Length [µm]')

for idx, row in track_table.iterrows():
    particular_tracking_table = int(row.aux_table)
    index = _mapping_track_table_aux_tables.query('_index == @particular_tracking_table').individual_table
    track = store[getattr(position.tables._individual_track_table_aux_tables, 'track_table_aux_tables_%09d' % (index,))._v_pathname]

    timepoint = track.timepoint / (60*60)
    length = track.distance - track.distance.min()
    pyplot.plot(timepoint, length)

pyplot.xlim(0, None)
(0, 22.961576228743152)
_images/Example_HDF5_Insights_27_1.svg

Example Alternative Growth Fit

Please first see the other Jupyter Notebook, explaining the basics of accessing mycelyso’s HDF5 files. Furthermore, this file assumes the output.h5 described in the other notebook to be present in the current directory.

Within this notebook, we will fit the mycelium length data using a third-party library, croissance (DOI: 10.5281/zenodo.229905 by Lars Schöning (2017)). Please install the current version off github first:

pip install https://github.com/biosustain/croissance/archive/master.zip

First, some general setup …

%matplotlib inline
%config InlineBackend.figure_formats=['svg']
import pandas
pandas.options.display.max_columns = None
import numpy as np
import warnings
import croissance
from croissance.figures import PDFWriter as CroissancePDFWriter
from matplotlib import pyplot

class OutputInstead:
    @classmethod
    def savefig(cls, fig):
        pyplot.gcf().set_size_inches(10, 12)
        pyplot.show()

# croissance's PDFWriter is supposed to write to a PDF
# but we want an inline figure, so we mock some bits
CroissancePDFWriter.doc = OutputInstead
CroissancePDFWriter._include_shifted_exponentials = False
def display_result(result, name="Mycelium Length"):
    return CroissancePDFWriter.write(CroissancePDFWriter, name, result)

warnings.simplefilter(action='ignore', category=FutureWarning)

pyplot.rcParams.update({
    'figure.figsize': (10, 6), 'svg.fonttype': 'none',
    'font.sans-serif': 'Arial', 'font.family': 'sans-serif',
    'image.cmap': 'gray_r', 'image.interpolation': 'none'
})

Opening the HDF5 file

We will load the output.h5 using pandas.HDFStore

store = pandas.HDFStore('output.h5', 'r')
root = store.get_node('/')
for image_file in root.results:
    print(image_file)
    for position in image_file:
        print(position)
        break
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff (Group) ''
/results/mycelyso_S_lividans_TK24_Complex_Medium_nd046_138_ome_tiff/pos_000000000_t_Collected (Group) ''

and load the first growth curve

result_table_collected = store[position.result_table_collected._v_pathname]
timepoint = result_table_collected.timepoint / (60*60)
length = result_table_collected.graph_edge_length

pyplot.title('Length over Time')

pyplot.xlabel('Time [h]')
pyplot.ylabel('Length [µm]')

pyplot.plot(timepoint, length)
[<matplotlib.lines.Line2D at 0x7fb7dd6e5160>]
_images/Example_Alternative_Growth_Fit_5_1.svg

Here, we will use the third party tool croissance to fit the data to an exponential growth model:

curve = pandas.Series(data=np.array(length), index=np.array(timepoint))

estimator = croissance.Estimator()
result = estimator.growth(curve)
# print(result)
print(result.growth_phases)
[GrowthPhase(start=9.928127173487246, end=22.594538504723342, slope=0.36693539043981077, intercept=3.1588539520729086, n0=-25.525547240977755, attributes={'SNR': 172.5009988033075, 'rank': 100.0})]

And furthermore use its plotting functionality to show the results:

print("Growth rate as determined by croissance µ=%.2f" % (result.growth_phases[0].slope,))
display_result(result)
Growth rate as determined by croissance µ=0.37
_images/Example_Alternative_Growth_Fit_9_1.svg

mycelyso Developer Documentation

Subpackages

mycelyso.tunables

Module contents

This file contains all the tunables available in mycelyso.

You can set them via -t Name=value on the command line.

class mycelyso.tunables.BorderArtifactRemovalBorderSize[source]

Bases: tunable.tunable.Tunable

Remove structures, whose centroid lies within that distance [µm] of a border

default = 10.0
value = 10.0
class mycelyso.tunables.BoxDetection[source]

Bases: tunable.tunable.Tunable

Whether to run the rectangular microfluidic growth structure detection as ROI detection

default = False
value = False
class mycelyso.tunables.CleanUpGaussianSigma[source]

Bases: tunable.tunable.Tunable

Clean up step: Sigma [µm] used for Gaussian filter

default = 0.075
value = 0.075
class mycelyso.tunables.CleanUpGaussianThreshold[source]

Bases: tunable.tunable.Tunable

Clean up step: Threshold used after Gaussian filter (values range from 0 to 1)

default = 0.5
value = 0.5
class mycelyso.tunables.CleanUpHoleFillSize[source]

Bases: tunable.tunable.Tunable

Clean up step: Maximum size of holes [µm²] which will be filled

default = 1.0
value = 1.0
class mycelyso.tunables.CropHeight[source]

Bases: tunable.tunable.Tunable

Crop value (vertical) of the image [pixels]

default = 0
value = 0
class mycelyso.tunables.CropWidth[source]

Bases: tunable.tunable.Tunable

Crop value (horizontal) of the image [pixels]

default = 0
value = 0
class mycelyso.tunables.NodeEndpointMergeRadius[source]

Bases: tunable.tunable.Tunable

Radius in which endpoints are going to be merged [µm]

default = 0.5
value = 0.5
class mycelyso.tunables.NodeJunctionMergeRadius[source]

Bases: tunable.tunable.Tunable

Radius in which junctions are going to be merged [µm]

default = 0.5
value = 0.5
class mycelyso.tunables.NodeLookupCutoffRadius[source]

Bases: tunable.tunable.Tunable

Radius at which nodes will be ignored if they are further away [µm]

default = 2.5
value = 2.5
class mycelyso.tunables.NodeLookupRadius[source]

Bases: tunable.tunable.Tunable

Radius in which nodes will be searched for found pixel structures [µm]

default = 0.5
value = 0.5
class mycelyso.tunables.NodeTrackingEndpointShiftRadius[source]

Bases: tunable.tunable.Tunable

Maximum search radius for endpoints [µm·h⁻¹]

default = 100.0
value = 100.0
class mycelyso.tunables.NodeTrackingJunctionShiftRadius[source]

Bases: tunable.tunable.Tunable

Maximum search radius for junctions [µm·h⁻¹]

default = 5.0
value = 5.0
class mycelyso.tunables.RemoveSmallStructuresSize[source]

Bases: tunable.tunable.Tunable

Remove structures up to this size [µm²]

default = 10.0
value = 10.0
class mycelyso.tunables.SkipBinarization[source]

Bases: tunable.tunable.Tunable

Whether to directly use the input image as binary mask. Use in case external binarization is desired.

default = False
value = False
class mycelyso.tunables.StoreImage[source]

Bases: tunable.tunable.Tunable

Whether to store images in the resulting HDF5. This leads to a potentially much larger output file.

default = False
value = False
class mycelyso.tunables.ThresholdingParameters[source]

Bases: tunable.tunable.Tunable

Parameters for the used binarization method, passed as key1:value1,key2:value2,… string

default = ''
value = ''
class mycelyso.tunables.ThresholdingTechnique[source]

Bases: tunable.tunable.Tunable

Binarization method to use, for available methods see documentation (mycelyso.processing.binarization)

default = 'experimental_thresholding'
classmethod test(value)[source]
value = 'experimental_thresholding'
class mycelyso.tunables.TrackingMaximumCoverage[source]

Bases: tunable.tunable.Tunable

Tracking, maximum covered area ratio at which tracking is still performed

default = 0.2
value = 0.2
class mycelyso.tunables.TrackingMaximumRelativeShrinkage[source]

Bases: tunable.tunable.Tunable

Tracking, maximal relative shrinkage

default = 0.2
value = 0.2
class mycelyso.tunables.TrackingMaximumTipElongationRate[source]

Bases: tunable.tunable.Tunable

Tracking, maximum tip elongation rate [µm·h⁻¹]

default = 100.0
value = 100.0
class mycelyso.tunables.TrackingMinimalGrownLength[source]

Bases: tunable.tunable.Tunable

Tracking, minimal hyphae gained length in track filter [µm]

default = 5.0
value = 5.0
class mycelyso.tunables.TrackingMinimalMaximumLength[source]

Bases: tunable.tunable.Tunable

Tracking, minimal hyphae end length in track filter [µm]

default = 10.0
value = 10.0
class mycelyso.tunables.TrackingMinimumTipElongationRate[source]

Bases: tunable.tunable.Tunable

Tracking, minimum tip elongation rate [µm·h⁻¹]

default = -0.0
value = -0.0
class mycelyso.tunables.TrackingMinimumTrackedPointCount[source]

Bases: tunable.tunable.Tunable

Tracking, minimal time steps in track filter [#]

default = 5
value = 5

mycelyso.highlevel package

Submodules
mycelyso.highlevel.nodeframe module

The nodeframe module contains the NodeFrame class, a representation of the graph of one time lapse frame.

class mycelyso.highlevel.nodeframe.NodeFrame(pf)[source]

Bases: object

Node frame is a representation of an image stack frame on the graph/node level, it populates its values from a PixelFrame passed.

cleanup_adjacency()[source]

Cleans up the adjacency matrix after alterations on the node level have been performed.

Returns:
cycles

Detects whether a cycle exists in the graph.

Returns:
generate_derived_data()[source]

Generates derived data from the current adjacency matrix.

Derived data are shortest paths, as well as connected components.

Returns:
get_connected_nodes(some_node)[source]

Get all nodes which are (somehow) connected to node some_node.

Parameters:some_node
Returns:
get_networkx_graph(with_z=0, return_positions=False)[source]

Convert the adjacency matrix based internal graph representation to a networkx graph representation.

Positions are additionally set based upon the pixel coordinate based positions of the nodes.

Parameters:
  • with_z – Whether z values should be set based upon the timepoint the nodes appear on
  • return_positions – Whether positions should be returned jointly with the graph
Returns:

get_path(start_node, end_node)[source]

Walks from start_node to end_node in the graph and returns the list of nodes (including both).

Parameters:
  • start_node
  • end_node
Returns:

is_endpoint(i)[source]

Returns whether node i is an endpoint.

Parameters:i
Returns:
is_junction(i)[source]

Returns whether node i is a junction.

Parameters:i
Returns:
prepare_graph(pf)[source]

Prepares the graph from the data stored in the PixelFrame pf. :param pf: PixelFrame :return:

track(successor)[source]

Tracks nodes on this frame to nodes on a successor frame.

Parameters:successor
Returns:
mycelyso.highlevel.pipeline module

The pipeline module contains the mycelyso-Pipeline, assembled from various functions.

class mycelyso.highlevel.pipeline.Mycelyso[source]

Bases: mycelyso.pilyso.application.application.App

The Mycelyso App, implementing a pilyso App.

arguments(argparser)[source]
handle_args()[source]
interactive_run()[source]
options()[source]
class mycelyso.highlevel.pipeline.MycelysoPipeline(args)[source]

Bases: mycelyso.pilyso.pipeline.pipeline.PipelineExecutionContext

The MycelysoPipeline, defining the pipeline (with slight alterations based upon arguments passed via command line).

mycelyso.highlevel.pixelframe module

The pixelframe module contains the PixelFrame class, a representation of one time lapse frame at the binary mask/pixel level.

class mycelyso.highlevel.pixelframe.PixelFrame(image, timepoint=0.0, calibration=1.0)[source]

Bases: object

A PixelFrame represents the pixel graph of one (skeletonized) image stack frame.

create_graph()[source]

Creates the graph from the pixel skeleton.

Returns:
mycelyso.highlevel.steps module

The steps module contains most of the individual, albeit mycelyso-specific processing steps.

mycelyso.highlevel.steps.binarize(image, binary=None)[source]

Binarizes the input image using the experimental thresholding technique.

Parameters:
  • image
  • binary
Returns:

mycelyso.highlevel.steps.clean_up(calibration, binary)[source]

Cleans up the image by removing holes smaller than the configured size.

Parameters:
  • calibration
  • binary
Returns:

>>> clean_up(0.1, np.array([[ True,  True,  True],
...                         [ True, False,  True],
...                         [ True,  True,  True]]))
array([[ True,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True]])
mycelyso.highlevel.steps.convert_to_nodes(skeleton, timepoint, calibration, pixel_frame=None, node_frame=None)[source]

Passes the input skeleton into a PixelFrame and instantiates a NodeFrame based upon that.

Parameters:
  • skeleton
  • timepoint
  • calibration
  • pixel_frame
  • node_frame
Returns:

mycelyso.highlevel.steps.generate_graphml(node_frame, result)[source]

Generates a GraphML representation of a particular frame.

Parameters:
  • node_frame
  • result
Returns:

mycelyso.highlevel.steps.generate_overall_graphml(collected, result)[source]

Generates a GraphML representation of the whole graph of one image stack.

Parameters:
  • collected
  • result
Returns:

mycelyso.highlevel.steps.graph_statistics(node_frame, result=None)[source]

Adds some information about the graph to the results.

Parameters:
  • node_frame
  • result
Returns:

>>> pf = PixelFrame(np.array([[0, 0, 0],
...                           [1, 1, 1],
...                           [0, 0, 0]]), calibration=15.0)
>>> sorted(graph_statistics(NodeFrame(pf)).items())
[('graph_edge_count', 1.0), ('graph_edge_length', 30.0), ('graph_endpoint_count', 2), ('graph_junction_count', 0), ('graph_node_count', 2)]
mycelyso.highlevel.steps.image_statistics(image, calibration, result=None)[source]

Adds some numeric image parameters (i.e. size) to the results.

Parameters:
  • image
  • calibration
  • result
Returns:

>>> sorted(image_statistics(np.array([[0, 0, 0],
...                                   [0, 0, 0],
...                                   [0, 0, 0]]), calibration=15.0).items())
[('area', 2025.0), ('area_pixel', 9), ('input_height', 45.0), ('input_height_pixel', 3), ('input_width', 45.0), ('input_width_pixel', 3)]
mycelyso.highlevel.steps.individual_tracking(collected, tracked_fragments=None, tracked_fragments_fates=None)[source]

After correspondence has been established by NodeFrame#track, reconstructs growing paths over time.

Parameters:
  • collected
  • tracked_fragments
  • tracked_fragments_fates
Returns:

mycelyso.highlevel.steps.prepare_position_regressions(collected, result)[source]

Prepares some regressions over parameters collected per position over time.

Parameters:
  • collected
  • result
Returns:

mycelyso.highlevel.steps.prepare_tracked_fragments(collected, tracked_fragments, tracked_fragments_fates, track_table=None, track_table_aux_tables=None)[source]

Filters and converts tracked growing segments to result datasets.

Parameters:
  • collected
  • tracked_fragments
  • tracked_fragments_fates
  • track_table
  • track_table_aux_tables
Returns:

mycelyso.highlevel.steps.qimshow(image, cmap='gray')[source]

Debug function, quickly shows the passed image via matplotlibs imshow-facilities.

Parameters:
  • image
  • cmap
Returns:

mycelyso.highlevel.steps.quantify_binary(binary, calibration, result=None)[source]

Adds some information about the binary image (i.e. covered ratio, area …) to the results.

Parameters:
  • binary
  • calibration
  • result
Returns:

>>> sorted(quantify_binary(np.array([[0, 0, 0],
...                                  [1, 1, 1],
...                                  [0, 0, 0]]), calibration=15.0).items())
[('covered_area', 675.0), ('covered_area_pixel', 3), ('covered_ratio', 0.3333333333333333)]
mycelyso.highlevel.steps.remove_border_artifacts(calibration, binary)[source]

Removes structures, which are most likely artifacts because their centroid lies near the border.

Parameters:
  • calibration
  • binary
Returns:

>>> remove_border_artifacts(0.1, np.array([[ False, False, False],
...                                        [ False, False,  True],
...                                        [ False, False,  True]]))
array([[False, False, False],
       [False, False, False],
       [False, False, False]])
mycelyso.highlevel.steps.remove_small_structures(calibration, binary)[source]

Cleans up the image by removing structures smaller than the configured size.

Parameters:
  • calibration
  • binary
Returns:

>>> remove_small_structures(0.1, np.array([[ False, False, False],
...                                        [ False, False,  True],
...                                        [ False, False,  True]]))
array([[False, False, False],
       [False, False, False],
       [False, False, False]])
mycelyso.highlevel.steps.set_empty_crops(image, crop_t=None, crop_b=None, crop_l=None, crop_r=None)[source]

Defines crop parameters based upon image size, effectively not cropping at all.

Parameters:
  • image
  • crop_t
  • crop_b
  • crop_l
  • crop_r
Returns:

mycelyso.highlevel.steps.skeletonize(binary, skeleton=None)[source]

Skeletonizes the image using scikit-image’s skeletonize function.

Parameters:
  • binary
  • skeleton
Returns:

>>> skeletonize(np.array([[0, 0, 1, 1],
...                       [0, 0, 1, 1],
...                       [0, 0, 1, 1],
...                       [0, 0, 1, 1]]))
array([[False, False, False, False],
       [False, False,  True, False],
       [False, False,  True, False],
       [False, False, False, False]])
mycelyso.highlevel.steps.skip_if_image_is_below_size(min_height=4, min_width=4)[source]

Raises a Skip exception if the image size falls below the set image size.

Parameters:
  • min_height
  • min_width
Returns:

>>> skip_if_image_is_below_size(32, 32)(np.zeros((16,16)), Meta(0, 0))
Traceback (most recent call last):
 ...
mycelyso.pilyso.pipeline.executor.Skip: Meta(pos=0, t=<class 'mycelyso.pilyso.pipeline.executor.Collected'>)
mycelyso.highlevel.steps.track_multipoint(collected)[source]

Initiates tracking between consecutive NodeFrames.

Parameters:collected
Returns:
Module contents

The highlevel package contains highlevel functionality of mycelyso.

mycelyso.misc package

Submodules
mycelyso.misc.graphml module

The graphml module contains output routines to output GraphML structured data from internal graph representations.

mycelyso.misc.graphml.to_graphml_string(g)[source]

Converts a networkx graph to a GraphML representation.

Parameters:g – graph
Returns:graphml string
mycelyso.misc.graphml.to_graphml_writer(g)[source]

Takes a networkx graph and returns a GraphMLWriter containing the graph.

Parameters:g – graph
Returns:GraphMLWriter instance
mycelyso.misc.graphml.write_graphml(g, name)[source]

Writes a networkx graph in GraphML format to a file.

Parameters:
  • g – graph
  • name – filename
Returns:

mycelyso.misc.regression module

The regression modules contains some helpers to perform linear fits on data with non-linear begins or ends.

mycelyso.misc.regression.find_linear_window(x, y, begin=nan, end=nan, window=0.1, condition=('rvalue', 'gt', 0.95), return_begin_end=False, return_nan_if_impossible=True)[source]

Tries to find a continuous window in x/y which (mostly) follows a linear relation subject to condition.

If window is a float, it is seen as relative length of the input lists. Linear regressions will be performed on each window, then the windows will be filtered by the condition (eg that they have a rvalue better than 0.95). Then the range between the first and the last window to follow these conditions will be used to perform the overall regression.

See also scipy.stats.linregress()

Parameters:
  • x – Input data, independent value
  • y – Input data, dependent value
  • begin
  • end
  • window – Window, either
  • condition – Condition to check, a tuple of three. The first must be a key of a linear regression result object, the second either ‘gt’ or ‘lt’, and the third the value to compare.
  • return_begin_end – If true, return the found range as well
  • return_nan_if_impossible – If True, return NaN if no suitable region was found, otherwise throws RuntimeError
Returns:

mycelyso.misc.regression.prepare_optimized_regression(x, y)[source]

First finds an optimal window using find_linear_window(), than performs a linear regression.

Parameters:
  • x – independent variable
  • y – dependent variable
Returns:

>>> x = np.linspace(1, 100, 100)
>>> y = x * 5 + 10
>>> y[0:10] = 0  # break our nice linear curve
>>> prepare_optimized_regression(x, y)
OrderedDict([('slope', 5.0), ('intercept', 10.0), ('rvalue', 0.9999999999999999), ('pvalue', 0.0), ('stderr', 7.942345602646859e-09), ('begin_index', 10), ('end_index', 100), ('begin', 11.0), ('end', 100.0)])
mycelyso.misc.util module
mycelyso.misc.util.calculate_length(points, times=1, w=5)[source]

Calculates the length of a path.

Paths sampled from pixel grids may contain notable measuring error, if euclidean distances are calculated naively. This method uses an adapted approach from [Cornelisse1984], by repeatedly smoothing the coordinates with a moving average filter before calculating the euclidean distance.

[Cornelisse1984]Cornelisse and van den Berg (1984) Journal of Microscopy 10.1111/j.1365-2818.1984.tb00544.x
Parameters:
  • points – Input points, a numpy array (X, 2)
  • times – Times smoothing should be applied
  • w – window width of the moving average filter
Returns:

Length of the input path

>>> calculate_length(np.array([[1.0, 1.0],
...                            [5.0, 5.0]]))
5.656854249492381
mycelyso.misc.util.clean_by_radius(points, radius=15.0)[source]

Bins points by radius and returns only one per radius, removing duplicates.

Parameters:
  • points – Input points
  • radius – Radius
Returns:

Filtered points

>>> clean_by_radius(np.array([[1.0, 1.0],
...                           [1.1, 1.1],
...                           [9.0, 9.0]]), radius=1.5)
array([[1., 1.],
       [9., 9.]])
mycelyso.misc.util.pairwise(iterable)[source]

s -> (s0,s1), (s1,s2), (s2, s3), …

Module contents

The misc package contains various helper functions.

mycelyso.processing package

Submodules
mycelyso.processing.binarization module

The binarization module contains the binarization routine used to segment phase contrast images of mycelium networks into foreground and background.

mycelyso.processing.binarization.bataineh(image, mask=None, window_size=15, return_threshold=False, **kwargs)[source]

Thresholding method as developed by [Bataineh2011a].

[Bataineh2011a]Bataineh et al. (2011) Pattern Recognit. Lett. DOI: 10.1016/j.patrec.2011.08.001
Parameters:
  • image – Input image
  • mask – Possible mask denoting a ROI
  • window_size – Window size
  • return_threshold – Whether to return a binarization, or the actual threshold values
  • kwargs – For compatibility
Returns:

mycelyso.processing.binarization.experimental_thresholding(image, mask=None, window_size=15, gaussian_sigma=3.0, shift=0.2, target=-0.5, quotient=1.2, return_threshold=False, **kwargs)[source]

A novel thresholding method basing upon the shape index as defined by [Koenderink1992], and [Bataineh2011] automatic adaptive thresholding. The method is due to be explained in detail in the future.

[Koenderink1992]Koenderink and van Doorn (1992) Image Vision Comput. DOI: 10.1016/0262-8856(92)90076-F
[Bataineh2011]Bataineh et al. (2011) Pattern Recognit. Lett. DOI: 10.1016/j.patrec.2011.08.001
Parameters:
  • image – Input image
  • mask – Possible mask denoting a ROI
  • window_size – Window size
  • gaussian_sigma – Sigma of the Gaussian used for smoothing
  • shift – Shift parameter
  • target – Target shape index parameter
  • quotient – Quotient parameter
  • return_threshold – Whether to return a binarization, or the actual threshold values
  • kwargs – For compatibility
Returns:

mycelyso.processing.binarization.feng(image, mask=None, window_size=15, window_size2=30, a1=0.12, gamma=2, k1=0.25, k2=0.04, return_threshold=False, **kwargs)[source]

Thresholding method as developed by [Feng2004].

[Feng2004]Fend & Tan (2004) IEICE Electronics Express DOI: 10.1587/elex.1.501
Parameters:
  • image – Input image
  • mask – Possible mask denoting a ROI
  • window_size – Window size
  • window_size2 – Second window size
  • a1 – a1 value
  • gamma – gamma value
  • k1 – k1 value
  • k2 – k2 value
  • return_threshold – Whether to return a binarization, or the actual threshold values
  • kwargs – For compatibility
Returns:

mycelyso.processing.binarization.mean_and_std(image, window_size=15)[source]

Helper function returning mean and average images sped up using integral images / summed area tables.

Parameters:
  • image – Input image
  • window_size – Window size
Returns:

tuple (mean, std)

mycelyso.processing.binarization.nick(image, window_size=15, k=-0.1, return_threshold=False, **kwargs)[source]

Thresholding method as developed by [Khurshid2009].

[Khurshid2009]Khurshid et al. (2009) Proc. SPIE DOI: 10.1117/12.805827
Parameters:
  • image – Input image
  • window_size – Window size
  • k – k value
  • return_threshold – Whether to return a binarization, or the actual threshold values
  • kwargs – For compatibility
Returns:

mycelyso.processing.binarization.normalize(image)[source]

Normalizes an image to the range 0-1

Parameters:image
Returns:
mycelyso.processing.binarization.phansalkar(image, window_size=15, k=0.25, r=0.5, p=2.0, q=10.0, return_threshold=False, **kwargs)[source]

Thresholding method as developed by [Phansalkar2011].

[Phansalkar2011]Phansalkar et al. (2011) Proc. ICCSP DOI: 10.1109/ICCSP.2011.5739305
Parameters:
  • image – Input image
  • window_size – Window size
  • k – k value
  • r – r value
  • p – p value
  • q – q value
  • return_threshold – Whether to return a binarization, or the actual threshold values
  • kwargs – For compatibility
Returns:

mycelyso.processing.binarization.sauvola(image, window_size=15, k=0.5, r=128, return_threshold=False, **kwargs)[source]

Thresholding method as developed by [Sauvola1997].

[Sauvola1997]Sauvola et al. (1997) Proc. Doc. Anal. Recog. DOI: 10.1109/ICDAR.1997.619831
Parameters:
  • image – Input image
  • window_size – Window size
  • k – k value
  • r – r value
  • return_threshold – Whether to return a binarization, or the actual threshold values
  • kwargs – For compatibility
Returns:

mycelyso.processing.binarization.wolf(image, mask=None, window_size=15, a=0.5, return_threshold=False, **kwargs)[source]

Thresholding method as developed by [Wolf2004].

[Wolf2004]Wolf & Jolion (2004) Form. Pattern Anal. & App. DOI: 10.1007/s10044-003-0197-7
Parameters:
  • image – Input image
  • mask – Possible mask denoting a ROI
  • window_size – Window size
  • a – a value
  • return_threshold – Whether to return a binarization, or the actual threshold values
  • kwargs – For compatibility
Returns:

mycelyso.processing.pixelgraphs module

The pixelgraphs module contains various functions to work with skeleton images, and treating the paths of the skeleton as graphs, which can be walked along.

mycelyso.processing.pixelgraphs.get_all_neighbor_nums(num)[source]

Return all set neighbor bits in num.

Parameters:num – Neighborhood representation.
Returns:Array of values
mycelyso.processing.pixelgraphs.get_all_neighbors(num)[source]

Return positions for all set neighbor bits in num

Parameters:num – Neighborhood representation
Returns:Array of shifts
mycelyso.processing.pixelgraphs.get_connectivity_map(binary)[source]

Returns a ‘connectivity map’, where each value represents the count of neighbors at a position.

Parameters:binary – Binary input image
Returns:
mycelyso.processing.pixelgraphs.get_inverse_neighbor_shift(num)[source]

Get the shift corresponding to the inverse direction represented by num.

Parameters:num – Neighborhood bit
Returns:Shift (r, c)
mycelyso.processing.pixelgraphs.get_neighborhood_map(binary)[source]

Returns a ‘neighborhood map’, where each value binary encodes the connections at a point.

Parameters:binary – Binary input image
Returns:
mycelyso.processing.pixelgraphs.get_next_neighbor(num)[source]

Returns the coordinates represented by a numeric neighbor bit.

Parameters:num – Neighbor bit
Returns:Shift (r, c)
mycelyso.processing.pixelgraphs.is_edge(connectivity)[source]

Returns True if connectivity corresponds an edge (is two).

Parameters:connectivity – Scalar or matrix
Returns:Boolean or matrix of boolean
mycelyso.processing.pixelgraphs.is_end(connectivity)[source]

Returns True if connectivity corresponds to an endpoint (is one).

Parameters:connectivity – Scalar or matrix
Returns:Boolean or matrix of boolean
mycelyso.processing.pixelgraphs.is_junction(connectivity)[source]

Returns True if connectivity corresponds a junction (is greater than two).

Parameters:connectivity – Scalar or matrix
Returns:Boolean or matrix of boolean
mycelyso.processing.pixelgraphs.where2d(image)[source]

numpy.where for 2D matrices.

Parameters:image – Input images
Returns:Coordinate list where image is non-zero
>>> where2d(np.array([[ 0, 0, 0],
...                   [ 0, 1, 1],
...                   [ 0, 0, 0]]))
array([[1, 1],
       [1, 2]])
Module contents

The processing submodule contains various functions and management classes concerned with image processing of hyphae network images.

Module contents

mycelyso, the MYCElium anaLYsis SOftware