Source code for fafbseg.flywire.merge

#    A collection of tools to interface with manually traced and autosegmented
#    data in FAFB.
#
#    Copyright (C) 2019 Philipp Schlegel
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
import navis
import trimesh as tm

from .. import xform
from ..move import merge_into_catmaid

from .skeletonize import skeletonize_neuron

try:
    import skeletor as sk
except ImportError:
    sk = None
except BaseException:
    raise

__all__ = ['merge_flywire_neuron']


[docs]def merge_flywire_neuron(id, target_instance, tag, flywire_dataset='production', assert_id_match=True, drop_soma_hairball=True, **kwargs): """Merge flywire neuron into FAFB. This function (1) fetches a mesh from flywire, (2) turns it into a skeleton, (3) maps the coordinates to FAFB 14 and (4) runs ``fafbseg.merge_neuron`` to merge the skeleton into CATMAID. See Examples below on how to run these individual steps yourself if you want more control over e.g. how the mesh is skeletonized. Parameters ---------- id : int ID of the flywire neuron you want to merge. target_instance : pymaid.CatmaidInstance Instance to merge the neuron into into. tag : str You personal tag to add as annotation once import into CATMAID is complete. dataset : str | CloudVolume Against which flywire dataset to query:: - "production" (current production dataset, fly_v31) - "sandbox" (i.e. fly_v26) assert_id_match : bool If True, will check if skeleton nodes map to the correct segment ID and if not will move them back into the segment. This is potentially very slow! drop_soma_hairball : bool If True, we will try to drop the hairball that is typically created inside the soma. **kwargs Keyword arguments are passed on to ``fafbseg.merge_neuron``. Examples -------- # Import flywire neuron >>> _ = merge_flywire_neuron(id=720575940610453042, ... cvpath='graphene://https://prodv1.flywire-daf.com/segmentation/1.0/fly_v26', ... target_instance=manual, ... tag='WTCam') """ if not sk: raise ImportError('Must install skeletor: pip3 install skeletor') vol = parse_volume(flywire_dataset) # Make sure this is a valid integer id = int(id) # Download the mesh mesh = vol.mesh.get(id, deduplicate_chunk_boundaries=False)[id] # Convert to neuron n_fw, simp, cntr = skeletonize_neuron(mesh, drop_soma_hairball=drop_soma_hairball, dataset=flywire_dataset, assert_id_match=assert_id_match) # Confirm viewer = navis.Viewer(title='Confirm skeletonization') # Make sure viewer is actually visible and cleared viewer.show() viewer.clear() # Add skeleton viewer.add(n_fw, color='r') msg = """ Please carefully inspect the skeletonization of the flywire mesh. Hit ENTER to proceed if happy or CTRL-C to cancel. """ # Add mesh last - otherwise it might mask out other objects despite alpha viewer.add(navis.MeshNeuron(mesh), color='w', alpha=.2) try: _ = input(msg) except KeyboardInterrupt: raise KeyboardInterrupt('Merge process aborted by user.') except BaseException: raise finally: viewer.close() # Xform to FAFB n_fafb = xform.flywire_to_fafb14(n_fw, on_fail='raise', coordinates='nm', inplace=False) mesh_fafb = xform.flywire_to_fafb14(tm.Trimesh(mesh.vertices, mesh.faces), on_fail='raise', coordinates='nm', inplace=False) # Heal neuron n_fafb = navis.heal_fragmented_neuron(n_fafb) # Merge neuron return merge_into_catmaid(n_fafb, target_instance=target_instance, tag=tag, mesh=mesh_fafb, **kwargs)