changeset 2:9631aab7da53 draft

planemo upload commit 18df9e67efd4adafcde4eb9b62cd815e4afe9733-dirty
author iuc
date Wed, 26 Aug 2015 14:36:10 -0400
parents dd8e4e000d2f
children 20555566d6ad
files imagej2_analyze_skeleton.py imagej2_analyze_skeleton.xml imagej2_base_utils.py imagej2_macros.xml jython_script.py jython_utils.py test-data/detailed.tabular test-data/shortest_branch_all_yes.tabular test-data/shortest_branch_basic.tabular
diffstat 9 files changed, 471 insertions(+), 176 deletions(-) [+]
line wrap: on
line diff
--- a/imagej2_analyze_skeleton.py	Tue Aug 04 13:19:34 2015 -0400
+++ b/imagej2_analyze_skeleton.py	Wed Aug 26 14:36:10 2015 -0400
@@ -9,13 +9,12 @@
 parser = argparse.ArgumentParser()
 parser.add_argument( '--input', dest='input', help='Path to the input file' )
 parser.add_argument( '--input_datatype', dest='input_datatype', help='Datatype of the input image' )
+parser.add_argument( '--black_background', dest='black_background', help='Black background' )
 parser.add_argument( '--prune_cycle_method', dest='prune_cycle_method', default='none', help='Prune cycle method' )
 parser.add_argument( '--prune_ends', dest='prune_ends', default='no', help='Prune ends' )
 parser.add_argument( '--calculate_largest_shortest_path', dest='calculate_largest_shortest_path', default='no', help='Calculate largest shortest path' )
 parser.add_argument( '--show_detailed_info', dest='show_detailed_info', default='no', help='Show detailed info' )
 parser.add_argument( '--jython_script', dest='jython_script', help='Path to the Jython script' )
-parser.add_argument( '--max_heap_size_type', dest='max_heap_size_type', help='Type (default or megabytes) of max_heap_size value' )
-parser.add_argument( '--max_heap_size', dest='max_heap_size', help='Maximum size of the memory allocation pool used by the JVM.' )
 parser.add_argument( '--output', dest='output', help='Path to the output file' )
 args = parser.parse_args()
 
@@ -24,8 +23,6 @@
 # work for some features.  The following creates a symlink with an appropriate file
 # extension that points to the Galaxy dataset.  This symlink is used by ImageJ.
 tmp_input_path = imagej2_base_utils.get_input_image_path( tmp_dir, args.input, args.input_datatype )
-# Set the size of the memory allocation pool used by the JVM.
-memory_size = imagej2_base_utils.get_max_heap_size_value( args.max_heap_size_type, args.max_heap_size )
 
 # Define command response buffers.
 tmp_out = tempfile.NamedTemporaryFile().name
@@ -36,11 +33,12 @@
 error_log = tempfile.NamedTemporaryFile( delete=False ).name
 
 # Build the command line.
-cmd = imagej2_base_utils.get_base_command_imagej2( memory_size, jython_script=args.jython_script )
+cmd = imagej2_base_utils.get_base_command_imagej2( None, jython_script=args.jython_script )
 if cmd is None:
     imagej2_base_utils.stop_err( "ImageJ not found!" )
 cmd += ' %s' % error_log
 cmd += ' %s' % tmp_input_path
+cmd += ' %s' % args.black_background
 cmd += ' %s' % args.prune_cycle_method
 cmd += ' %s' % args.prune_ends
 cmd += ' %s' % args.calculate_largest_shortest_path
--- a/imagej2_analyze_skeleton.xml	Tue Aug 04 13:19:34 2015 -0400
+++ b/imagej2_analyze_skeleton.xml	Wed Aug 26 14:36:10 2015 -0400
@@ -1,26 +1,27 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<tool id="imagej2_analyze_skeleton" name="Analyze skeleton" version="1.0.0">
+<tool id="imagej2_analyze_skeleton" name="Analyze skeleton" version="@WRAPPER_VERSION@.0">
     <description>with ImageJ2</description>
     <macros>
         <import>imagej2_macros.xml</import>
     </macros>
