Source code for allensdk.morphology.validate_swc

# Allen Institute Software License - This software license is the 2-clause BSD
# license plus a third clause that prohibits redistribution for commercial
# purposes without further permission.
#
# Copyright 2017. Allen Institute. 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.
#
# 3. Redistributions for commercial purposes are not permitted without the
# Allen Institute's written permission.
# For purposes of this license, commercial purposes is the incorporation of the
# Allen Institute's software into anything for which you will charge fees or
# other compensation. Contact terms@alleninstitute.org for commercial licensing
# opportunities.
#
# 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 HOLDER 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.
#
import argparse
import allensdk.core.swc as swc
try:
    xrange
except:
    from past.builtins import xrange


[docs]def validate_swc(swc_file): """ To be compatible with NEURON, SWC files must have the following properties: 1) a single root node with parent ID '-1' 2) sequentially increasing ID numbers 3) immediate children of the soma cannot branch """ soma_id = swc.Morphology.SOMA morphology = swc.read_swc(swc_file) # verify that there is a single root node num_soma_nodes = sum([(int(c['type']) == soma_id) for c in morphology.compartment_list]) if num_soma_nodes != 1: raise Exception( "SWC must have single soma compartment. Found: %d" % num_soma_nodes) # sanity check root = morphology.root if root is None: raise Exception("Morphology has no root node") # verify that children of the root have max one child for root_child_id in root['children']: root_child = morphology.compartment_index[root_child_id] num_grand_children = len(root_child['children']) if num_grand_children > 1: raise Exception("Child of root (%s) has more than one child (%d)" % ( root_child_id, num_grand_children)) # get a list of all of the ids, make sure they are unique while we're at it all_ids = set() for compartment in morphology.compartment_list: iid = int(compartment["id"]) if iid in all_ids: raise Exception("Compartment ID %s is not unique." % compartment["id"]) pid = int(compartment["parent"]) if iid < pid: raise Exception( "Compartment (%d) has a smaller ID that its parent (%d)" % (iid, pid)) all_ids.add(iid) # sort the ids and make sure there are no gaps sorted_ids = sorted(all_ids) for i in xrange(1, len(sorted_ids)): if sorted_ids[i] - sorted_ids[i - 1] != 1: raise Exception("Compartment IDs are not sequential") return True
[docs]def main(): try: parser = argparse.ArgumentParser( "validate an SWC file for use with NEURON") parser.add_argument('swc_file') args = parser.parse_args() validate_swc(args.swc_file) except Exception as e: print(str(e)) exit(1)
if __name__ == "__main__": main()