Source code for neuron_morphology.validation.marker_validation
from neuron_morphology.validation.result import MarkerValidationError as ve
from neuron_morphology.constants import *
[docs]def validate_coordinates_corresponding_to_dendrite_tip(marker_file, morphology):
""" This function checks whether the coordinates for each dendrite marker
corresponds to a tip of a dendrite type in the related morphology """
result = []
marker_types = [CUT_DENDRITE]
morphology_tip_nodes = []
morphology_dendrite_nodes = morphology.get_node_by_types([BASAL_DENDRITE, APICAL_DENDRITE])
for node in morphology_dendrite_nodes:
if not morphology.children_of(node):
morphology_tip_nodes.append(node)
for marker in marker_file:
tip_marker = False
if marker['name'] in marker_types:
for node in morphology_tip_nodes:
""" Subtract one from the coordinates because there is a known discrepancy between the coordinates of
the marker file and the swc file
"""
if (marker['original_x'] - 1) == node['x'] and (marker['original_y'] - 1) == node['y'] and (marker['original_z'] - 1) == node['z']:
tip_marker = True
if not tip_marker:
result.append(ve("Coordinates for each dendrite (type 10) needs to correspond to a tip of a dendrite "
"type (type 3 or 4) in the related morphology", {'x': marker['original_x'],
'y': marker['original_y'],
'z': marker['original_z'],
'name': marker['name']}, "Info"))
return result
[docs]def validate_coordinates_corresponding_to_axon_tip(marker_file, morphology):
""" This function checks whether the coordinates for each axon marker
corresponds to a tip of a axon type in the related morphology """
result = []
marker_types = [NO_RECONSTRUCTION]
morphology_tip_nodes = []
morphology_axon_nodes = morphology.get_node_by_types([AXON])
for node in morphology_axon_nodes:
if not morphology.children_of(node):
morphology_tip_nodes.append(node)
for marker in marker_file:
tip_marker = False
if marker['name'] in marker_types:
for node in morphology_tip_nodes:
""" Subtract one from the coordinates because there is a known discrepancy between the coordinates of
the marker file and the swc file
"""
if (marker['original_x'] - 1) == node['x'] and (marker['original_y'] - 1) == node['y'] \
and (marker['original_z'] - 1) == node['z']:
tip_marker = True
if not tip_marker:
result.append(ve("Coordinates for each axon (type 20) needs to correspond to a tip of an axon "
"type (type 2) in the related morphology", {'x': marker['original_x'],
'y': marker['original_y'],
'z': marker['original_z'],
'name': marker['name']}, "Info"))
return result
[docs]def validate_expected_name(marker_file):
""" This function checks whether the markers have the expected types """
result = []
valid_names = [CUT_DENDRITE, NO_RECONSTRUCTION, TYPE_30]
for marker in marker_file:
if marker['name'] not in valid_names:
result.append(ve("Marker name needs to be one of these values: %s" % valid_names, {'x': marker['original_x'],
'y': marker['original_y'],
'z': marker['original_z'],
'name': marker['name']},
"Warning"))
return result
[docs]def validate_type_thirty_count(marker_file):
""" This function checks whether there is exactly one type 30 in the file """
result = []
type_30_markers = []
for marker in marker_file:
if marker['name'] is TYPE_30:
type_30_markers.append(marker)
if len(type_30_markers) > 1:
for marker in type_30_markers:
result.append(ve("Total number of type 30s is %s" % len(type_30_markers), {'x': marker['original_x'],
'y': marker['original_y'],
'z': marker['original_z'],
'name': marker['name']},
"Warning"))
if len(type_30_markers) < 1:
result.append(ve("Total number of type 30s is %s" % len(type_30_markers), {}, "Warning"))
return result
[docs]def validate_no_reconstruction_count(marker_file):
""" This function checks whether there is exactly one type 20 in the file """
result = []
no_reconstruction_markers = []
for marker in marker_file:
if marker['name'] is NO_RECONSTRUCTION:
no_reconstruction_markers.append(marker)
if len(no_reconstruction_markers) > 1:
for marker in no_reconstruction_markers:
result.append(ve("Total number of type 20s is more than one: %s" % len(no_reconstruction_markers),
{'x': marker['original_x'], 'y': marker['original_y'], 'z': marker['original_z'],
'name': marker['name']}, "Warning"))
return result
[docs]def validate(marker_file, morphology):
result = []
result += validate_expected_name(marker_file)
result += validate_coordinates_corresponding_to_dendrite_tip(marker_file, morphology)
result += validate_coordinates_corresponding_to_axon_tip(marker_file, morphology)
result += validate_no_reconstruction_count(marker_file)
result += validate_type_thirty_count(marker_file)
return result