-    <expand macro="fiji_20141125_requirements" />
+    <expand macro="fiji_requirements" />
     <command>
 <![CDATA[
     python $__tool_directory__/imagej2_analyze_skeleton.py
     --input "$input"
     --input_datatype $input.ext
+    --black_background $black_background
     --prune_cycle_method $prune_cycle_method
     --prune_ends $prune_ends
     --calculate_largest_shortest_path $calculate_largest_shortest_path
-    --show_detailed_info $show_detailed_info
-    @max_heap_size_args@
+    ##TODO: seel below--show_detailed_info $show_detailed_info
     --jython_script $__tool_directory__/jython_script.py
     --output "$output"
 ]]>
     </command>
     <inputs>
         <param format="bmp,eps,gif,jpg,pcx,pgm,png,psd,tiff" name="input" type="data" label="Select grayscale image"/>
+        <expand macro="black_background_param" />
         <param name="prune_cycle_method" type="select" label="Prune cycle method">
             <option value="none" selected="True">None</option>
             <option value="shortest_branch">Shortest branch</option>
@@ -35,11 +36,13 @@
             <option value="no" selected="True">No</option>
             <option value="yes">Yes</option>
         </param>
+        <!-- TODO: Uncomment this option when the tool has been enhanced to use the
+        future "Display labeled skeletons" option.  See http://fiji.sc/AnalyzeSkeleton.
         <param name="show_detailed_info" type="select" label="Show detailed info">
             <option value="no" selected="True">No</option>
             <option value="yes">Yes</option>
         </param>
-        <expand macro="max_heap_size_type_conditional" />
+        -->
     </inputs>
     <outputs>
         <data name="output" format="tabular" label="${tool.name} on ${on_string}" />
@@ -63,9 +66,12 @@
             <output name="output" file="largest_shortest_path_basic.tabular" ftype="tabular" />
         </test>
         <test>
+            <!-- TODO: Change this test and the following test to set "show_detailed_info"
+            to "yes" when the tool has been enhanced to use the future "Display labeled skeletons"
+            option.  See http://fiji.sc/AnalyzeSkeleton.  -->
             <param name="input" value="skeletonized_blobs.gif" />
             <param name="input_datatype" value="gif" />
-            <param name="show_detailed_info" value="yes" />
+            <!-- <param name="show_detailed_info" value="yes" /> -->
             <output name="output" file="detailed.tabular" ftype="tabular" />
         </test>
         <test>
@@ -73,7 +79,7 @@
             <param name="input_datatype" value="jpg" />
             <param name="prune_cycle_method" value="shortest_branch" />
             <param name="calculate_largest_shortest_path" value="yes" />
-            <param name="show_detailed_info" value="yes" />
+            <!-- <param name="show_detailed_info" value="yes" /> -->
             <output name="output" file="shortest_branch_all_yes.tabular" ftype="tabular" />
         </test>
     </tests>
@@ -112,7 +118,6 @@
 - **Prune cycle method**: prune the possible loops in the skeleton.
 - **Prune ends**: prunes any branch that ends in an end-point.
 - **Calculate largest shortest path**: calculate the largest shortest path of each skeleton using the APSP (all pairs shortest path).
-- **Show detailed info**: produces information about the branches of each skeleton in the image.
 ]]>
     </help>
     <citations>
--- a/imagej2_base_utils.py	Tue Aug 04 13:19:34 2015 -0400
+++ b/imagej2_base_utils.py	Wed Aug 26 14:36:10 2015 -0400
@@ -86,21 +86,6 @@
     os.symlink( input_file, image_path )
     return image_path
 
-def get_max_heap_size_value( max_heap_size_type, max_heap_size ):
-    """
-    Return a string that can be used by the javabridge to set the size
-    of the memory allocation pool used by the JVM.  The value must be
-    determined to be a multiple of 1024 or it will be ignored.
-    """
-    if max_heap_size_type == 'default':
-        return None
-    if max_heap_size_type == 'megabytes':
-        if int( max_heap_size ) % 1024 not in [ 0, 256, 512 ]:
-            return None
-        return '%sm' % str( max_heap_size )
-    if max_heap_size_type == 'gigabytes':
-        return '%sg' % str( max_heap_size )
-
 def get_platform_info_dict():
     '''Return a dict with information about the current platform.'''
     platform_dict = {}
@@ -172,6 +157,7 @@
             return ' %.1f' % val
         elif val_type == 'int':
             return ' %d' % val
+    return ' %s' % val
 
 def stop_err( msg ):
     sys.stderr.write( msg )
--- a/imagej2_macros.xml	Tue Aug 04 13:19:34 2015 -0400
+++ b/imagej2_macros.xml	Wed Aug 26 14:36:10 2015 -0400
@@ -1,11 +1,12 @@
 <?xml version='1.0' encoding='UTF-8'?>
 <macros>
