From a99c6dee3e1e990dab03b0f90152343276d6893c Mon Sep 17 00:00:00 2001 From: Marwan Abdellah Date: Mon, 8 Oct 2018 14:13:14 +0200 Subject: [PATCH] Handle an exceptional case when the loaded morphology does not have any basal dendrites. --- .../builders/mesh/piecewise_builder.py | 60 +++--- .../builders/skeleton/skeleton_builder.py | 174 ++++++++++-------- neuromorphovis/builders/soma/soma_builder.py | 62 ++++--- .../file/readers/morphology/swc_reader.py | 12 ++ 4 files changed, 177 insertions(+), 131 deletions(-) diff --git a/neuromorphovis/builders/mesh/piecewise_builder.py b/neuromorphovis/builders/mesh/piecewise_builder.py index 8c78a8b57..03a8f158e 100644 --- a/neuromorphovis/builders/mesh/piecewise_builder.py +++ b/neuromorphovis/builders/mesh/piecewise_builder.py @@ -286,33 +286,36 @@ def build_arbors(self, # Draw the basal dendrites if not self.options.morphology.ignore_basal_dendrites: - # Do it dendrite by dendrite - for i, basal_dendrite in enumerate(self.morphology.dendrites): - nmv.logger.info('Dendrite [%d]' % i) + # Ensure tha existence of basal dendrites + if self.morphology.dendrites is not None: - basal_dendrite_objects = [] + # Do it dendrite by dendrite + for i, basal_dendrite in enumerate(self.morphology.dendrites): + nmv.logger.info('Dendrite [%d]' % i) - # Draw the basal dendrites as a set connected sections - basal_dendrite_prefix = '%s_%d' % (nmv.consts.Arbors.BASAL_DENDRITES_PREFIX, i) - nmv.skeleton.ops.draw_connected_sections( - section=copy.deepcopy(basal_dendrite), - max_branching_level=self.options.morphology.basal_dendrites_branch_order, - name=basal_dendrite_prefix, - material_list=self.basal_dendrites_materials, - bevel_object=bevel_object, - repair_morphology=True, - caps=caps, - sections_objects=basal_dendrite_objects, - roots_connection=roots_connection) + basal_dendrite_objects = [] - # Ensure that basal dendrite objects were reconstructed - if len(basal_dendrite_objects) > 0: + # Draw the basal dendrites as a set connected sections + basal_dendrite_prefix = '%s_%d' % (nmv.consts.Arbors.BASAL_DENDRITES_PREFIX, i) + nmv.skeleton.ops.draw_connected_sections( + section=copy.deepcopy(basal_dendrite), + max_branching_level=self.options.morphology.basal_dendrites_branch_order, + name=basal_dendrite_prefix, + material_list=self.basal_dendrites_materials, + bevel_object=bevel_object, + repair_morphology=True, + caps=caps, + sections_objects=basal_dendrite_objects, + roots_connection=roots_connection) - # Add a reference to the mesh object - self.morphology.dendrites[i].mesh = basal_dendrite_objects[0] + # Ensure that basal dendrite objects were reconstructed + if len(basal_dendrite_objects) > 0: + + # Add a reference to the mesh object + self.morphology.dendrites[i].mesh = basal_dendrite_objects[0] - # Add the sections (tubes) of the basal dendrite to the list - arbors_objects.extend(basal_dendrite_objects) + # Add the sections (tubes) of the basal dendrite to the list + arbors_objects.extend(basal_dendrite_objects) # Draw the axon as a set connected sections if not self.options.morphology.ignore_axon: @@ -377,11 +380,14 @@ def connect_arbors_to_soma(self): # Connecting basal dendrites if not self.options.morphology.ignore_basal_dendrites: - # Do it dendrite by dendrite - for i, basal_dendrite in enumerate(self.morphology.dendrites): - nmv.logger.detail('Dendrite [%d]' % i) - nmv.skeleton.ops.connect_arbor_to_soma( - self.soma_mesh, basal_dendrite) + # Ensure tha existence of basal dendrites + if self.morphology.dendrites is not None: + + # Do it dendrite by dendrite + for i, basal_dendrite in enumerate(self.morphology.dendrites): + nmv.logger.detail('Dendrite [%d]' % i) + nmv.skeleton.ops.connect_arbor_to_soma( + self.soma_mesh, basal_dendrite) # Connecting axon if not self.options.morphology.ignore_axon: diff --git a/neuromorphovis/builders/skeleton/skeleton_builder.py b/neuromorphovis/builders/skeleton/skeleton_builder.py index 6a5e10000..fe30af43a 100644 --- a/neuromorphovis/builders/skeleton/skeleton_builder.py +++ b/neuromorphovis/builders/skeleton/skeleton_builder.py @@ -477,18 +477,23 @@ def draw_morphology_as_disconnected_segments(self, # Draw the basal dendrites if not self.options.morphology.ignore_basal_dendrites: - basal_dendrites_segments_objects = [] - for i, basal_dendrite in enumerate(self.morphology.dendrites): - dendrite_name = '%s_%d' % (nmv.consts.Arbors.BASAL_DENDRITES_PREFIX, i) - self.draw_section_as_disconnected_segments( - basal_dendrite, name=dendrite_name, - max_branching_level=self.options.morphology.basal_dendrites_branch_order, - material_list=self.basal_dendrites_materials, - bevel_object=bevel_object, - segments_objects=basal_dendrites_segments_objects) - # Extend the morphology objects list - morphology_objects.extend(basal_dendrites_segments_objects) + # Ensure tha existence of basal dendrites + if self.morphology.dendrites is not None: + + basal_dendrites_segments_objects = [] + + for i, basal_dendrite in enumerate(self.morphology.dendrites): + dendrite_name = '%s_%d' % (nmv.consts.Arbors.BASAL_DENDRITES_PREFIX, i) + self.draw_section_as_disconnected_segments( + basal_dendrite, name=dendrite_name, + max_branching_level=self.options.morphology.basal_dendrites_branch_order, + material_list=self.basal_dendrites_materials, + bevel_object=bevel_object, + segments_objects=basal_dendrites_segments_objects) + + # Extend the morphology objects list + morphology_objects.extend(basal_dendrites_segments_objects) # Draw the apical dendrite if not self.options.morphology.ignore_apical_dendrite: @@ -553,19 +558,24 @@ def draw_morphology_as_disconnected_sections(self, # Draw the basal dendrites if not self.options.morphology.ignore_basal_dendrites: - basal_dendrites_sections_objects = [] - for i, basal_dendrite in enumerate(self.morphology.dendrites): - dendrite_prefix = '%s_%d' % (nmv.consts.Arbors.BASAL_DENDRITES_PREFIX, i) - self.draw_root_as_disconnected_sections( - basal_dendrite, - name=dendrite_prefix, - material_list=self.basal_dendrites_materials, - bevel_object=bevel_object, - max_branching_level=self.options.morphology.basal_dendrites_branch_order, - sections_objects=basal_dendrites_sections_objects) - # Extend the morphology objects list - morphology_objects.extend(basal_dendrites_sections_objects) + # Ensure tha existence of basal dendrites + if self.morphology.dendrites is not None: + + basal_dendrites_sections_objects = [] + + for i, basal_dendrite in enumerate(self.morphology.dendrites): + dendrite_prefix = '%s_%d' % (nmv.consts.Arbors.BASAL_DENDRITES_PREFIX, i) + self.draw_root_as_disconnected_sections( + basal_dendrite, + name=dendrite_prefix, + material_list=self.basal_dendrites_materials, + bevel_object=bevel_object, + max_branching_level=self.options.morphology.basal_dendrites_branch_order, + sections_objects=basal_dendrites_sections_objects) + + # Extend the morphology objects list + morphology_objects.extend(basal_dendrites_sections_objects) # Return a reference to the list of drawn objects return morphology_objects @@ -609,18 +619,22 @@ def draw_morphology_as_articulated_sections(self, # Draw the basal dendrites joints if not self.options.morphology.ignore_basal_dendrites: - basal_dendrites_spheres_objects = [] - for i, basal_dendrite in enumerate(self.morphology.dendrites): - # Draw the basal dendrites as a set connected sections - self.draw_section_terminals_as_spheres( - root=basal_dendrite, - sphere_objects=basal_dendrites_spheres_objects, - max_branching_level=self.options.morphology.basal_dendrites_branch_order, - material_list=self.articulation_materials) + # Ensure tha existence of basal dendrites + if self.morphology.dendrites is not None: - # Extend the morphology objects list - morphology_objects.extend(basal_dendrites_spheres_objects) + basal_dendrites_spheres_objects = [] + for i, basal_dendrite in enumerate(self.morphology.dendrites): + + # Draw the basal dendrites as a set connected sections + self.draw_section_terminals_as_spheres( + root=basal_dendrite, + sphere_objects=basal_dendrites_spheres_objects, + max_branching_level=self.options.morphology.basal_dendrites_branch_order, + material_list=self.articulation_materials) + + # Extend the morphology objects list + morphology_objects.extend(basal_dendrites_spheres_objects) # Draw the apical dendrite joints if not self.options.morphology.ignore_apical_dendrite: @@ -696,29 +710,33 @@ def draw_morphology_as_connected_sections(self, # Draw the basal dendrites if not self.options.morphology.ignore_basal_dendrites: - # A list to keep all the drawn objects of the basal dendrites - basal_dendrites_sections_objects = [] + # Ensure tha existence of basal dendrites + if self.morphology.dendrites is not None: + + # A list to keep all the drawn objects of the basal dendrites + basal_dendrites_sections_objects = [] + + # Draw each basal dendrites as a set connected sections + for i, basal_dendrite in enumerate(self.morphology.dendrites): + + dendrite_prefix = '%s_%d' % (nmv.consts.Arbors.BASAL_DENDRITES_PREFIX, i) + nmv.skeleton.ops.draw_connected_sections( + section=copy.deepcopy(basal_dendrite), + max_branching_level=self.options.morphology.basal_dendrites_branch_order, + name=dendrite_prefix, + material_list=self.basal_dendrites_materials, + bevel_object=bevel_object, + repair_morphology=repair_morphology, + caps=True, + sections_objects=basal_dendrites_sections_objects, + render_frame=self.options.morphology.render_progressive, + frame_destination=self.progressive_frames_directory, + camera=self.progressive_rendering_camera, + roots_connection=self.options.morphology.arbors_to_soma_connection, + ignore_branching_samples=disconnect_skelecton) - # Draw each basal dendrites as a set connected sections - for i, basal_dendrite in enumerate(self.morphology.dendrites): - dendrite_prefix = '%s_%d' % (nmv.consts.Arbors.BASAL_DENDRITES_PREFIX, i) - nmv.skeleton.ops.draw_connected_sections( - section=copy.deepcopy(basal_dendrite), - max_branching_level=self.options.morphology.basal_dendrites_branch_order, - name=dendrite_prefix, - material_list=self.basal_dendrites_materials, - bevel_object=bevel_object, - repair_morphology=repair_morphology, - caps=True, - sections_objects=basal_dendrites_sections_objects, - render_frame=self.options.morphology.render_progressive, - frame_destination=self.progressive_frames_directory, - camera=self.progressive_rendering_camera, - roots_connection=self.options.morphology.arbors_to_soma_connection, - ignore_branching_samples=disconnect_skelecton) - - # Extend the morphology objects list - morphology_objects.extend(basal_dendrites_sections_objects) + # Extend the morphology objects list + morphology_objects.extend(basal_dendrites_sections_objects) # Draw the apical dendrite if not self.options.morphology.ignore_apical_dendrite: @@ -849,28 +867,32 @@ def draw_morphology_as_disconnected_skeleton(self, # Draw the basal dendrites if not self.options.morphology.ignore_basal_dendrites: - basal_dendrites_sections_objects = [] - for i, basal_dendrite in enumerate(self.morphology.dendrites): - - # Draw the basal dendrites as a set connected sections - dendrite_prefix = '%s_%d' % (nmv.consts.Arbors.BASAL_DENDRITES_PREFIX, i) - nmv.skeleton.ops.draw_connected_sections( - section=copy.deepcopy(basal_dendrite), - max_branching_level=self.options.morphology.basal_dendrites_branch_order, - name=dendrite_prefix, - material_list=self.basal_dendrites_materials, - bevel_object=bevel_object, - repair_morphology=repair_morphology, - caps=True, - sections_objects=basal_dendrites_sections_objects, - render_frame=self.options.morphology.render_progressive, - frame_destination=self.progressive_frames_directory, - camera=self.progressive_rendering_camera, - roots_connection=self.options.morphology.arbors_to_soma_connection, - ignore_branching_samples=True) + # Ensure tha existence of basal dendrites + if self.morphology.dendrites is not None: + + basal_dendrites_sections_objects = [] + + for i, basal_dendrite in enumerate(self.morphology.dendrites): + + # Draw the basal dendrites as a set connected sections + dendrite_prefix = '%s_%d' % (nmv.consts.Arbors.BASAL_DENDRITES_PREFIX, i) + nmv.skeleton.ops.draw_connected_sections( + section=copy.deepcopy(basal_dendrite), + max_branching_level=self.options.morphology.basal_dendrites_branch_order, + name=dendrite_prefix, + material_list=self.basal_dendrites_materials, + bevel_object=bevel_object, + repair_morphology=repair_morphology, + caps=True, + sections_objects=basal_dendrites_sections_objects, + render_frame=self.options.morphology.render_progressive, + frame_destination=self.progressive_frames_directory, + camera=self.progressive_rendering_camera, + roots_connection=self.options.morphology.arbors_to_soma_connection, + ignore_branching_samples=True) - # Extend the morphology objects list - morphology_objects.extend(basal_dendrites_sections_objects) + # Extend the morphology objects list + morphology_objects.extend(basal_dendrites_sections_objects) # Draw the apical dendrite if not self.options.morphology.ignore_apical_dendrite: diff --git a/neuromorphovis/builders/soma/soma_builder.py b/neuromorphovis/builders/soma/soma_builder.py index 2d8961a72..279e7608a 100644 --- a/neuromorphovis/builders/soma/soma_builder.py +++ b/neuromorphovis/builders/soma/soma_builder.py @@ -581,27 +581,30 @@ def build_soma_soft_body(self, # Basal dendrites if not self.options.morphology.ignore_basal_dendrites: - # Build towards the dendrites, if possible - for i, dendrite_root in enumerate(self.morphology.dendrites): + # Ensure tha existence of basal dendrites + if self.morphology.dendrites is not None: - # The dendrite must be connected to the soma - if dendrite_root.connected_to_soma: + # Build towards the dendrites, if possible + for i, dendrite_root in enumerate(self.morphology.dendrites): - # Which dendrite ?!! - nmv.logger.info('Dendrite [%d]' % i) + # The dendrite must be connected to the soma + if dendrite_root.connected_to_soma: - # Create the extrusion face, where the pulling will occur - extrusion_face_centroid = self.create_branch_extrusion_face( - soma_bmesh_sphere, dendrite_root, visualize_connection=False) + # Which dendrite ?!! + nmv.logger.info('Dendrite [%d]' % i) - # Update the list - roots_and_faces_centroids.append([dendrite_root, extrusion_face_centroid]) + # Create the extrusion face, where the pulling will occur + extrusion_face_centroid = self.create_branch_extrusion_face( + soma_bmesh_sphere, dendrite_root, visualize_connection=False) - # This basal dendrite is not connected to soma - else: + # Update the list + roots_and_faces_centroids.append([dendrite_root, extrusion_face_centroid]) - # Report the issue - nmv.logger.info('Dendrite [%d] is NOT connected to soma' % i) + # This basal dendrite is not connected to soma + else: + + # Report the issue + nmv.logger.info('Dendrite [%d] is NOT connected to soma' % i) # Axon if not self.options.morphology.ignore_axon: @@ -691,23 +694,26 @@ def build_soma_soft_body(self, # Check that the profile points are not intersecting basal dendrites if not self.options.morphology.ignore_basal_dendrites: - # Do it dendrite by dendrite - intersect = False - for dendrite_root in self.morphology.dendrites: + # Ensure tha existence of basal dendrites + if self.morphology.dendrites is not None: - # Check that the profile point does NOT intersect the basal dendrite - if nmv.skeleton.ops.point_branch_intersect( - profile_point, dendrite_root, self.initial_soma_radius): + # Do it dendrite by dendrite + intersect = False + for dendrite_root in self.morphology.dendrites: - # Report the intersection - nmv.logger.detail( - "WARNING: profile point intersects basal dendrite") + # Check that the profile point does NOT intersect the basal dendrite + if nmv.skeleton.ops.point_branch_intersect( + profile_point, dendrite_root, self.initial_soma_radius): - intersect = True + # Report the intersection + nmv.logger.detail( + "WARNING: profile point intersects basal dendrite") - # If there is an intersection, next point - if intersect: - continue + intersect = True + + # If there is an intersection, next point + if intersect: + continue # Otherwise, we can consider the profile point valid and append it to the list valid_profile_points.append(profile_point) diff --git a/neuromorphovis/file/readers/morphology/swc_reader.py b/neuromorphovis/file/readers/morphology/swc_reader.py index c6ca0d33a..1322182ee 100644 --- a/neuromorphovis/file/readers/morphology/swc_reader.py +++ b/neuromorphovis/file/readers/morphology/swc_reader.py @@ -557,6 +557,12 @@ def read_file(self): # basal dendrites if len(axons_arbors) > 1: + # If the basal dendrites list is empty + if basal_dendrites_arbors is None: + + # Create a list to be able to append the other arbors + basal_dendrites_arbors = list() + # Add the others to the basal dendrites for i in range(1, len(axons_arbors)): basal_dendrites_arbors.append(axons_arbors[i]) @@ -577,6 +583,12 @@ def read_file(self): # basal dendrites if len(apical_dendrites_arbors) > 1: + # If the basal dendrites list is empty + if basal_dendrites_arbors is None: + + # Create a list to be able to append the other arbors + basal_dendrites_arbors = list() + # Add the others to the basal dendrites for i in range(1, len(apical_dendrites_arbors)): basal_dendrites_arbors.append(apical_dendrites_arbors[i])