-    <xml name="fiji_20141125_requirements">
+    <token name="@WRAPPER_VERSION@">1.0</token>
+    <xml name="fiji_requirements">
         <requirements>
             <requirement type="package" version="20141125">fiji</requirement>
         </requirements>
     </xml>
-    <xml name="python_bioformats_104_requirements">
+    <xml name="python_bioformats_requirements">
         <requirements>
             <requirement type="package" version="20141125">fiji</requirement>
             <requirement type="package" version="1.0.11">javabridge</requirement>
@@ -53,33 +54,27 @@
             <option value="yes">Yes</option>
         </param>
     </xml>
+    <xml name="black_background_param">
+        <param name="black_background" type="select" label="Black background" help="If Yes, the background is black and the foreground is white (no implies the opposite).">
+            <option value="no" selected="True">No</option>
+            <option value="yes">Yes</option>
+        </param>
+    </xml>
     <token name="@make_binary_args@">
         --iterations $iterations
         --count $count
         --black_background $black_background
         --pad_edges_when_eroding $pad_edges_when_eroding
     </token>
-    <xml name="max_heap_size_type_conditional">
-        <conditional name="set_max_heap_size">
-            <param name="max_heap_size_type" type="select" label="Maximum size of the memory allocation pool used by the JVM" help="This value must be a multiple of 1024 or it will be ignored and the system default will be used.">
-                <option value="default" selected="True">Do not set</option>
-                <option value="megabytes">Set in megabytes</option>
-                <option value="gigabytes">Set in gigabytes</option>
-            </param>
-            <when value="default" >
-                <param name="max_heap_size" type="integer" value="0" hidden="true" label="Do not set" help="Use system default"/>
-            </when>
-            <when value="megabytes">
-                <param name="max_heap_size" type="integer" value="512" min="256" label="Maximum size, in megabytes, of the memory allocation pool" help="Examples: 256, 512, etc."/>
-            </when>
-            <when value="gigabytes">
-                <param name="max_heap_size" type="integer" value="1" min="1" label="Maximum size, in gigabytes, of the memory allocation pool" help="Examples: 1, 2, etc."/>
-            </when>
-        </conditional>
-    </xml>
-    <token name="@max_heap_size_args@">
-        --max_heap_size_type $set_max_heap_size.max_heap_size_type
-        --max_heap_size $set_max_heap_size.max_heap_size
+    <token name="@requires_binary_input@">
+.. class:: warningmark
+
+This tool works on binary images, so other image types will automatically be converted to binary
+before they are analyzed.  This step is performed using the ImageJ2 **Make Binary** command with
+the following settings: **Iterations:** 1, **Count:** 1, **Pad edges when eroding:** No.  The tool
+allows you to choose the **Black background** setting.  If these settings are not appropriate,
+first manually convert the image to binary using the **Convert to binary (black and white) with ImageJ2**
+tool, which allows you to change them.
     </token>
     <xml name="image_datatypes">
         <option value="bmp">bmp</option>
--- a/jython_script.py	Tue Aug 04 13:19:34 2015 -0400
+++ b/jython_script.py	Wed Aug 26 14:36:10 2015 -0400
@@ -2,7 +2,6 @@
 import math
 import sys
 from ij import IJ
-from ij import ImagePlus
 from skeleton_analysis import AnalyzeSkeleton_
 
 BASIC_NAMES = [ 'Branches', 'Junctions', 'End-point Voxels',
@@ -10,10 +9,6 @@
                 'Triple Points', 'Quadruple Points', 'Maximum Branch Length' ]
 DETAIL_NAMES = [ 'Skeleton ID', 'Branch length', 'V1 x', 'V1 y', 'V1 z', 'V2 x',
                  'V2 y', 'V2 z', 'Euclidean distance' ]
-VALID_IMAGE_TYPES = [ ImagePlus.GRAY8 ]
-
-def asbool( val ):
-    return val == 'yes'
 
 def get_euclidean_distance( vertex1, vertex2 ):
     x1, y1, z1 = get_points( vertex1 )
@@ -55,7 +50,7 @@
         outf.write( '%d%s' % ( result.getJunctions()[ index ], sep ) )
         outf.write( '%d%s' % ( result.getEndPoints()[ index ], sep ) )
         outf.write( '%d%s' % ( result.getJunctionVoxels()[ index ], sep ) )
-        outf.write( '%d%s' % ( len( result.getListOfSlabVoxels() ), sep ) )
+        outf.write( '%d%s' % ( result.getSlabs()[ index ], sep ) )
         outf.write( '%.3f%s' % ( result.getAverageBranchLength()[ index ], sep ) )
         outf.write( '%d%s' % ( result.getTriples()[ index ], sep ) )
         outf.write( '%d%s' % ( result.getQuadruples()[ index ], sep ) )
@@ -101,31 +96,34 @@
 
 # Fiji Jython interpreter implements Python 2.5 which does not
 # provide support for argparse.
-error_log = sys.argv[ -7 ]
-input = sys.argv[ -6 ]
+error_log = sys.argv[ -8 ]
+input = sys.argv[ -7 ]
+black_background = jython_utils.asbool( sys.argv[ -6 ] )
 prune_cycle_method = sys.argv[ -5 ]
-prune_ends = asbool( sys.argv[ -4 ] )
-calculate_largest_shortest_path = asbool( sys.argv[ -3 ] )
+prune_ends = jython_utils.asbool( sys.argv[ -4 ] )
+calculate_largest_shortest_path = jython_utils.asbool( sys.argv[ -3 ] )
 if calculate_largest_shortest_path:
     BASIC_NAMES.extend( [ 'Longest Shortest Path', 'spx', 'spy', 'spz' ] )
     DETAIL_NAMES.extend( [ ' ', ' ', ' ', ' ' ] )
-show_detailed_info = asbool( sys.argv[ -2 ] )
+show_detailed_info = jython_utils.asbool( sys.argv[ -2 ] )
 output = sys.argv[ -1 ]
 
 # Open the input image file.
 input_image_plus = IJ.openImage( input )
-bit_depth = input_image_plus.getBitDepth()
-image_type = input_image_plus.getType()
 
 # Create a copy of the image.
-input_image_plus_copy = input_image_plus.createImagePlus()
-image_processor_copy = input_image_plus.getProcessor().duplicate()
-input_image_plus_copy.setProcessor( "iCopy", image_processor_copy )
+input_image_plus_copy = input_image_plus.duplicate()
+image_processor_copy = input_image_plus_copy.getProcessor()
 
 try:
-    if image_type not in VALID_IMAGE_TYPES:
-        # Convert the image to binary grayscale.
-        IJ.run( input_image_plus_copy, "Make Binary","iterations=1 count=1 edm=Overwrite do=Nothing" )
+    # Set binary options.
+    options = jython_utils.get_binary_options( black_background=black_background )
+    IJ.run( input_image_plus_copy, "Options...", options )
+
+    # Convert image to binary if necessary.
+    if not image_processor_copy.isBinary():
+        IJ.run( input_image_plus_copy, "Make Binary", "" )
+
     # Run AnalyzeSkeleton
     analyze_skeleton = AnalyzeSkeleton_()
     analyze_skeleton.setup( "", input_image_plus_copy )
--- a/jython_utils.py	Tue Aug 04 13:19:34 2015 -0400
+++ b/jython_utils.py	Wed Aug 26 14:36:10 2015 -0400
@@ -4,6 +4,9 @@
 IMAGE_PLUS_IMAGE_TYPE_FIELD_VALUES = { '0':'GRAY8', '1':'GRAY16', '2':'GRAY32',
                                        '3':'COLOR_256', '4':'COLOR_RGB' }
 
+def asbool( val ):
+    return str( val ).lower() in [ 'yes', 'true' ]
+
 def convert_before_saving_as_tiff( image_plus ):
     # The bUnwarpJ plug-in produces TIFF image stacks consisting of 3
     # slices which can be viewed in ImageJ.  The 3 slices are: 1) the
@@ -26,6 +29,14 @@
     IJ.saveAs( image_plus, 'png', tmp_out_png_path )
     return IJ.openImage( tmp_out_png_path )
 
+def get_binary_options( black_background, iterations=1, count=1, pad_edges_when_eroding='no' ):
+    options = [ 'edm=Overwrite', 'iterations=%d' % iterations, 'count=%d' % count ]
+    if asbool( pad_edges_when_eroding ):
+        options.append( 'pad' )
+    if asbool( black_background ):
+        options.append( "black" )
+    return " ".join( options )
+
 def get_display_image_type( image_type ):
     return IMAGE_PLUS_IMAGE_TYPE_FIELD_VALUES.get( str( image_type ), None )
 
--- a/test-data/detailed.tabular	Tue Aug 04 13:19:34 2015 -0400
+++ b/test-data/detailed.tabular	Wed Aug 26 14:36:10 2015 -0400
@@ -1,99 +1,2 @@
 # Branches	Junctions	End-point Voxels	Junction Voxels	Slab Voxels	Average branch length	Triple Points	Quadruple Points	Maximum Branch Length
 96	60	7	120	1246	17.344	56	3	70.882
-# Skeleton ID	Branch length	V1 x	V1 y	V1 z	V2 x	V2 y	V2 z	Euclidean distance
-1	70.882	23	76	0	26	26	0	50.090
-1	68.054	23	76	0	70	74	0	47.043
-1	62.225	27	122	0	71	78	0	62.225
-1	49.657	23	76	0	27	122	0	46.174
-1	44.243	26	26	0	29	69	0	43.105
-1	43.941	41	69	0	65	35	0	41.617
-1	41.113	42	20	0	74	10	0	33.526
-1	38.284	65	35	0	95	55	0	36.056
-1	36.385	126	88	0	134	116	0	29.120
-1	34.385	124	46	0	133	75	0	30.364
-1	33.456	45	111	0	71	93	0	31.623
-1	33.304	102	47	0	121	71	0	30.610
-1	33.213	124	46	0	137	19	0	29.967
-1	33.042	61	134	0	78	108	0	31.064
-1	32.870	70	74	0	95	55	0	31.401
-1	32.527	79	110	0	102	133	0	32.527
-1	31.071	41	69	0	70	74	0	29.428
-1	30.698	92	136	0	113	128	0	22.472
-1	29.698	79	30	0	100	51	0	29.698
-1	29.284	43	132	0	45	111	0	21.095
-1	28.799	99	11	0	122	11	0	23.000
-1	27.870	112	45	0	131	25	0	27.586
-1	25.000	82	102	0	107	102	0	25.000
-1	22.485	42	20	0	62	26	0	20.881
-1	22.071	109	71	0	112	91	0	20.224
-1	21.314	61	134	0	78	127	0	18.385
-1	20.556	98	55	0	109	71	0	19.416
-1	19.657	135	137	0	138	122	0	15.297
-1	19.657	43	132	0	61	134	0	18.111
-1	18.485	26	26	0	42	20	0	17.088
-1	17.971	32	123	0	45	111	0	17.692
-1	17.971	128	11	0	141	1	0	16.401
-1	17.728	78	127	0	92	136	0	16.643
-1	17.414	78	127	0	79	110	0	17.029
-1	16.971	121	71	0	133	75	0	12.649
-1	16.142	105	34	0	116	23	0	15.556
-1	16.142	123	137	0	135	137	0	12.000
-1	16.142	133	13	0	141	1	0	14.422
-1	15.828	71	78	0	71	93	0	15.000
-1	15.828	74	17	0	89	19	0	15.133
-1	15.828	116	23	0	131	25	0	15.133
-1	15.728	62	26	0	74	17	0	15.000
-1	15.556	85	6	0	74	17	0	15.556
-1	15.556	94	23	0	105	34	0	15.556
-1	15.556	130	12	0	141	1	0	15.556
-1	15.414	111	125	0	112	110	0	15.033
-1	15.314	71	93	0	82	102	0	14.213
-1	15.243	112	91	0	126	88	0	14.318
-1	15.142	74	10	0	85	2	0	13.601
-1	15.142	79	30	0	89	19	0	14.866
-1	14.728	32	123	0	43	132	0	14.213
-1	14.728	88	2	0	99	11	0	14.213
-1	14.657	94	23	0	99	11	0	13.000
-1	14.485	116	23	0	122	11	0	13.416
-1	14.243	123	137	0	135	137	0	12.000
-1	14.142	131	127	0	121	117	0	14.142
-1	13.728	113	128	0	123	137	0	13.454
-1	13.728	121	71	0	131	80	0	13.454
-1	13.414	121	117	0	134	116	0	13.038
-1	13.071	107	102	0	112	91	0	12.083
-1	12.828	29	69	0	41	69	0	12.000
-1	12.414	112	45	0	124	46	0	12.042
-1	12.314	102	133	0	111	125	0	12.042
-1	12.000	109	71	0	121	71	0	12.000
-1	11.899	112	110	0	121	117	0	11.402
-1	11.243	92	136	0	102	133	0	10.440
-1	10.243	62	26	0	65	35	0	9.487
-1	10.071	107	102	0	112	110	0	9.434
-1	10.071	126	88	0	131	80	0	9.434
-1	9.899	105	40	0	112	45	0	8.602
-1	9.485	23	76	0	29	69	0	9.220
-1	9.071	102	47	0	105	40	0	7.616
-1	8.485	131	25	0	137	19	0	8.485
-1	8.243	133	13	0	137	19	0	7.211
-1	7.657	78	108	0	82	102	0	7.211
-1	7.657	134	116	0	138	122	0	7.211
-1	7.071	133	127	0	138	122	0	7.071
-1	6.657	89	19	0	94	23	0	6.403
-1	6.414	74	10	0	74	17	0	7.000
-1	6.000	105	34	0	105	40	0	6.000
-1	6.000	122	11	0	128	11	0	6.000
-1	5.828	131	80	0	133	75	0	5.385
-1	5.414	27	122	0	32	123	0	5.099
-1	4.828	98	55	0	100	51	0	4.472
-1	4.828	100	51	0	102	47	0	4.472
-1	4.414	70	74	0	71	78	0	4.123
-1	4.243	124	70	0	121	71	0	3.162
-1	3.828	85	2	0	88	2	0	3.000
-1	3.828	111	125	0	113	128	0	3.606
-1	3.414	130	12	0	133	13	0	3.162
-1	3.000	95	55	0	98	55	0	3.000
-1	2.414	78	108	0	79	110	0	2.236
-1	2.414	128	11	0	130	12	0	2.236
-1	1.414	87	3	0	88	2	0	1.414
-1	1.000	78	30	0	79	30	0	1.000
-1	1.000	85	3	0	85	2	0	1.000
--- a/test-data/shortest_branch_all_yes.tabular	Tue Aug 04 13:19:34 2015 -0400
+++ b/test-data/shortest_branch_all_yes.tabular	Wed Aug 26 14:36:10 2015 -0400
@@ -1,9 +1,205 @@
 # Branches	Junctions	End-point Voxels	Junction Voxels	Slab Voxels	Average branch length	Triple Points	Quadruple Points	Maximum Branch Length	Longest Shortest Path	spx	spy	spz
-6	1	1	61790	5	96.506	0	0	214.378	296.418	0	0	0
-# Skeleton ID	Branch length	V1 x	V1 y	V1 z	V2 x	V2 y	V2 z	Euclidean distance	 	 	 	 
-1	420.417	0	0	0	0	0	0	0.000	 	 	 	 
-1	296.418	0	0	0	0	0	0	0.000	 	 	 	 
-1	215.853	0	0	0	0	0	0	0.000	 	 	 	 
-1	214.417	0	0	0	0	0	0	0.000	 	 	 	 
-1	214.378	78	199	0	0	0	0	213.740	 	 	 	 
-1	152.418	0	0	0	0	0	0	0.000	 	 	 	 
+1	0	2	0	1	2.414	0	0	2.414	2.414	0	60	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	3	91	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	3	91	0
+143	75	40	144	918	9.176	61	9	96.113	277.930	160	0	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	160	0	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	160	0	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	160	0	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	7	64	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	7	64	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	7	64	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	7	64	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	11	80	0
+1	0	2	0	0	1.414	0	0	1.414	1.414	14	66	0
+1	0	2	0	3	4.000	0	0	4.000	4.000	24	84	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	26	93	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	26	93	0
+1	0	2	0	3	4.414	0	0	4.414	4.414	35	92	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	35	92	0
+1	0	2	0	3	5.657	0	0	5.657	5.657	46	114	0
+5	2	4	2	97	23.182	2	0	58.385	100.770	91	174	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	91	174	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	91	174	0
+1	0	2	0	4	5.828	0	0	5.828	5.828	84	44	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	84	44	0
+1	0	2	0	4	5.828	0	0	5.828	5.828	93	52	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	93	52	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	104	14	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	104	14	0
+262	117	105	266	957	5.803	65	37	34.142	352.779	280	50	0
+96	43	31	104	373	6.437	25	11	34.142	212.675	191	111	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	191	111	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	191	111	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	134	53	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	134	53	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	134	53	0
+22	11	10	24	151	9.834	10	1	20.728	116.633	206	124	0
+5	2	4	2	44	12.285	2	0	26.799	52.184	175	175	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	175	175	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	175	175	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	175	175	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	175	175	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	175	175	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	168	58	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	168	58	0
+1	0	2	0	0	1.414	0	0	1.414	1.414	172	182	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	174	0	0
+1	0	2	0	0	1.414	0	0	1.414	1.414	175	169	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	176	181	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	176	181	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	178	0	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	178	175	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	178	175	0
+4	1	4	4	6	4.282	0	1	5.650	10.479	182	194	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	182	194	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	182	194	0
+1	0	2	0	2	3.000	0	0	3.000	3.000	182	0	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	182	0	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	189	53	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	189	53	0
+1	0	2	0	1	2.414	0	0	2.414	2.414	191	3	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	190	49	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	192	64	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	192	64	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	194	102	0
+1	0	2	0	1	2.414	0	0	2.414	2.414	195	68	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	195	68	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	195	68	0
+1	0	2	0	0	1.414	0	0	1.414	1.414	204	70	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	204	70	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	204	70	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	204	70	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	204	70	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	210	83	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	210	83	0
+1	0	2	0	6	8.657	0	0	8.657	8.657	211	69	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	211	69	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	211	69	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	214	65	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	214	65	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	214	65	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	214	65	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	214	65	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	214	65	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	217	91	0
+1	0	2	0	2	3.414	0	0	3.414	3.414	220	7	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	223	94	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	224	55	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	224	55	0
+3	1	3	1	8	4.219	1	0	6.414	9.828	233	11	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	233	11	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	233	11	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	233	11	0
+3	1	3	1	3	3.162	1	0	4.243	7.071	233	57	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	233	57	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	234	5	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	234	5	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	234	5	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	236	111	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	239	55	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	239	111	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	239	111	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	239	111	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	239	111	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	244	8	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	245	108	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	246	27	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	248	107	0
+1	0	2	0	1	2.414	0	0	2.414	2.414	250	110	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	250	110	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	252	31	0
+1	0	2	0	2	3.000	0	0	3.000	3.000	253	34	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	253	34	0
+1	0	2	0	0	1.414	0	0	1.414	1.414	253	68	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	253	71	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	253	71	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	253	71	0
+1	0	2	0	6	7.414	0	0	7.414	7.414	259	71	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	260	60	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	261	67	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	261	67	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	261	67	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	261	67	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	261	67	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	272	64	0
+1	0	2	0	11	13.243	0	0	13.243	13.243	274	18	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	276	47	0
+1	0	2	0	3	4.828	0	0	4.828	4.828	276	61	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	278	52	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	279	14	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	280	63	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	280	63	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	280	63	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	280	63	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	281	52	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	281	52	0
+1	0	2	0	2	3.000	0	0	3.000	3.000	283	47	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	282	54	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	282	77	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	283	10	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	284	66	0
+3	1	3	3	12	6.495	1	0	7.828	14.657	296	56	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	296	56	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	285	17	0
+1	0	2	0	1	2.414	0	0	2.414	2.414	286	29	0
+1	0	2	0	2	3.414	0	0	3.414	3.414	285	112	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	285	112	0
+1	0	2	0	3	4.414	0	0	4.414	4.414	287	84	0
+1	0	2	0	1	2.414	0	0	2.414	2.414	288	37	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	288	37	0
+1	0	2	0	1	2.414	0	0	2.414	2.414	288	122	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	288	122	0
+13	6	8	10	55	5.956	6	0	20.899	68.184	310	78	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	310	78	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	310	78	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	288	91	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	292	46	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	292	46	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	292	70	0
+1	0	2	0	7	8.828	0	0	8.828	8.828	293	121	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	293	121	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	293	121	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	293	121	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	296	144	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	297	27	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	297	27	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	297	157	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	297	157	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	300	88	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	300	98	0
+5	1	5	3	15	5.994	0	0	12.243	18.899	312	82	0
+1	0	2	0	1	2.414	0	0	2.414	2.414	303	36	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	302	104	0
+1	0	2	0	2	3.000	0	0	3.000	3.000	304	75	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	304	75	0
+1	0	2	0	1	2.414	0	0	2.414	2.414	304	124	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	304	124	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	304	73	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	304	73	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	304	73	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	304	73	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	304	73	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	304	73	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	307	89	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	307	89	0
+1	0	2	0	5	6.000	0	0	6.000	6.000	310	94	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	310	94	0
+1	0	2	0	4	6.243	0	0	6.243	6.243	311	47	0
+1	0	2	0	8	10.657	0	0	10.657	10.657	309	55	0
+1	0	2	0	4	5.000	0	0	5.000	5.000	311	57	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	311	57	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	311	57	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	312	27	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	312	55	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	312	84	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	312	84	0
+1	0	2	0	0	1.414	0	0	1.414	1.414	315	10	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	315	30	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	315	79	0
+1	0	2	0	2	3.000	0	0	3.000	3.000	317	27	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	316	55	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	317	63	0
+0	0	1	0	0	0.000	0	0	0.000	0.000	317	63	0
+1	0	2	0	1	2.000	0	0	2.000	2.000	318	83	0
+1	0	2	0	0	1.000	0	0	1.000	1.000	318	58	0
--- a/test-data/shortest_branch_basic.tabular	Tue Aug 04 13:19:34 2015 -0400
+++ b/test-data/shortest_branch_basic.tabular	Wed Aug 26 14:36:10 2015 -0400
@@ -1,2 +1,205 @@
 # Branches	Junctions	End-point Voxels	Junction Voxels	Slab Voxels	Average branch length	Triple Points	Quadruple Points	Maximum Branch Length
-6	1	1	61790	5	96.506	0	0	214.378
+1	0	2	0	1	2.414	0	0	2.414
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+143	75	40	144	918	9.176	61	9	96.113
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.414	0	0	1.414
+1	0	2	0	3	4.000	0	0	4.000
+1	0	2	0	1	2.000	0	0	2.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	3	4.414	0	0	4.414
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	3	5.657	0	0	5.657
+5	2	4	2	97	23.182	2	0	58.385
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	4	5.828	0	0	5.828
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	4	5.828	0	0	5.828
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+262	117	105	266	957	5.803	65	37	34.142
+96	43	31	104	373	6.437	25	11	34.142
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+22	11	10	24	151	9.834	10	1	20.728
+5	2	4	2	44	12.285	2	0	26.799
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.414	0	0	1.414
+1	0	2	0	1	2.000	0	0	2.000
+1	0	2	0	0	1.414	0	0	1.414
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+4	1	4	4	6	4.282	0	1	5.650
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	2	3.000	0	0	3.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	1	2.414	0	0	2.414
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	1	2.000	0	0	2.000
+1	0	2	0	1	2.414	0	0	2.414
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.414	0	0	1.414
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	6	8.657	0	0	8.657
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	2	3.414	0	0	3.414
+1	0	2	0	1	2.000	0	0	2.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+3	1	3	1	8	4.219	1	0	6.414
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+3	1	3	1	3	3.162	1	0	4.243
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	1	2.000	0	0	2.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	1	2.000	0	0	2.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	1	2.414	0	0	2.414
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	2	3.000	0	0	3.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.414	0	0	1.414
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	6	7.414	0	0	7.414
+1	0	2	0	1	2.000	0	0	2.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	11	13.243	0	0	13.243
+1	0	2	0	1	2.000	0	0	2.000
+1	0	2	0	3	4.828	0	0	4.828
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	1	2.000	0	0	2.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	2	3.000	0	0	3.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	1	2.000	0	0	2.000
+3	1	3	3	12	6.495	1	0	7.828
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	1	2.414	0	0	2.414
+1	0	2	0	2	3.414	0	0	3.414
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	3	4.414	0	0	4.414
+1	0	2	0	1	2.414	0	0	2.414
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	1	2.414	0	0	2.414
+0	0	1	0	0	0.000	0	0	0.000
+13	6	8	10	55	5.956	6	0	20.899
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	1	2.000	0	0	2.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	7	8.828	0	0	8.828
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	1	2.000	0	0	2.000
+1	0	2	0	1	2.000	0	0	2.000
+5	1	5	3	15	5.994	0	0	12.243
+1	0	2	0	1	2.414	0	0	2.414
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	2	3.000	0	0	3.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	1	2.414	0	0	2.414
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	5	6.000	0	0	6.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	4	6.243	0	0	6.243
+1	0	2	0	8	10.657	0	0	10.657
+1	0	2	0	4	5.000	0	0	5.000
+0	0	1	0	0	0.000	0	0	0.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	0	1.414	0	0	1.414
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	2	3.000	0	0	3.000
+1	0	2	0	0	1.000	0	0	1.000
+1	0	2	0	1	2.000	0	0	2.000
+0	0	1	0	0	0.000	0	0	0.000
+1	0	2	0	1	2.000	0	0	2.000
+1	0	2	0	0	1.000	0	0	1.000