changeset 3:52c01fb29b2a draft

"planemo upload for repository https://github.com/bgruening/galaxytools/tree/master/tools commit c3917e27eb1c1deeb381aa0dc8161c07699562fb"
author bgruening
date Mon, 11 May 2020 07:48:09 -0400
parents d9bf32d13dfd
children 993faa34333b
files identify_primary_objects.xml macros.xml starting_modules.py starting_modules_groups.xml starting_modules_image.xml starting_modules_images.xml starting_modules_metadata.xml starting_modules_nameandtypes.xml test-data/common-complicated.cppipe test-data/common-nogroup.cppipe test-data/common.cppipe test-data/common.txt test-data/convert_objects_to_image.cppipe test-data/convert_objects_to_image.txt test-data/display_data_on_image.cppipe test-data/display_data_on_image.txt test-data/enhance_or_suppress_features.cppipe test-data/enhance_or_suppress_features.txt test-data/export_to_spreadsheet.cppipe test-data/export_to_spreadsheet.txt test-data/export_to_spreadsheet_create_gene.cppipe test-data/export_to_spreadsheet_create_gene_image_filename.cppipe test-data/export_to_spreadsheet_create_gene_metadata.cppipe test-data/export_to_spreadsheet_multi.cppipe test-data/gray_to_color.cppipe test-data/gray_to_color.txt test-data/identify_primary_objects.cppipe test-data/identify_primary_objects.txt test-data/identify_primary_objects_adv_adaptive_otsu.cppipe test-data/identify_primary_objects_adv_global_manual.cppipe test-data/identify_primary_objects_adv_global_mce.cppipe test-data/identify_primary_objects_adv_global_measurement.cppipe test-data/identify_primary_objects_adv_global_rb.cppipe test-data/identify_primary_objects_noadv.cppipe test-data/image_math.xml test-data/images.tar test-data/mask_image.cppipe test-data/mask_image.txt test-data/measure_granularity.cppipe test-data/measure_granularity.txt test-data/measure_image_area_occupied.cppipe test-data/measure_image_area_occupied.txt test-data/measure_image_intensity.cppipe test-data/measure_image_intensity.txt test-data/measure_image_quality.cppipe test-data/measure_image_quality.txt test-data/measure_object_intensity.cppipe test-data/measure_object_intensity.txt test-data/measure_object_size.txt test-data/measure_object_size_shape.cppipe test-data/measure_object_size_shape.txt test-data/measure_texture.cppipe test-data/measure_texture.txt test-data/relate_objects.cppipe test-data/relate_objects.txt test-data/save_images.cppipe test-data/save_images.txt
diffstat 53 files changed, 3181 insertions(+), 1294 deletions(-) [+]
line wrap: on
line diff
--- a/identify_primary_objects.xml	Thu Apr 16 05:35:37 2020 -0400
+++ b/identify_primary_objects.xml	Mon May 11 07:48:09 2020 -0400
@@ -3,15 +3,21 @@
 
     <macros>
         <import>macros.xml</import>
-        <xml name="ipo_common"> 
-            <param name="input_from_nat" type="text" label="Select the input image (from NamesAndTypes)">
+        <xml name="ipo_common">
+            <param name="input_from_nat" type="text" label="Enter the name of the input image (from NamesAndTypes)">
+                <expand macro="text_validator" />
+            </param>
+            <param name="name_to_be_identified" type="text" label="Enter the name of the primary objects to be identified">
                 <expand macro="text_validator" />
             </param>
-            <param name="name_to_be_identified" type="text" label="Name the primary objects to be identified">
-                <expand macro="text_validator" />
+            <param name="min_diameter" type="integer" label="Typical minimum diameter of objects, in pixel units (Min)" value="10" min="0">
+                <help>
+                    <![CDATA[
+                        The min and max diameters are crucial for two reasons: first, the module uses it to calculate certain automatic settings in order to identify your objects of interest properly (see below). Second, when used in conjunction with the 'Discard objects outside the diameter range?' setting below, you can choose to remove objects outside the size range you provide here.
+                        ]]>
+                </help>
             </param>
-            <param name="min_diameter" type="integer" label="Typical minimum diameter of objects, in pixel units (Min)" value="15" min="0" />
-            <param name="max_diameter" type="integer" label="Typical maximum diameter of objects, in pixel units (Max)" value="200" min="0" />
+            <param name="max_diameter" type="integer" label="Typical maximum diameter of objects, in pixel units (Max)" value="40" min="0" />
             <param name="discard_outside_border" type="select" display="radio" label="Discard objects outside the diameter range?">
                 <option value="Yes">Yes</option>
                 <option value="No">No</option>
@@ -24,34 +30,83 @@
 
         <xml name="clumped_objects_params">
             <conditional name="con_smoothing_filter">
-                <param name="smoothing_filter" type="select" label="Automatically calculate size of smoothing filter for decluping?">
+                <param name="smoothing_filter" type="select" label="Automatically calculate size of smoothing filter for declumping?">
+                    <help>
+                        <![CDATA[
+                            Select 'Yes' to automatically calculate the amount of smoothing applied to the image to assist in declumping. Select "No" to manually enter the smoothing filter size.
+                            This setting, along with the Minimum allowed distance between local maxima setting, affects whether objects close to each other are considered a single object or multiple objects. It does not affect the dividing lines between an object and the background.
+                            Please note that this smoothing setting is applied after thresholding, and is therefore distinct from the threshold smoothing method setting above, which is applied before thresholding.
+                            The size of the smoothing filter is automatically calculated based on the Typical diameter of objects, in pixel units (Min,Max) setting above. If you see too many objects merged that ought to be separate or too many objects split up that ought to be merged, you may want to override the automatically calculated value.
+                            ]]>
+                    </help>
                     <option value="Yes">Yes</option>
                     <option value="No">No</option>
                 </param>
                 <when value="No">
-                    <param name="size_smoothing_filter" type="integer" label="Size of smoothing filter" value="1"/>
+                    <param name="size_smoothing_filter" type="integer" label="Size of smoothing filter" min="0" max="1" value="1">
+                        <help>
+                            <![CDATA[
+                                If you see too many objects merged that ought to be separated (under-segmentation), this value should be lower. If you see too many objects split up that ought to be merged (over-segmentation), the value should be higher.
+                                Note that splitting and merging is also affected by your choice of settings for the setting, Automatically calculate minimum allowed distance between local maxima? It is an art to balance these two settings; read the help carefully for both.
+                                Reducing the texture of objects by increasing the smoothing increases the chance that each real, distinct object has only one peak of intensity but also increases the chance that two distinct objects will be recognized as only one object. Note that increasing the size of the smoothing filter increases the processing time exponentially.
+                                Enter 0 to prevent any image smoothing in certain cases; for example, for low resolution images with small objects ( < ~5 pixels in diameter).
+                                ]]>
+                        </help>
+                    </param>
                 </when>
                 <when value="Yes" />
             </conditional>
             <conditional name="con_min_distance">
                 <param name="min_distance" type="select" label="Automatically calculate minimum allowed distance between local maxima?">
+                    <help>
+                        <![CDATA[
+                            Select "Yes" to automatically calculate the distance between intensity maxima to assist in declumping. Select "No" to manually enter the permissible maxima distance.
+                            This setting, along with the Size of smoothing filter setting, affects whether objects close to each other are considered a single object or multiple objects. It does not affect the dividing lines between an object and the background. Local maxima that are closer together than the minimum allowed distance will be suppressed (the local intensity histogram is smoothed to remove the peaks within that distance).
+                            The distance can be automatically calculated based on the minimum entered for the Typical diameter of objects, in pixel units (Min,Max) setting above, but if you see too many objects merged that ought to be separate, or too many objects split up that ought to be merged, you may want to override the automatically calculated value.
+                            ]]>
+                    </help>
                     <option value="Yes">Yes</option>
                     <option value="No">No</option>
                 </param>
                 <when value="No">
-                    <param name="min_allowed_distance" type="integer" label="Supress local maxima that are closer than this minimum allowed distance" value="1" />
+                    <param name="min_allowed_distance" type="integer" label="Supress local maxima that are closer than this minimum allowed distance" value="7">
+                        <help>
+                            <![CDATA[
+                                Enter a positive integer, in pixel units. If you see too many objects merged that ought to be separated (under-segmentation), the value should be lower. If you see too many objects split up that ought to be merged (over-segmentation), the value should be higher.
+                                The maxima suppression distance should be set to be roughly equivalent to the radius of the smallest object of interest that you would expect to see in the experiment.
+                                Any distinct 'objects' that are found but are within two times this distance from each other will be assumed to be actually two lumpy parts of the same object, and they will be merged.
+                                Note that splitting and merging is also affected by your choice of settings for the setting 'Size of smoothing filter'.
+                                ]]>
+                        </help>
+                    </param>
                 </when>
                 <when value="Yes" />
-            </conditional>  
-            <param name="speed_up" type="select" display="radio" label="Speed up by using lower-resolution image to find local maxima?">    
+            </conditional>
+            <param name="speed_up" type="select" display="radio" label="Speed up by using lower-resolution image to find local maxima?">
+                <help>
+                    <![CDATA[
+                        Select 'Yes' to down-sample the image for declumping. This can be helpful for saving processing time on large images.
+                        Note that if you have entered a minimum object diameter of 10 or less, checking this box will have no effect.
+                        ]]>
+                </help>
                 <option value="Yes">Yes</option>
-                <option value="No">No</option>        
+                <option value="No">No</option>
             </param>
         </xml>
 
         <xml name="clumped_objects">
             <conditional name="con_dividing_lines">
                 <param name="dividing_lines" type="select" label="Method to draw dividing lines between clumped objects">
+                    <help>
+                        <![CDATA[
+                            This setting allows you to choose the method that is used to draw the line between segmented objects, provided that you have chosen to declump the objects. To decide between these methods, you can run Test mode to see the results of each.
+                            <br> - Intensity: Works best where the dividing lines between clumped objects are dimmer than the remainder of the objects.
+                            <br> - Technical description: Using the previously identified local maxima as seeds, this method is a watershed (Vincent and Soille, 1991) on the intensity image.
+                            <br> - Shape: Dividing lines between clumped objects are based on the shape of the clump. For example, when a clump contains two objects, the dividing line will be placed where indentations occur between the two objects. The intensity patterns in the original image are largely irrelevant: the cells need not be dimmer along the lines between clumped objects. Technical description: Using the previously identified local maxima as seeds, this method is a watershed on the distance-transformed thresholded image.
+                            <br> - Propagate: This method uses a propagation algorithm instead of a watershed. The image is ignored and the pixels are assigned to the objects by repeatedly adding unassigned pixels to the objects that are immediately adjacent to them. This method is suited in cases such as objects with branching extensions, for instance neurites, where the goal is to trace outward from the cell body along the branch, assigning pixels in the branch along the way. See the help for the IdentifySecondaryObjects module for more details on this method.
+                            <br> - None: If objects are well separated and bright relative to the background, it may be unnecessary to attempt to separate clumped objects. Using the very fast None option, a simple threshold will be used to identify objects.
+                            ]]>
+                    </help>
                     <option value="Intensity">Intensity</option>
                     <option value="Shape">Shape</option>
                     <option value="Propagate">Propagate</option>
@@ -66,12 +121,78 @@
                 <when value="Propagate"/>
                 <when value="None"/>
             </conditional>
-        </xml>   
+        </xml>
+        <xml name="otsu_threshold_category">
+
+            <conditional name="con_threshold_class">
+                <param name="threshold_class" type="select" label="Two-class or three-class thresholding?">
+                    <help>
+                        <![CDATA[
+                            - Two classes: Select this option if the grayscale levels are readily distinguishable into only two classes: foreground (i.e., regions of interest) and background.
+                            <br> - Three classes: Choose this option if the grayscale levels fall instead into three classes: foreground, background and a middle intensity between the two. You will then be asked whether the middle intensity class should be added to the foreground or background class in order to generate the final two-class output.
+                            ]]>
+                    </help>
+                    <option value="Two classes">Two classes</option>
+                    <option value="Three classes">Three classes</option>
+                </param>
+                <when value="Three classes">
+                    <param name="assign_pixel" type="select" label="Assign pixels in the middle intensity class to the foreground or the background?" help="Choose whether you want the pixels with middle grayscale intensities to be assigned to the foreground class or the background class.">
+                        <option value="Foreground">Foreground</option>
+                        <option value="Background">Background</option>
+                    </param>
+                </when>
+                <when value="Two classes" />
+            </conditional>
+        </xml>
+        <xml name="threshold_values">
+            <param name="threshold_correction_factor" type="float" value="1.0" min="0.0" label="Threshold correction factor">
+                <help>
+                    <![CDATA[
+                        The value entered here adjusts the threshold either upwards or downwards, by multiplying it by this value.
+                        A value of 1 means no adjustment, 0 to 1 makes the threshold more lenient and greater than 1 makes the threshold more stringent.
+                        ]]>
+                </help>
+            </param>
+            <param name="threshold_lower" type="float" value="0.0" min="0.0" max="1.0" label="Lower bound on threshold">
+                <help>
+                    <![CDATA[
+                        This is helpful as a safety precaution: when the threshold as calculated automatically is clearly outside a reasonable range, the min/max allowable threshold will override the automatic threshold.
+                        ]]>
+                </help>
+            </param>
+            <param name="threshold_upper" type="float" value="1.0" min="0.0" max="1.0" label="Upper bound on threshold"/>
+        </xml>
+        <xml name="threshold_smoothing_scale">
+            <param name="threshold_smoothing_scale" type="float" value="1.3488" label="Threshold smoothing scale">
+                <help>
+                    <![CDATA[
+                        This setting controls the scale used to smooth the input image before the threshold is applied.
+                        The input image can be optionally smoothed before being thresholded.
+                        Smoothing can improve the uniformity of the resulting objects, by removing holes and jagged edges caused by noise in the acquired image.
+                        Smoothing is most likely not appropriate if the input image is binary, if it has already been smoothed or if it is an output of a pixel-based classifier.
+                        The scale should be approximately the size of the artifacts to be eliminated by smoothing.
+                        A Gaussian is used with a sigma adjusted so that 1/2 of the Gaussian’s distribution falls within the diameter given by the scale (sigma = scale / 0.674) Use a value of 0 for no smoothing.
+                        Use a value of 1.3488 for smoothing with a sigma of 1.
+                        ]]>
+                </help>
+            </param>
+        </xml>
+        <xml name="threshold_method_help">
+            <help>
+                <![CDATA[
+                    The intensity threshold affects the decision of whether each pixel will be considered foreground (region(s) of interest) or background.
+                    A higher threshold value will result in only the brightest regions being identified, whereas a lower threshold value will include dim regions.
+                    When using the strategy "Global", you can have the threshold automatically calculated from a choice of several methods, however, when you choose "Adaptive" as the thresholding strategy, your only option is Otsu automatic thresholding.
+                    The threshold that is used for each image is recorded as a per-image measurement, so if you are surprised by unusual measurements from one of your images, you might check whether the automatically calculated threshold was unusually high or low compared to the other images. See the FlagImage module if you would like to flag an image based on the threshold value.
+
+                    <br> - Otsu: This approach calculates the threshold separating the two classes of pixels (foreground and background) by minimizing the variance within the each class.
+                    ]]>
+            </help>
+        </xml>
     </macros>
 
     <expand macro="py_requirements"/>
     <expand macro="cmd_modules" />
-    
     <configfiles>
         <inputs name="inputs" />
 
@@ -95,97 +216,146 @@
 def write_ipo():
     _str = "\nIdentifyPrimaryObjects:[module_num:%d|svn_version:\\'Unknown\\'|variable_revision_number:13|show_window:True|notes:\\x5B\\'Identify the nuclei from the DNA channel.\\', \\'PARAMS\\x3A\\', \\'- Typical diameter of objects (Min,Max)\\', \\'- Method to distinguish clumped objects\\x3A Shape/None. With Shape, the distance between the 2 centers can be changed.\\'\\x5D|batch_state:array(\\x5B\\x5D, dtype=uint8)|enabled:True|wants_pause:False]\n" % new_count
 
-    if adv == "Yes":
-        _str += FOURSPACES + "Select the input image:%s\n" % ipo['input_from_nat']
-        _str += FOURSPACES + "Name the primary objects to be identified:%s\n" % ipo['name_to_be_identified']
-        _str += FOURSPACES + "Typical diameter of objects, in pixel units (Min,Max):%d,%d\n" % (ipo['min_diameter'], ipo['max_diameter'])
-        _str += FOURSPACES + "Discard objects outside the diameter range?:%s\n" % ipo['discard_outside_border']
-        _str += FOURSPACES + "Discard objects touching the border of the image?:%s\n" % ipo['discard_touching_border']
+    _str += FOURSPACES + "Select the input image:%s\n" % ipo['input_from_nat']
+    _str += FOURSPACES + "Name the primary objects to be identified:%s\n" % ipo['name_to_be_identified']
+    _str += FOURSPACES + "Typical diameter of objects, in pixel units (Min,Max):%d,%d\n" % (ipo['min_diameter'], ipo['max_diameter'])
+    _str += FOURSPACES + "Discard objects outside the diameter range?:%s\n" % ipo['discard_outside_border']
+    _str += FOURSPACES + "Discard objects touching the border of the image?:%s\n" % ipo['discard_touching_border']
+
 
-        _str += FOURSPACES + "Method to distinguish clumped objects:%s\n" % ipo['con_distinguish_clumped_objects']['distinguish_clumped_objects']
+    # default values when adv=no;required in the cppipe file
+    distinguish_clumped_objects = "Intensity"
+    dividing_lines = "Intensity"
+    size_smoothing_filter = 1
+    min_allowed_distance = 7
+    speed_up = "Yes"
+    fill_hole = "After both thresholding and declumping"
+    calc_size_smoothing_filter = "Yes"
+    calc_min_disance = "Yes"
+    excessive_handling = "Continue"
+    max_obj =  500
+    thre_setting_version = 10
+    threshold_strategy = "Global"
+    threshold_method = "Minimum cross entropy"
+    threshold_smoothing_scale = 1.3488
+    threshold_correction_factor = 1.0
+    threshold_lower = 0.0
+    threshold_upper = 1.0
+    manual_threshold = 0.0
+    threshold_measurement = "None"
+    threshold_class = "Two classes"
+    assign_pixel = "Foreground"
+    adaptive_window = 50
+    lower_outlier_fraction = 0.05
+    upper_outlier_fraction = 0.05
+    avg_method = "Mean"
+    variance_method = "Standard deviation"
+    no_of_deviation = 2.0
 
+    if adv == "Yes":
+        distinguish_clumped_objects = ipo['con_distinguish_clumped_objects'][
+            'distinguish_clumped_objects']
         if "con_dividing_lines" in ipo['con_distinguish_clumped_objects']:
-            smoothing = ipo['con_distinguish_clumped_objects']['con_dividing_lines']['con_smoothing_filter'][
-                'smoothing_filter']
+            smoothing = ipo['con_distinguish_clumped_objects']['con_dividing_lines']['con_smoothing_filter']['smoothing_filter']
             supress = ipo['con_distinguish_clumped_objects']['con_dividing_lines']['con_min_distance']['min_distance']
-
-            _str += FOURSPACES + "Method to draw dividing lines between clumped objects:%s\n" % ipo['con_distinguish_clumped_objects']['con_dividing_lines']['dividing_lines']
+            dividing_lines = ipo['con_distinguish_clumped_objects']['con_dividing_lines']['dividing_lines']
 
             if smoothing == "Yes":
-                _str += FOURSPACES + "Size of smoothing filter:0\n"
-            else:
-                _str += FOURSPACES + "Size of smoothing filter:%d\n" % ipo['con_distinguish_clumped_objects']['con_dividing_lines']['con_smoothing_filter']['size_smoothing_filter']
-
-            if supress == "Yes":
-                _str += FOURSPACES + "Suppress local maxima that are closer than this minimum allowed distance:7\n"
+                size_smoothing_filter= 0
             else:
-                _str += FOURSPACES + "Suppress local maxima that are closer than this minimum allowed distance:%d\n" % ipo['con_distinguish_clumped_objects']['con_dividing_lines']['con_min_distance']['min_allowed_distance']
+                size_smoothing_filter = ipo['con_distinguish_clumped_objects']['con_dividing_lines']['con_smoothing_filter'][
+                            'size_smoothing_filter']
 
-            _str += FOURSPACES + "Speed up by using lower-resolution image to find local maxima?:%s\n" % ipo['con_distinguish_clumped_objects']['con_dividing_lines']['speed_up']
+            if supress == "No":
+                min_allowed_distance = ipo['con_distinguish_clumped_objects']['con_dividing_lines']['con_min_distance'][
+                            'min_allowed_distance']
 
-        _str += FOURSPACES + "Fill holes in identified objects?:%s\n" % ipo['fill_hole']
+            speed_up = ipo['con_distinguish_clumped_objects']['con_dividing_lines']['speed_up']
 
-        if "con_dividing_lines" in ipo['con_distinguish_clumped_objects']:
-            _str += FOURSPACES + "Automatically calculate size of smoothing filter for declumping?:%s\n" % ipo['con_distinguish_clumped_objects']['con_dividing_lines']['con_smoothing_filter']['smoothing_filter']
-            _str += FOURSPACES + "Automatically calculate minimum allowed distance between local maxima?:%s\n" % ipo['con_distinguish_clumped_objects']['con_dividing_lines']['con_min_distance']['min_distance']
+            calc_size_smoothing_filter = ipo['con_distinguish_clumped_objects']['con_dividing_lines']['con_smoothing_filter'][
+                        'smoothing_filter']
+            calc_min_disance = ipo['con_distinguish_clumped_objects']['con_dividing_lines']['con_min_distance']['min_distance']
+
+        fill_hole = ipo['fill_hole']
 
         if "con_handling_excessive" in ipo:
-            excessive = ipo['con_handling_excessive']['excessive_handling']
-
-            _str += FOURSPACES + "Handling of objects if excessive number of objects identified:%s\n" % ipo['con_handling_excessive']['excessive_handling']
-            if excessive == "Continue":
-                _str += FOURSPACES + "Maximum number of objects:500\n"
+            excessive_handling = ipo['con_handling_excessive']['excessive_handling']
+            if excessive_handling == "Continue":
+                max_obj = 500
             else:
-                _str += FOURSPACES + "Maximum number of objects:%d\n" + ipo['con_handling_excessive']['max_obj']
-
-        _str += FOURSPACES + "Use advanced settings?:%s\n" % ipo['advanced']
-        _str += FOURSPACES + "Threshold settings version:10\n"
-        _str += FOURSPACES + "Threshold strategy:%s\n" % ipo['con_threshold_strategy']['threshold_strategy']
+                max_obj = ipo['con_handling_excessive']['max_obj']
 
-        threshold_method = ipo['con_threshold_method']['threshold_method']
-        _str += FOURSPACES + "Thresholding method:%s\n" % threshold_method
-
-        _str += FOURSPACES + "Threshold smoothing scale:%.4f\n" % ipo['threshold_smoothing_scale']
-        _str += FOURSPACES + "Threshold correction factor:%.1f\n" % ipo['threshold_correction_factor']
-        _str += FOURSPACES + "Lower and upper bounds on threshold:%.1f,%.1f\n" % (ipo['threshold_lower'], ipo['threshold_upper'])
+        threshold_strategy=ipo['con_threshold_strategy']['threshold_strategy']
+        threshold_method = ipo['con_threshold_strategy']['con_threshold_method']['threshold_method']
 
-        if threshold_method == "Manual":
-            _str += FOURSPACES + "Manual threshold:%d\n" % ipo['con_threshold_method']['manual_threshold']
-        else:
-            _str += FOURSPACES + "Manual threshold:0\n"
-
-        if threshold_method == "Measurement":
-            _str += FOURSPACES + "Select the measurement to threshold with:%s\n" % ipo['con_threshold_method']['threshold_measurement']
+        if threshold_strategy =="Adaptive":
+            adaptive_window =ipo['con_threshold_strategy']['adaptive_window']
+            threshold_smoothing_scale = ipo['con_threshold_strategy']['threshold_smoothing_scale']
+            threshold_class = ipo['con_threshold_strategy']['con_threshold_method']['con_threshold_class'][
+                'threshold_class']
+            if threshold_class == "Three classes":
+                assing_pixel = ipo['con_threshold_strategy']['con_threshold_method']['con_threshold_class']['assign_pixel']
         else:
-            _str += FOURSPACES + "Select the measurement to threshold with:None\n"
+            if threshold_method == "Manual":
+                manual_threshold = ipo['con_threshold_strategy']['con_threshold_method']['manual_threshold']
+            else:
+                if threshold_method == "Measurement":
+                    threshold_measurement = ipo['con_threshold_strategy']['con_threshold_method']['global_measurement_threshold_cat'] +"_" +ipo['con_threshold_strategy']['con_threshold_method']['global_measurement_threshold_measurement']
 
-        threshold_class = ipo['con_threshold_method']['con_threshold_class']['threshold_class']
-        _str += FOURSPACES + "Two-class or three-class thresholding?:%s\n" % threshold_class
+                if threshold_method == "Otsu":
+                    threshold_class = ipo['con_threshold_strategy']['con_threshold_method']['con_threshold_class'][
+                    'threshold_class']
+                    if threshold_class == "Three classes":
+                        assign_pixel=ipo['con_threshold_strategy']['con_threshold_method']['con_threshold_class']['assign_pixel']
+
+                    threshold_smoothing_scale = ipo['con_threshold_strategy']['con_threshold_method']['threshold_smoothing_scale']
 
-        if threshold_class == "Three classes":
-            _str += FOURSPACES + "Assign pixels in the middle intensity class to the foreground or the background?:%s\n" % threshold_class['assign_pixel']
-        else:
-            _str += FOURSPACES + "Assign pixels in the middle intensity class to the foreground or the background?:Foreground\n"
+                if threshold_method == "Minimum cross entropy":
+                    threshold_smoothing_scale = ipo['con_threshold_strategy']['con_threshold_method']['threshold_smoothing_scale']
 
-        if ipo['con_threshold_strategy']['threshold_strategy'] == "Adaptive":
-            _str += FOURSPACES + "Size of adaptive window:%d\n" + ipo['con_threshold_strategy']['adaptive_window']
-        else:
-            _str += FOURSPACES + "Size of adaptive window:500\n"
+                if threshold_method == "RobustBackground":
+                    threshold_smoothing_scale = ipo['con_threshold_strategy']['con_threshold_method']['threshold_smoothing_scale']
+                    lower_outlier_fraction = ipo['con_threshold_strategy']['con_threshold_method']['lower_outlier_fraction']
+                    upper_outlier_fraction =ipo['con_threshold_strategy']['con_threshold_method']['upper_outlier_fraction']
+                    avg_method = ipo['con_threshold_strategy']['con_threshold_method']['avg_method']
+                    variance_method = ipo['con_threshold_strategy']['con_threshold_method'] ['variance_method']
+                    no_of_deviation = ipo['con_threshold_strategy']['con_threshold_method']['no_of_deviations']
+
+                threshold_correction_factor = ipo['con_threshold_strategy']['con_threshold_method'][
+                    'threshold_correction_factor']
+                threshold_lower = ipo['con_threshold_strategy']['con_threshold_method']['threshold_lower']
+                threshold_upper = ipo['con_threshold_strategy']['con_threshold_method']['threshold_upper']
 
-        if threshold_method == "RobustBackground":
-            _str += FOURSPACES + "Lower outlier fraction:%.2f\n" % ipo['con_threshold_method']['lower_outlier_fraction']
-            _str += FOURSPACES + "Upper outlier fraction:%.2f\n" % ipo['con_threshold_method']['upper_outlier_fraction']
-            _str += FOURSPACES + "Averaging method:%s\n" % ipo['con_threshold_method']['avg_method']
-            _str += FOURSPACES + "Variance method:%s\n" % ['variance_method']
-            _str += FOURSPACES + "# of deviations:%.2f\n" % ipo['con_threshold_method']['no_of_deviations']
-        else:
-            _str += FOURSPACES + "Lower outlier fraction:0.05\n"
-            _str += FOURSPACES + "Upper outlier fraction:0.05\n"
-            _str += FOURSPACES + "Averaging method:Mean\n"
-            _str += FOURSPACES + "Variance method:Standard deviation\n"
-            _str += FOURSPACES + "# of deviations:2.0\n"
+    _str += FOURSPACES + "Method to distinguish clumped objects:%s\n" % distinguish_clumped_objects
+    _str += FOURSPACES + "Method to draw dividing lines between clumped objects:%s\n" % dividing_lines
+    _str += FOURSPACES + "Size of smoothing filter:%d\n" % size_smoothing_filter
+    _str += FOURSPACES + "Suppress local maxima that are closer than this minimum allowed distance:%d\n" % min_allowed_distance
+    _str += FOURSPACES + "Speed up by using lower-resolution image to find local maxima?:%s\n" % speed_up
+    _str += FOURSPACES + "Fill holes in identified objects?:%s\n" % fill_hole
+    _str += FOURSPACES + "Automatically calculate size of smoothing filter for declumping?:%s\n" % calc_size_smoothing_filter
+    _str += FOURSPACES + "Automatically calculate minimum allowed distance between local maxima?:%s\n" % calc_min_disance
+    _str += FOURSPACES + "Handling of objects if excessive number of objects identified:%s\n" % excessive_handling
+    _str += FOURSPACES + "Maximum number of objects:%d\n" % max_obj
 
-        _str += FOURSPACES + "Thresholding method:%s\n" % threshold_method    # This is a repeated entry, but needed for pipeline file
+    _str += FOURSPACES + "Use advanced settings?:%s\n" % adv
+    _str += FOURSPACES + "Threshold settings version:10\n"
+    _str += FOURSPACES + "Threshold strategy:%s\n" % threshold_strategy
+    _str += FOURSPACES + "Thresholding method:%s\n" % threshold_method
+    _str += FOURSPACES + "Threshold smoothing scale:%.4f\n" % threshold_smoothing_scale
+    _str += FOURSPACES + "Threshold correction factor:%.1f\n" % threshold_correction_factor
+    _str += FOURSPACES + "Lower and upper bounds on threshold:%.1f,%.1f\n" % (threshold_lower, threshold_upper)
+    _str += FOURSPACES + "Manual threshold:%d\n" % manual_threshold
+    _str += FOURSPACES + "Select the measurement to threshold with:%s\n" % threshold_measurement
+    _str += FOURSPACES + "Two-class or three-class thresholding?:%s\n" % threshold_class
+    _str += FOURSPACES + "Assign pixels in the middle intensity class to the foreground or the background?:%s\n" % assign_pixel
+    _str += FOURSPACES + "Size of adaptive window:%d\n" % adaptive_window
+    _str += FOURSPACES + "Lower outlier fraction:%.2f\n" % lower_outlier_fraction
+    _str += FOURSPACES + "Upper outlier fraction:%.2f\n" % upper_outlier_fraction
+    _str += FOURSPACES + "Averaging method:%s\n" % avg_method
+    _str += FOURSPACES + "Variance method:%s\n" % variance_method
+    _str += FOURSPACES + "# of deviations:%.2f\n" % no_of_deviation
+
+    _str += FOURSPACES + "Thresholding method:%s\n" % threshold_method  # This is a repeated entry, but needed for pipeline file
 
     return _str
 
@@ -198,20 +368,19 @@
     module_count = int(v)
     new_count = module_count + 1
     lines[4] = k + ":%d\n" % new_count
-    with open("output", "w") as f:
+    with open("output.cppipe", "w") as f:
         f.writelines(lines)
         f.write(write_ipo())
-
-f.close()
-      </configfile>
+    f.close()
+        </configfile>
     </configfiles>
 
     <inputs>
-        <expand macro="input_pipeline_macro" /> 
+        <expand macro="input_pipeline_param" />
         <conditional name="con_advanced">
-            <param name="advanced" type="select"  display="radio" label="Use advanced settings?">
-                <option value="No">No</option>
-                <option value="Yes">Yes</option>
+            <param name="advanced" type="select" label="Use advanced settings?">
+                <option value="No">No, use basic settings</option>
+                <option value="Yes">Yes, use advanced settings</option>
             </param>
             <when value="No">
                 <expand macro="ipo_common" />
@@ -220,65 +389,119 @@
                 <expand macro="ipo_common" />
                 <conditional name="con_threshold_strategy">
                     <param name="threshold_strategy" type="select" label="Threshold strategy">
+                        <help>
+                            <![CDATA[
+                                The thresholding strategy determines the type of input that is used to calculate the threshold. These options allow you to calculate a threshold based on the whole image or based on image sub-regions.
+                                The choices for the threshold strategy are:
+
+                                <br> - Global: Calculates a single threshold value based on the unmasked pixels of the input image and use that value to classify pixels above the threshold as foreground and below as background.
+                                image0 This strategy is fast and robust, especially if the background is relatively uniform (for example, after illumination correction).
+
+                                <br> - Adaptive: Calculates a different threshold for each pixel, thus adapting to changes in foreground/background intensities across the image. For each pixel, the threshold is calculated based on the pixels within a given neighborhood (or window) surrounding that pixel.
+                                image1 This method is slower but can produce better results for non-uniform backgrounds. However, for significant illumination variation, using the CorrectIllumination modules is preferable.
+                                ]]>
+                        </help>
                         <option value="Global">Global</option>
-                        <option value="Adaptive">Adaptive</option>
+                        <option value="Adaptive" selected="true">Adaptive</option>
                     </param>
                     <when value="Adaptive">
-                        <param name="adaptive_window" type="integer" label="Size of adaptive window" value="500"/>
+                        <conditional name="con_threshold_method">
+                            <param name="threshold_method" type="select" label="Thresholding method">
+                                <expand macro="threshold_method_help"/>
+                                <option value="Otsu" selected="True">Otsu</option>
+                            </param>
+                            <when value="Otsu">
+                                <expand macro="otsu_threshold_category" />
+
+                            </when>
+                        </conditional>
+                        <param name="adaptive_window" type="integer" label="Size of the adaptive window" value="50" help="Often a good choice is some multiple of the largest expected object size." />
+                        <expand macro="threshold_smoothing_scale" />
+                        <expand macro="threshold_values" />
                     </when>
-                    <when value="Global" />
-                </conditional>
-                <conditional name="con_threshold_method">
-                    <param name="threshold_method" type="select" label="Thresholding method">
-                        <option value="Manual">Manual</option>
-                        <option value="Measurement">Measurement</option>
-                        <option value="Minimum cross entropy">Minimum cross entropy</option>
-                        <option value="Otsu">Otsu</option>
-                        <option value="RobustBackground">RobustBackground</option>
-                    </param>
-                    <when value="Otsu">
-                        <conditional name="con_threshold_class">
-                            <param name="threshold_class" type="select" label="Two-class or three-class thresholding?">
-                                <option value="Two classes">Two classes</option>
-                                <option value="Three classes">Three classes</option>
+                    <when value="Global">
+                        <conditional name="con_threshold_method">
+                            <param name="threshold_method" type="select" label="Thresholding method">
+                                <expand macro="threshold_method_help"/>
+                                <option value="Manual">Manual</option>
+                                <option value="Measurement">Measurement</option>
+                                <option value="Minimum cross entropy">Minimum cross entropy</option>
+                                <option value="Otsu" selected="True">Otsu</option>
+                                <option value="RobustBackground">Robust background</option>
                             </param>
-                            <when value="Three classes">
-                                <param name="assign_pixel" type="select" label="Assign pixels in the middle intensity class to the foreground or the background?">
-                                    <option value="Foreground">Foreground</option>
-                                    <option value="Background">Background</option>
+                            <when value="Otsu">
+                                <expand macro="otsu_threshold_category" />
+
+                                <expand macro="threshold_smoothing_scale" />
+                                <expand macro="threshold_values" />
+                            </when>
+                            <when value="Manual">
+                                <param name="manual_threshold" type="float" label="Enter the value that will act as an absolute threshold for the images" min="0" max="1" value="0" />
+                            </when>
+                            <when value="RobustBackground">
+                                <param name="lower_outlier_fraction" type="float" value="0.05" min="0.0" max="1.0" label="Lower outlier fraction" />
+                                <param name="upper_outlier_fraction" type="float" value="0.05" min="0.0" max="1.0" label="Upper outlier fraction" />
+                                <param name="avg_method" type="select" label="Averaging method">
+                                    <option value="Mean">Mean</option>
+                                    <option value="Median">Median</option>
+                                    <option value="Mode">Mode</option>
+                                </param>
+                                <param name="variance_method" type="select" label="Variance">
+                                    <option value="Standard deviation">Standard deviation</option>
+                                    <option value="Median absolute deviation">Median absolute deviation</option>
                                 </param>
+                                <param name="no_of_deviations" type="float" value="2.0" label="# of deviations">
+                                    <help>
+                                        <![CDATA[
+                                        Robust background calculates the variance, multiplies it by the value given by this setting and adds it to the average.
+                                        Adding several deviations raises the threshold well above the average. Use a larger number to be more stringent about identifying foreground pixels.
+                                        Use a smaller number to be less stringent. It’s even possible to use a negative number if you want the threshold to be lower than the average (e.g., for images that are densely covered by foreground).
+                                        ]]>
+                                    </help>
+                                </param>
+                                <expand macro="threshold_smoothing_scale" />
+                                <expand macro="threshold_values" />
                             </when>
-                            <when value="Two classes" />
+                            <when value="Measurement">
+                                <param name="global_measurement_threshold_cat" type="select" label="Select the measurement category to threshold with">
+                                    <option value="FileName">File Name</option>
+                                    <option value="Frame">Frame</option>
+                                    <option value="Height">Height</option>
+                                    <option value="MD5Digest">MD5Digest</option>
+                                    <option value="PathName">Path Name</option>
+                                    <option value="Scaling">Scaling</option>
+                                    <option value="Series">Series</option>
+                                    <option value="URL">URL</option>
+                                    <option value="Width">Width</option>
+                                </param>
+                                <param name="global_measurement_threshold_measurement" type="text" label="Select the measurement to threshold with">
+                                    <help>
+                                        Measurement corresponds to the names in Starting modules. 
+                                    </help>
+                                </param>
+                                <expand macro="threshold_values" />
+                            </when>
+                            <when value="Minimum cross entropy">
+                                <expand macro="threshold_smoothing_scale" />
+                                <expand macro="threshold_values" />
+                            </when>
                         </conditional>
                     </when>
-                    <when value="Manual">
-                        <param name="manual_threshold" type="integer" label="Manual threshold" value="0" />
-                    </when>
-                    <when value="RobustBackground">
-                        <param name="lower_outlier_fraction" type="float" value="0.05" label="Lower outlier fraction" />
-                        <param name="upper_outlier_fraction" type="float" value="0.05" label="Upper outlier fraction" />
-                        <param name="avg_method" type="select" label="Averaging method">
-                            <option value="Mean">Mean</option>
-                            <option value="Median">Median</option>
-                            <option value="Mode">Mode</option>
-                        </param>
-                        <param name="variance_method" type="select" label="Variance">
-                            <option value="Standard deviation">Standard deviation</option>
-                            <option value="Median absolute deviation">Median absolute deviation</option>                
-                        </param>
-                        <param name="no_of_deviations" type="float" value="2.0" label="# of deviations" />
-                    </when>
-                    <when value="Measurement"/>
-                    <when value="Minimum cross entropy"/>
                 </conditional>
-                <param name="threshold_smoothing_scale" type="float" value="0.0" label="Threshold smoothing scale"/>
-                <param name="threshold_correction_factor" type="float" value="0.0" label="Threshold correction factor"/>
-                <param name="threshold_lower" type="float" value="0.0" label="Lower bounds on threshold"/>
-                <param name="threshold_upper" type="float" value="1.0" label="Upper bounds on threshold"/>
+                
+
                 <conditional name="con_distinguish_clumped_objects">
                     <param name="distinguish_clumped_objects" type="select" label="Method to distinguish clumped objects">
+                        <help>
+                            <![CDATA[
+                                This setting allows you to choose the method that is used to distinguish between individual objects that are touching each other (and not properly delineated as two objects by thresholding alone). In other words, this setting allows you to “declump” a large, merged object into individual objects of interest. To decide between these methods, you can run Test mode to see the results of each.
+                                <br> - Intensity: For objects that tend to have only a single peak of brightness (e.g., objects that are brighter towards their interiors and dimmer towards their edges), this option counts each intensity peak as a separate object. The objects can be any shape, so they need not be round and uniform in size as would be required for the Shape option.
+                                <br> - Shape: For cases when there are definite indentations separating objects. The image is converted to black and white (binary) and the shape determines whether clumped objects will be distinguished. The declumping results of this method are affected by the thresholding method you choose.
+                                <br> - None: If objects are well separated and bright relative to the background, it may be unnecessary to attempt to separate clumped objects. Using the very fast None option, a simple threshold will be used to identify objects.
+                                ]]>
+                        </help>
                         <option value="Shape">Shape</option>
-                        <option value="Intensity">Intensity</option>
+                        <option value="Intensity" selected="True">Intensity</option>
                         <option value="None">None</option>
                     </param>
                     <when value="Shape">
@@ -290,18 +513,33 @@
                     <when value="None"/>
                 </conditional>
                 <param name="fill_hole" type="select" label="Fill holes in identified objects">
+                    <help>
+                        <![CDATA[
+                            This option controls how holes (regions of background surrounded by one or more objects) are filled in:
+                            <br> - After both thresholding and declumping: Fill in holes that are smaller than the maximum object size prior to declumping and to fill in any holes after declumping.
+                            <br> - After declumping only: Fill in holes located within identified objects after declumping.
+                            <br> - Never: Leave holes within objects. Please note that if an object is located within a hole and this option is enabled, the object will be lost when the hole is filled in.
+                            ]]>
+                    </help>
                     <option value="Never">Never</option>
-                    <option value="After both thresholding and declumping">After both thresholding and declumping</option>
+                    <option value="After both thresholding and declumping" selected="True">After both thresholding and declumping</option>
                     <option value="After declumping only">After declumping only</option>
                 </param>
 
                 <conditional name="con_handling_excessive">
                     <param name="excessive_handling" type="select" label="Handling of objects if excessive number of objects identified">
+                        <help>
+                            <![CDATA[
+                                This setting deals with images that are segmented into an unreasonable number of objects. This might happen if the module calculates a low threshold or if the image has unusual artifacts. IdentifyPrimaryObjects can handle this condition in one of three ways:
+                                <br> - Continue: Continue processing regardless if large numbers of objects are found.
+                                <br> - Erase: Erase all objects if the number of objects exceeds the maximum. This results in an image with no primary objects. This option is a good choice if a large number of objects indicates that the image should not be processed; it can save a lot of time in subsequent Measure modules.
+                                ]]>
+                        </help>
                         <option value="Continue">Continue</option>
                         <option value="Erase">Erase</option>
                     </param>
                     <when value="Erase">
-                        <param name="max_obj" type="integer" value="500" label="Maximum number of objects" />
+                        <param name="max_obj" type="integer" value="500" label="Maximum number of objects" help="This setting limits the number of objects in the image." />
                     </when>
                     <when value="Continue" />
                 </conditional>
@@ -310,11 +548,26 @@
     </inputs>
 
     <outputs>
-        <expand macro="output_pipeline_macro" />
+        <expand macro="output_pipeline_param" />
     </outputs>
 
     <tests>
         <test>
+            <!-- no advanced setting -->
+            <expand macro="test_input_pipeline_param" />
+            <conditional name="con_advanced">
+                <param name="advanced" value="No" />
+                <param name="input_from_nat" value="DNA" />
+                <param name="name_to_be_identified" value="Nuclei" />
+                <param name="min_diameter" value="15" />
+                <param name="max_diameter" value="200" />
+                <param name="discard_outside_border" value="Yes" />
+                <param name="discard_touching_border" value="Yes" />
+            </conditional>
+            <expand macro="test_out_file" file="identify_primary_objects_noadv.cppipe" />
+        </test>
+        <test>
+            <!-- advanced setting, adaptive threshold strategy, otsu method -->
             <expand macro="test_input_pipeline_param" />
             <conditional name="con_advanced">
                 <param name="advanced" value="Yes" />
@@ -324,44 +577,241 @@
                 <param name="max_diameter" value="200" />
                 <param name="discard_outside_border" value="Yes" />
                 <param name="discard_touching_border" value="Yes" />
+
+                <conditional name="con_threshold_strategy">
+                    <param name="threshold_strategy" value="Adaptive" />
+                    <conditional name="con_threshold_method">
+                        <param name="threshold_method" value="Otsu" />
+                        <conditional name="con_threshold_class">
+                            <param name="threshold_class" value="Three classes" />
+                            <param name="assign_pixel" value="Foreground" />
+                        </conditional>
+                    </conditional>
+                    <param name="adaptive_window" value="50" />
+                    <param name="threshold_smoothing_scale" value="1.5" />
+                    <param name="threshold_correction_factor" value="1" />
+                    <param name="threshold_lower" value="0.0" />
+                    <param name="threshold_upper" value="1.0" />
+                </conditional>
+                <conditional name="con_distinguish_clumped_objects">
+                    <param name="distinguish_clumped_objects" value="Shape" />
+                    <conditional name="con_dividing_lines" >
+                        <param name="dividing_lines" value="Shape" />
+                        <conditional name="con_smoothing_filter">
+                            <param name="smoothing_filter" value="No"/>
+                            <param name="size_smoothing_filter" value="1" />
+                        </conditional>
+                        <conditional name="con_min_distance">
+                            <param name="min_distance" value="No"/>
+                            <param name="min_allowed_distance" value="1"/>
+                        </conditional>
+                        <param name="speed_up" value="Yes" />
+                    </conditional>
+                </conditional>
+                <param name="fill_hole" value="After both thresholding and declumping" />
+                <conditional name="con_handling_excessive">
+                    <param name="excessive_handling" value="Continue"/>
+                </conditional>
+            </conditional>
+            <expand macro="test_out_file" file="identify_primary_objects_adv_adaptive_otsu.cppipe" />
+        </test>
+
+        <test>
+            <!-- advanced setting, global threshold strategy, manual method -->
+            <expand macro="test_input_pipeline_param" />
+            <conditional name="con_advanced">
+                <param name="advanced" value="Yes" />
+                <param name="input_from_nat" value="DNA" />
+                <param name="name_to_be_identified" value="Nuclei" />
+                <param name="min_diameter" value="5" />
+                <param name="max_diameter" value="20" />
+                <param name="discard_outside_border" value="No" />
+                <param name="discard_touching_border" value="Yes" />
+
                 <conditional name="con_threshold_strategy">
                     <param name="threshold_strategy" value="Global" />
+                    <conditional name="con_threshold_method">
+                        <param name="threshold_method" value="Manual" />
+                        <param name="manual_threshold" value="1" />
+                      </conditional>
                 </conditional>
-                <conditional name="con_threshold_method">
-                    <param name="threshold_method" value="Otsu" />
-                    <conditional name="con_threshold_class" >
-                        <param name="threshold_class" value="Two classes" />
+                <conditional name="con_distinguish_clumped_objects">
+                    <param name="distinguish_clumped_objects" value="Shape" />
+                    <conditional name="con_dividing_lines" >
+                        <param name="dividing_lines" value="Shape" />
+                        <conditional name="con_smoothing_filter">
+                            <param name="smoothing_filter" value="No"/>
+                            <param name="size_smoothing_filter" value="1" />
+                        </conditional>
+                        <conditional name="con_min_distance">
+                            <param name="min_distance" value="No"/>
+                            <param name="min_allowed_distance" value="1"/>
+                        </conditional>
+                        <param name="speed_up" value="Yes" />
                     </conditional>
                 </conditional>
-                <param name="threshold_smoothing_scale" value="1.3488" />
-                <param name="threshold_correction_factor" value="0.9" />
-                <param name="threshold_lower" value="0.0" />
-                <param name="threshold_upper" value="1.0" />
+                <param name="fill_hole" value="After both thresholding and declumping" />
+                <conditional name="con_handling_excessive">
+                    <param name="excessive_handling" value="Erase"/>
+                    <param name="max_obj" value="499" />
+                </conditional>
+            </conditional>
+            <expand macro="test_out_file" file="identify_primary_objects_adv_global_manual.cppipe" />
+        </test>
+        <test>
+            <!-- advanced setting, global threshold strategy, measurement method -->
+            <expand macro="test_input_pipeline_param" />
+            <conditional name="con_advanced">
+                <param name="advanced" value="Yes" />
+                <param name="input_from_nat" value="DNA" />
+                <param name="name_to_be_identified" value="Nuclei" />
+                <param name="min_diameter" value="5" />
+                <param name="max_diameter" value="20" />
+                <param name="discard_outside_border" value="Yes" />
+                <param name="discard_touching_border" value="No" />
+
+                <conditional name="con_threshold_strategy">
+                    <param name="threshold_strategy" value="Global" />
+                    <conditional name="con_threshold_method">
+                        <param name="threshold_method" value="Measurement" />
+                        <param name="global_measurement_threshold_cat" value="FileName" />
+                        <param name="global_measurement_threshold_measurement" value="DNA" />
+                        <param name="threshold_correction_factor" value="1" />
+                        <param name="threshold_lower" value="0.1" />  
+                        <param name="threshold_upper" value="0.4" />
+                    </conditional>
+                </conditional>
                 <conditional name="con_distinguish_clumped_objects">
-                    <param name="distinguish_clumped_objects" value="Shape" />
-                    <conditional name="con_dividing_lines">
+                    <param name="distinguish_clumped_objects" value="Intensity" />
+                    <conditional name="con_dividing_lines" >
                         <param name="dividing_lines" value="Shape" />
                         <conditional name="con_smoothing_filter">
-                            <param name="smoothing_filter" value="Yes" />
+                            <param name="smoothing_filter" value="Yes"/>
                         </conditional>
                         <conditional name="con_min_distance">
-                            <param name="min_distance" value="Yes" />
-                        </conditional>     
-                        <param name="speed_up" value="Yes" />             
+                            <param name="min_distance" value="No"/>
+                            <param name="min_allowed_distance" value="6"/>
+                        </conditional>
+                        <param name="speed_up" value="Yes" />
+                    </conditional>
+                </conditional>
+                <param name="fill_hole" value="After both thresholding and declumping" />
+                <conditional name="con_handling_excessive">
+                    <param name="excessive_handling" value="Continue"/>
+                </conditional>
+            </conditional>
+            <expand macro="test_out_file" file="identify_primary_objects_adv_global_measurement.cppipe" />
+        </test>
+
+        <test>
+            <!-- advanced setting, global threshold strategy, minimum cross entropy method -->
+            <expand macro="test_input_pipeline_param" />
+            <conditional name="con_advanced">
+                <param name="advanced" value="Yes" />
+                <param name="input_from_nat" value="DNA" />
+                <param name="name_to_be_identified" value="Nuclei" />
+                <param name="min_diameter" value="15" />
+                <param name="max_diameter" value="40" />
+                <param name="discard_outside_border" value="Yes" />
+                <param name="discard_touching_border" value="Yes" />
+
+                <conditional name="con_threshold_strategy">
+                    <param name="threshold_strategy" value="Global" />
+                    <conditional name="con_threshold_method">
+                        <param name="threshold_method" value="Minimum cross entropy" />
+                        <param name="threshold_smoothing_scale" value="1.5" />
+                        <param name="threshold_correction_factor" value="1" />
+                        <param name="threshold_lower" value="0.0" />
+                        <param name="threshold_upper" value="1.0" />
+                    </conditional>
+                </conditional>
+                <conditional name="con_distinguish_clumped_objects">
+                    <param name="distinguish_clumped_objects" value="Shape" />
+                    <conditional name="con_dividing_lines" >
+                        <param name="dividing_lines" value="Shape" />
+                        <conditional name="con_smoothing_filter">
+                            <param name="smoothing_filter" value="No"/>
+                            <param name="size_smoothing_filter" value="1" />
+                        </conditional>
+                        <conditional name="con_min_distance">
+                            <param name="min_distance" value="No"/>
+                            <param name="min_allowed_distance" value="7"/>
+                        </conditional>
+                        <param name="speed_up" value="Yes" />
                     </conditional>
                 </conditional>
+                <param name="fill_hole" value="After both thresholding and declumping" />
                 <conditional name="con_handling_excessive">
-                        <param name="excessive_handling" value="Continue" />
+                    <param name="excessive_handling" value="Continue"/>
+                </conditional>
+            </conditional>
+            <expand macro="test_out_file" file="identify_primary_objects_adv_global_mce.cppipe" />
+        </test>
+
+        <test>
+            <!-- advanced setting, global threshold strategy, robustbackground method -->
+            <expand macro="test_input_pipeline_param" />
+            <conditional name="con_advanced">
+                <param name="advanced" value="Yes" />
+                <param name="input_from_nat" value="DNA" />
+                <param name="name_to_be_identified" value="Nuclei" />
+                <param name="min_diameter" value="10" />
+                <param name="max_diameter" value="40" />
+                <param name="discard_outside_border" value="Yes" />
+                <param name="discard_touching_border" value="Yes" />
+
+                <conditional name="con_threshold_strategy">
+                    <param name="threshold_strategy" value="Global" />
+                    <conditional name="con_threshold_method">
+                        <param name="threshold_method" value="RobustBackground" />
+                        <param name="lower_outlier_fraction" value="0.06" />
+                        <param name="upper_outlier_fraction" value="0.07" />
+                        <param name="avg_method" value="Median"/>
+                        <param name="variance_method" value="Median absolute deviation"/>
+                        <param name="no_of_deviations" value="3.0" />
+                        <param name="threshold_smoothing_scale" value="1.4" />
+                        <param name="threshold_correction_factor" value="1" />
+                        <param name="threshold_lower" value="0.0" />
+                        <param name="threshold_upper" value="1.0" />
+                    </conditional>
+                </conditional>
+                <conditional name="con_distinguish_clumped_objects">
+                    <param name="distinguish_clumped_objects" value="Shape" />
+                    <conditional name="con_dividing_lines" >
+                        <param name="dividing_lines" value="Shape" />
+                        <conditional name="con_smoothing_filter">
+                            <param name="smoothing_filter" value="No"/>
+                            <param name="size_smoothing_filter" value="1" />
+                        </conditional>
+                        <conditional name="con_min_distance">
+                            <param name="min_distance" value="No"/>
+                            <param name="min_allowed_distance" value="7"/>
+                        </conditional>
+                        <param name="speed_up" value="Yes" />
+                    </conditional>
                 </conditional>
                 <param name="fill_hole" value="After both thresholding and declumping" />
+                <conditional name="con_handling_excessive">
+                    <param name="excessive_handling" value="Continue"/>
+                </conditional>
             </conditional>
-            <expand macro="test_out_file" file="identify_primary_objects.txt" />
+            <expand macro="test_out_file" file="identify_primary_objects_adv_global_rb.cppipe" />
         </test>
+
     </tests>
 
-    <expand macro="help" module="IdentifyPrimaryObjects"/>
+    <help>
+        <![CDATA[
+            .. class:: infomark
+
+            **What it does**
+
+            This tool identifies biological objects of interest. It requires grayscale images containing bright objects on a dark background. Incoming images must be 2D (including 2D slices of 3D images); please use the Watershed module for identification of objects in 3D.
+
+            @COMMON_HELP@
+            ]]>
+    </help>
 
     <expand macro="citations" />
 
 </tool>
-
--- a/macros.xml	Thu Apr 16 05:35:37 2020 -0400
+++ b/macros.xml	Mon May 11 07:48:09 2020 -0400
@@ -25,12 +25,12 @@
     </token>
 
 
-    <xml name="output_pipeline_macro">
-        <data name="out_file" from_work_dir="output" format="txt"/>
+    <xml name="output_pipeline_param">
+        <data name="output_pipeline" from_work_dir="output.cppipe" format="txt"/>
     </xml>
 
 
-    <xml name="input_pipeline_macro">
+    <xml name="input_pipeline_param">
         <param name="input_pipeline" type="data" format="data" label="Select the input CellProfiler pipeline"/>
     </xml>
 
@@ -81,25 +81,13 @@
 
 
     <xml name="test_input_pipeline_param">
-        <param name="input_pipeline" value="common.txt" />
-    </xml>
-
-
-    <xml name="test_out_file" token_file="common.txt">
-        <output name="out_file" ftype="txt" file="@FILE@" lines_diff="0"/>
+        <param name="input_pipeline" value="common.cppipe" />
     </xml>
 
 
-    <xml name="help" token_module="common">
-        <help>
-            This tool appends the inputs of the @MODULE@ module to an existing pipeline file (.cppipe)
-
-            Input: existing pipeline file
-
-            Output: new pipeline file
-
-            Combine this tool with "Common" tool and "CellProfiler" tool together to run the current module alone.
-        </help>
+    <xml name="test_out_file" token_file="common.cppipe">
+        <output name="output_pipeline" ftype="txt" file="@FILE@" lines_diff="0"/>
     </xml>
+    
 </macros>
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/starting_modules.py	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,227 @@
+import json
+import sys
+import os
+
+FOURSPACES = "    "
+
+input_json_path = sys.argv[1]
+
+params = json.load(open(input_json_path, "r"))
+
+
+def write_images():
+    filter_images = params['images']['filter_images']
+
+    _str = "\nImages:[module_num:1|svn_version:\\'Unknown\\'|variable_revision_number:2|show_window:False|notes:\\x5B\\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]\n"
+    _str += FOURSPACES+":\n"
+    _str += FOURSPACES + "Filter images?:%s\n" % filter_images
+    _str += FOURSPACES + "Select the rule criteria:and (extension does isimage) (directory doesnot startwith \".\")\n"
+
+    return _str
+
+
+def write_metadata():
+    metadata_extraction = params['metadata']['con_metadata_extraction']
+    extract = metadata_extraction['extract']
+
+    if 'extraction_method' in metadata_extraction:
+        method_count = len(metadata_extraction['extraction_method'])
+    else:
+        method_count = 1
+
+    _str = "\nMetadata:[module_num:2|svn_version:\\'Unknown\\'|variable_revision_number:4|show_window:False|notes:\\x5B\\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]\n"
+    _str += FOURSPACES + "Extract metadata?:%s\n" % extract
+
+    if extract == "No":
+        _str += FOURSPACES + "Metadata data type:Text\n"
+        _str += FOURSPACES + "Metadata types:{}\n"
+        _str += FOURSPACES + "Extraction method count:%d\n" % method_count
+        _str += FOURSPACES + "Metadata extraction method:Extract from file/folder names\n"
+        _str += FOURSPACES + "Regular expression to extract from file name:^(?P<Plate>.*)_(?P<Well>\x5BA-P\x5D\x5B0-9\x5D{2})_s(?P<Site>\x5B0-9\x5D)_w(?P<ChannelNumber>\x5B0-9\x5D)\n"
+        _str += FOURSPACES + "Regular expression to extract from folder name:(?P<Date>\x5B0-9\x5D{4}_\x5B0-9\x5D{2}_\x5B0-9\x5D{2})$\n"
+        _str += FOURSPACES + "Extract metadata from:All images\n"
+        _str += FOURSPACES + "Select the filtering criteria:and (file does contain \"\")\n"
+        _str += FOURSPACES + "Metadata file location:\n"
+        _str += FOURSPACES + "Match file and image metadata:\x5B\x5D\n"
+        _str += FOURSPACES + "Use case insensitive matching?:No\n"
+    else:
+        _str += FOURSPACES + "Metadata data type:Text\n"  #default Text,not possible to select in Galaxy
+        _str += FOURSPACES + "Metadata types:{}\n"
+        _str += FOURSPACES + "Extraction method count:%d\n" % method_count
+
+        for methods in metadata_extraction["extraction_method"]:
+            _str += FOURSPACES + "Metadata extraction method:%s\n" % methods["metadata_extraction_method"]
+            _str += FOURSPACES + "Metadata source:%s\n" % methods["con_metadata_source"]["metadata_source"]
+
+            if "file_name_regex" in methods["con_metadata_source"]:
+                file_regex = methods["con_metadata_source"]["file_name_regex"]
+                folder_regex = "(?P<folderField1>.*)"
+            elif "folder_name_regex" in methods["con_metadata_source"]:
+                file_regex = "(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)"
+                folder_regex = methods["con_metadata_source"]["folder_name_regex"]
+            else:
+                # default regex
+                file_regex = "(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)"
+                folder_regex = "(?P<folderField1>.*)"
+
+            _str += FOURSPACES + "Regular expression to extract from file name:%s\n" % file_regex
+            _str += FOURSPACES + "Regular expression to extract from folder name:%s\n" % folder_regex
+
+            _str += FOURSPACES + "Extract metadata from:%s\n" % methods["con_metadata_extract_from"]["extract_metadata_from"]
+
+            if methods["con_metadata_extract_from"]["extract_metadata_from"] == "Images matching a rule":
+                rule_str =""
+                for r in methods["con_metadata_extract_from"]["r_match"]:
+                    if r["con_match"]["rule_type"] == "extension":
+                        rule_str += " (" + r["con_match"]["rule_type"] + " " + r["con_match"]["operator"] + " " + \
+                                    r["con_match"]["match_type"]+")"
+                    else:
+                        rule_str +=" (" + r["con_match"]["rule_type"] + " " + r["con_match"]["operator"] + " " +\
+                                   r["con_match"]["contain"] + " \"" + r["con_match"]["match_value"] +"\")"
+
+
+                _str += FOURSPACES + "Select the filtering criteria:" + methods["con_metadata_extract_from"]["match_all_any"] + rule_str +"\n"
+            else:
+                _str += FOURSPACES + "Select the filtering criteria:and (file does contain \"\")\n" #this line is required even if it's not used
+
+            _str += FOURSPACES + "Metadata file location:\n"
+            _str += FOURSPACES + "Match file and image metadata:\x5B\x5D\n"
+            _str += FOURSPACES + "Use case insensitive matching?:No\n"
+
+    return _str
+
+
+def write_nameandtypes():
+    nameandtypes = params['nameandtypes']
+    assign_a_name = nameandtypes['con_assign_a_name_to']['assign_a_name_to']
+
+    if "con_select_image_type" in nameandtypes['con_assign_a_name_to']:
+        con_set_intensity = nameandtypes['con_assign_a_name_to']['con_select_image_type']['con_set_intensity']
+        max_intensity = con_set_intensity['maximum_intensity'] if "maximum_intensity" in con_set_intensity else 255.0
+    else:
+        max_intensity = 255.0
+
+    pixel_space = nameandtypes['pixel_space']
+
+    rule_count = len(nameandtypes['con_assign_a_name_to']['r_match_rule']) if "r_match_rule" in nameandtypes['con_assign_a_name_to'] else 1
+
+    process_3d = nameandtypes['pixel_space']['process_3d']
+    x_spacing = 1.0 if "x_spacing" not in pixel_space else pixel_space["x_spacing"]
+    y_spacing = 1.0 if "y_spacing" not in pixel_space else pixel_space["y_spacing"]
+    z_spacing = 1.0 if "z_spacing" not in pixel_space else pixel_space["z_spacing"]
+
+    _str = "\nNamesAndTypes:[module_num:3|svn_version:\\'Unknown\\'|variable_revision_number:8|show_window:False|notes:\\x5B\\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\\'\\x5D|batch_state:array(\\x5B\\x5D, dtype=uint8)|enabled:True|wants_pause:False]\n"
+
+    _str += FOURSPACES + "Assign a name to:%s\n" % assign_a_name
+
+    if assign_a_name == "All images":
+        _str += FOURSPACES + "Select the image type:%s\n" % nameandtypes['con_assign_a_name_to']['con_select_image_type']['select_image_type']
+        _str += FOURSPACES + "Name to assign these images:%s\n" % nameandtypes['con_assign_a_name_to']['name_to_assign']
+        _str += FOURSPACES + "Match metadata:[]\n"
+
+        _str += FOURSPACES + "Image set matching method:Order\n"
+        _str += FOURSPACES + "Set intensity range from:%s\n" % con_set_intensity['set_intensity_range_from']
+        _str += FOURSPACES + "Assignments count:%s\n" % rule_count
+        _str += FOURSPACES + "Single images count:0\n"
+        _str += FOURSPACES + "Maximum intensity:%.1f\n" % max_intensity
+        _str += FOURSPACES + "Process as 3D?:%s\n" % process_3d
+
+    else:
+        #the below lines are not relevant to "images matching rules", but needed in pipeline file
+        _str += FOURSPACES + "Select the image type:Grayscale image\n"
+        _str += FOURSPACES + "Name to assign these images:DNA\n"
+        _str += FOURSPACES + "Match metadata:[]\n"
+
+        _str += FOURSPACES + "Image set matching method:%s\n" % nameandtypes['con_assign_a_name_to']['matching_method']
+        _str += FOURSPACES + "Set intensity range from:Image metadata\n"
+        _str += FOURSPACES + "Assignments count:%d\n" % rule_count
+        _str += FOURSPACES + "Single images count:0\n"
+        _str += FOURSPACES + "Maximum intensity:%.1f\n" % max_intensity
+        _str += FOURSPACES + "Process as 3D?:%s\n" % process_3d
+
+    _str += FOURSPACES + "Relative pixel spacing in X:%.1f\n" % x_spacing
+    _str += FOURSPACES + "Relative pixel spacing in Y:%.1f\n" % y_spacing
+    _str += FOURSPACES + "Relative pixel spacing in Z:%.1f\n" % z_spacing
+
+    if assign_a_name == "Images matching rules":
+        for rule in nameandtypes["con_assign_a_name_to"]["r_match_rule"]:
+
+            rule_str = ""
+            if len(rule["r_match"]) >0 :
+                for r in rule["r_match"]:
+                        if r["con_match"]["rule_type"] == "file" or r["con_match"]["rule_type"] == "directory":
+                            rule_str += " (" + r["con_match"]["rule_type"] + " "+r["con_match"]["operator"]+" "+\
+                                        r["con_match"]["contain"]+" \"" + r["con_match"]["match_value"] +"\")"
+                        else:
+                            rule_str += " ("+ r["con_match"]["rule_type"] + " " + r["con_match"]["operator"] + " " + \
+                                        r["con_match"]["match_type"] + ")"
+            else:
+                rule_str = " (file does contain \"\")"  #need to have a value even if it is not used
+
+            _str += FOURSPACES + "Select the rule criteria:" + rule["match_all_any"] + rule_str +"\n"
+
+            img_or_obj = rule["con_select_image_type"]["select_image_type"]
+
+            if img_or_obj == "Objects":
+                _str += FOURSPACES + "Name to assign these images:DNA\n"
+                _str += FOURSPACES + "Name to assign these objects:%s\n" % rule["con_select_image_type"]["name_to_assign"]
+            else:
+                _str += FOURSPACES + "Name to assign these images:%s\n" % rule["con_select_image_type"]["name_to_assign"]
+                _str += FOURSPACES + "Name to assign these objects:Cell\n"
+
+            _str += FOURSPACES + "Select the image type:%s\n" % img_or_obj
+
+
+            intensity_range="Image metadata" #default value
+            if img_or_obj == "Grayscale image" or img_or_obj == "Color image":
+                intensity_range = rule["con_select_image_type"]["con_set_intensity"]["set_intensity_range_from"]
+
+            _str += FOURSPACES + "Set intensity range from:%s\n" % intensity_range
+
+            if intensity_range == "Manual":
+                _str += FOURSPACES + "Maximum intensity:%s\n" % rule["con_select_image_type"]["con_set_intensity"]["maximum_intensity"]
+            else:
+                _str += FOURSPACES + "Maximum intensity:255.0\n"
+
+
+    return _str
+
+
+def write_groups():
+    groups = params['groups']
+
+    _str = "\nGroups:[module_num:4|svn_version:\\'Unknown\\'|variable_revision_number:2|show_window:False|notes:\\x5B\\\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\\'\\x5D|batch_state:array(\\x5B\\x5D, dtype=uint8)|enabled:True|wants_pause:False]\n"
+
+    group_images =  groups["con_groups"]["group_images"]
+
+    _str += FOURSPACES + "Do you want to group your images?:%s\n" % group_images
+    _str += FOURSPACES + "grouping metadata count:1\n"
+
+    if group_images == "Yes":
+        _str += FOURSPACES + "Metadata category:%s\n" % groups["con_groups"]["group_category"]
+    else:
+        _str += FOURSPACES + "Metadata category:None\n"
+
+    return _str
+
+
+with open("output.cppipe", "w") as f:
+    headers = ["CellProfiler Pipeline: http://www.cellprofiler.org\n",
+               "Version:3\n",
+               "DateRevision:319\n",
+               "GitHash:\n",
+               "ModuleCount:4\n",
+               "HasImagePlaneDetails:False",
+               "\n"]
+
+    f.writelines(headers)
+
+    img_str = write_images()
+    metadata_str = write_metadata()
+    nameandtypes_str = write_nameandtypes()
+    groups_str = write_groups()
+
+    output_str = img_str + metadata_str + nameandtypes_str + groups_str
+
+    f.write(output_str)
+    f.close()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/starting_modules_groups.xml	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,32 @@
+<macros>
+    <xml name="starting_modules_groups">
+        <section name="groups" title="Groups" expanded="false">
+        <conditional name="con_groups">
+            <param name="group_images" type="select" value="No" label="Do you want to group your images?">
+                <option value="Yes">Yes, group the images</option>
+                <option value="No" selected="true">No, do not group images</option>
+            </param>
+            <when value="Yes">
+                <param name="group_category" type="select" label="Metadata category">
+                    <option value="None" selected="true">None</option>
+                    <option value="ChannelNumber">Channel number</option>
+                    <option value="FileLocation">File location</option>
+                    <option value="Plate">Plate</option>
+                    <option value="Frame">Frame</option>
+                    <option value="Series">Series</option>
+                    <option value="Site">Site</option>
+                    <option value="Well">Well</option>
+                    <option value="field1">field1</option>
+                    <option value="field2">field2</option>
+                    <option value="field3">field3</option>
+                    <option value="field4">field4</option>
+                    <option value="field5">field5</option>
+                    <option value="field6">field6</option>
+                </param>
+            </when>
+            <when value="No">
+            </when>
+        </conditional>
+    </section>
+    </xml>
+</macros>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/starting_modules_images.xml	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,10 @@
+<macros>
+    <xml name="starting_modules_images">
+        <section name="images" title="Images" expanded="false">
+            <param name="filter_images" type="select" label="Do you want to filter only the images?" help="Enabling file filtering is useful if, for example, you drag-and-dropped a folder onto the file list panel which contains a mixture of images that you want to analyze and other files that you want to ignore.">
+                <option value="Images only">Select the images only</option>
+                <option value="No filtering">Select all the files</option>
+            </param>
+        </section>
+    </xml>
+</macros>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/starting_modules_metadata.xml	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,92 @@
+<macros>
+    <xml name="image_matching_rules_metadata">
+        <param name="match_all_any" type="select" display="radio" label="Match the following rules">
+            <option value="and">All</option>
+            <option value="or">Any</option>
+        </param>
+        <repeat name="r_match" title="filtering rules">
+            <conditional name="con_match">
+                <param name="rule_type" type="select" label="Select the filtering criteria">
+                    <option value="file">File</option>
+                    <option value="directory">Directory</option>
+                    <option value="extension">Extension</option>
+                </param>
+                <when value="file">
+                    <expand macro="name_type_rule_matching_file"/>
+                </when>
+                <when value="directory">
+                    <expand macro="name_type_rule_matching_file"/>
+                </when>
+                <when value="extension">
+                    <expand macro="name_type_rule_ext" />
+                </when>
+            </conditional>
+        </repeat>
+    </xml>
+    <xml name="starting_modules_metadata">
+        <section name="metadata" title="Metadata" expanded="false">
+            <conditional name="con_metadata_extraction">
+                <param name="extract" type="select" label="Do you want to extract the metadata?">
+                    <option value="Yes">Yes, specify metadata</option>
+                    <option value="No" selected="true">No, do not specify metadata</option>
+                </param>
+                <when value="Yes">
+                    <repeat name="extraction_method" title="new metadata" min="1">
+                        <param name="metadata_extraction_method" type="select" label="Metadata extraction method" help="Metadata can be stored in either or both of two ways: internally (through the file naming, directory structuring, or the file header information) or externally (external index, such as spreadsheet or database of some kind). " >
+                            <option value="Extract from file/folder names">Extract from file/folder names</option>
+                            <option value="Import from file">Import from file</option>
+                            <option value="Extract from image file headers">Extract from image file headers</option>
+                        </param>
+                        <conditional name="con_metadata_source">
+                            <param name="metadata_source" type="select" label="Metadata source" help="You can extract the metadata from the image file name or from its folder name.">
+                                <option value="File name">File name</option>
+                                <option value="Folder name">Folder name</option>
+                            </param>
+                            <when value="File name">
+                                <param name="file_name_regex" type="select" label="Select the pattern to extract metadata from the file name" help="Image file names must comply with one of the patterns. For example, plate_reagent_timepoint.tif matches the pattern field1_field2_field3. If none of the patterns is suitable, please use other Galaxy tools to rename your files first.">
+
+                                    <sanitizer sanitize="false"/>
+                                    <option value="(?P&lt;field1>.*)">field1</option>
+                                    <option value="(?P&lt;field1>.*)-(?P&lt;field2>[a-zA-Z0-9]+)">field1-field2</option>
+                                    <option value="(?P&lt;field1>.*)_(?P&lt;field2>[a-zA-Z0-9]+)">field1_field2</option>
+                                    <option value="(?P&lt;field1>.*)__(?P&lt;field2>[a-zA-Z0-9]+)">field1__field2</option>
+                                    <option value="(?P&lt;field1>.*)-(?P&lt;field2>[a-zA-Z0-9]+)-(?P&lt;field3>[a-zA-Z0-9]+)">field1-field2-field3</option>
+                                    <option value="(?P&lt;field1>.*)_(?P&lt;field2>[a-zA-Z0-9]+)_(?P&lt;field3>[a-zA-Z0-9]+)">field1_field2_field3</option>
+                                    <option value="(?P&lt;field1>.*)__(?P&lt;field2>[a-zA-Z0-9]+)__(?P&lt;field3>[a-zA-Z0-9]+)">field1__field2__field3</option>
+                                    <option value="(?P&lt;field1>.*)-(?P&lt;field2>[a-zA-Z0-9]+)-(?P&lt;field3>[a-zA-Z0-9]+)-(?P&lt;field4>[a-zA-Z0-9]+)">field1-field2-field3-field4</option>
+                                    <option value="(?P&lt;field1>.*)_(?P&lt;field2>[a-zA-Z0-9]+)_(?P&lt;field3>[a-zA-Z0-9]+)_(?P&lt;field4>[a-zA-Z0-9]+)">field1_field2_field3_field4</option>
+                                    <option value="(?P&lt;field1>.*)__(?P&lt;field2>[a-zA-Z0-9]+)__(?P&lt;field3>[a-zA-Z0-9]+)__(?P&lt;field4>[a-zA-Z0-9]+)">field1__field2__field3__field4</option>
+                                    <option value="(?P&lt;field1>.*)-(?P&lt;field2>[a-zA-Z0-9]+)-(?P&lt;field3>[a-zA-Z0-9]+)-(?P&lt;field4>[a-zA-Z0-9]+)-(?P&lt;field5>[a-zA-Z0-9]+)">field1-field2-field3-field4-field5</option>
+                                    <option value="(?P&lt;field1>.*)_(?P&lt;field2>[a-zA-Z0-9]+)_(?P&lt;field3>[a-zA-Z0-9]+)_(?P&lt;field4>[a-zA-Z0-9]+)_(?P&lt;field5>[a-zA-Z0-9]+)">field1_field2_field3_field4_field5</option>
+                                    <option value="(?P&lt;field1>.*)__(?P&lt;field2>[a-zA-Z0-9]+)__(?P&lt;field3>[a-zA-Z0-9]+)__(?P&lt;field4>[a-zA-Z0-9]+)__(?P&lt;field5>[a-zA-Z0-9]+)">field1__field2__field3__field4__field5</option>
+                                    <option value="(?P&lt;field1>.*)-(?P&lt;field2>[a-zA-Z0-9]+)-(?P&lt;field3>[a-zA-Z0-9]+)-(?P&lt;field4>[a-zA-Z0-9]+)-(?P&lt;field5>[a-zA-Z0-9]+)-(?P&lt;field6>[a-zA-Z0-9]+)">field1-field2-field3-field4-field5-field6</option>
+                                    <option value="(?P&lt;field1>.*)_(?P&lt;field2>[a-zA-Z0-9]+)_(?P&lt;field3>[a-zA-Z0-9]+)_(?P&lt;field4>[a-zA-Z0-9]+)_(?P&lt;field5>[a-zA-Z0-9]+)_(?P&lt;field6>[a-zA-Z0-9]+)">field1_field2_field3_field4_field5_field6</option>
+                                    <option value="(?P&lt;field1>.*)__(?P&lt;field2>[a-zA-Z0-9]+)__(?P&lt;field3>[a-zA-Z0-9]+)__(?P&lt;field4>[a-zA-Z0-9]+)__(?P&lt;field5>[a-zA-Z0-9]+)__(?P&lt;field6>[a-zA-Z0-9]+)">field1__field2__field3__field4__field5__field6</option>
+                                </param>
+                            </when>
+                            <when value="Folder name">
+                                <param name="folder_name_regex" type="select" label="Select the pattern to extract metadata from the folder name" help="Folder names must comply with one of the patterns. For example, folder name exp1-channel_name matches the pattern field1-field2. If none of the patterns is suitable, please use other Galaxy tools to rename your folder first.">
+                                    <sanitizer sanitize="false"/>
+                                    <option value="(?P&lt;folderField1>.*)">field1</option>
+                                    <option value="(?P&lt;folderField1>.*)-(?P&lt;folderField2>[a-zA-Z0-9]+)">field1-field2</option>
+                                    <option value="(?P&lt;folderField1>.*)_(?P&lt;folderField2>[a-zA-Z0-9]+)">field1_field2</option>
+                                </param>
+                            </when>
+                        </conditional>
+                        <conditional name="con_metadata_extract_from">
+                            <param name="extract_metadata_from" type="select" label="Extract metadata from">
+                                <option value="All images">All images</option>
+                                <option value="Images matching a rule">Images matching a rule</option>
+                            </param>
+                            <when value="Images matching a rule">
+                                <expand macro="image_matching_rules_metadata" />
+                            </when>
+                            <when value="All images" />
+                        </conditional>
+                    </repeat>
+                </when>
+                <when value="No" />
+            </conditional>
+        </section>
+    </xml>
+</macros>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/starting_modules_nameandtypes.xml	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,182 @@
+<macros>
+    <xml name="macro_image_type" token_thing="images">
+        <param name="name_to_assign" type="text" value="DNA" label="Name to assign these @THING@" />
+    </xml>
+    
+    <xml name="image_type_condition"> 
+        <conditional name="con_set_intensity">
+            <param name="set_intensity_range_from" type="select" label="Set intensity range from" help="This option determines how the image intensity should be rescaled from 0.0 - 1.0.">
+                <option value="Image metadata">Image metadata</option>
+                <option value="Image bit-depth">Image bit-depth</option>
+                <option value="Manual">Manual</option>
+            </param>
+            <when value="Manual">
+                <param name="maximum_intensity" type="float" value="255.0" label="Maximum intensity" help="The pixel value is divided, as read from the image file, by this value to get the loaded image’s per-pixel intensity." />
+
+            </when>
+            <when value="Image metadata" />
+            <when value="Image bit-depth" />
+        </conditional>
+    </xml>
+    <xml name="name_type_rule_matching_file">
+        <param name="operator" type="select">
+            <option value="does">Does</option>
+            <option value="doesnot">Does not</option>
+        </param>
+        <param name="contain" type="select">
+            <option value="contain">Contain</option>
+            <option value="Contain regular expression">Contain regular expression</option>
+            <option value="startwith">Start with</option>
+            <option value="endwith">End with</option>
+            <option value="Exactly match">Exactly match</option>
+        </param>
+        <param name="match_value" type="text"/>
+    </xml>
+    <xml name="name_type_rule_image">
+        <param name="operator" type="select">
+            <option value="does">Is</option>
+            <option value="doesnot">Is not</option>
+        </param>
+        <param name="match_type" type="select">
+            <option value="iscolor">Color</option>
+            <option value="ismonochrome">Monochrome</option>
+            <option value="isstack">Stack</option>
+            <option value="isstackframe">Stack frame</option>
+        </param>
+    </xml>
+    <xml name="name_type_rule_metadata">
+        <param name="operator" type="select">
+            <option value="does">Does</option>
+            <option value="doesnot">Does not</option>
+        </param>
+        <param name="match_type" type="select">
+            <option value="FileLocation">Have FileLocation matching</option>
+            <option value="Frame">Have Frame matching</option>
+            <option value="Screen">Have Screen matching</option>
+            <option value="Series">Have Series matching</option>
+        </param>
+        <param name="match_value" type="text"/>
+    </xml>
+    <xml name="name_type_rule_ext">
+        <param name="operator" type="select">
+            <option value="does">Is</option>
+            <option value="doesnot">Is not</option>
+        </param>
+        <param name="match_type" type="select">
+            <option value="istif">tif, tiff, ome.tif or ome.tiff</option>
+            <option value="isjpeg">jpg, jpeg</option>
+            <option value="ispng">png</option>
+            <option value="isimage">the extension of an image file</option>
+            <option value="isflex">flex</option>
+            <option value="ismovie">mov, avi</option>
+
+        </param>
+    </xml>
+    <xml name="image_matching_rules">
+        <repeat name="r_match_rule" title="Another image">
+            <param name="match_all_any" type="select" display="radio" label="Match the following rules">
+                <option value="and">All</option>
+                <option value="or">Any</option>
+            </param>
+            <repeat name="r_match" title="rule">
+                <conditional name="con_match">
+                    <param name="rule_type" type="select" label="Select rule criteria">
+                        <option value="file">File</option>
+                        <option value="directory">Directory</option>
+                        <option value="extension">Extension</option>
+                        <option value="image">Image</option>
+                        <option value="metadata">Metadata</option>
+                    </param>
+                    <when value="file">
+                        <expand macro="name_type_rule_matching_file"/>
+                    </when>
+                    <when value="directory">
+                        <expand macro="name_type_rule_matching_file"/>
+                    </when>
+                    <when value="extension">
+                        <expand macro="name_type_rule_ext" />
+                    </when>
+                    <when value="image">
+                        <expand macro="name_type_rule_image" />
+                    </when>
+                    <when value="metadata">
+                        <expand macro="name_type_rule_metadata" />
+                    </when>
+                </conditional>
+            </repeat>
+            <conditional name="con_select_image_type">
+                <param name="select_image_type" type="select" label="Select the image type" help="You can specify how these images should be treated">
+                    <option value="Grayscale image">Grayscale image</option>
+                    <option value="Color image">Color image</option>
+                    <option value="Binary mask">Binary mask</option>
+                    <option value="Illumination function">Illumination function</option>
+                    <option value="Objects">Objects</option>
+
+                </param>
+                <when value ="Grayscale image">
+                    <expand macro="macro_image_type" thing="images"/>
+                    <expand macro="image_type_condition" />
+                </when>
+                <when value="Color image">
+                    <expand macro="macro_image_type" thing="images"/>
+                    <expand macro="image_type_condition" />
+                </when>
+                <when value="Binary mask">
+                    <expand macro="macro_image_type" thing="images"/>
+                </when>
+                <when value="Illumination function">
+                    <expand macro="macro_image_type" thing="images"/>
+                </when>
+                <when value="Objects">
+                    <expand macro="macro_image_type" thing="objects"/>
+                </when>
+            </conditional>
+        </repeat>
+    </xml>
+    <xml name="starting_modules_nameandtypes">
+        <section name="nameandtypes" title="NamesAndTypes" expanded="false">
+            <conditional name="pixel_space">
+                <param name="process_3d" type="select" label="Process 3D" help="If you want to treat the data as three-dimensional, select 'Yes' to load files as volumes. Otherwise, select 'No' to load files as separate, two-dimensional images.">
+                    <option value="Yes">Yes, process 3D data</option>
+                    <option value="No">No, do not process 3D data</option>
+                </param>  
+                <when value="Yes">
+                    <param name="x_spacing" type="float" value="1.0" label="Enter the spacing between voxels in the X dimension, relative to Y and Z" help="Normally, you will set one of these values to 1 and the others relative to that." />
+                    <param name="y_spacing" type="float" value="1.0" label="Enter the spacing between voxels in the Y dimension, relative to X and Z"/>
+                    <param name="z_spacing" type="float" value="1.0" label="Enter the spacing between voxels in the Z dimension, relative to X and Y"/>
+                </when>
+                <when value="No"/>
+            </conditional>
+            <conditional name="con_assign_a_name_to">
+                <param name="assign_a_name_to" type="select" label="Assign a name to" help="This setting allows you to specify a name for types of images or subsets of images so they can be treated separately by downstream tools.">
+                    <option value="All images">Give every image the same name</option>
+                    <option value="Images matching rules">Give images one of several names depending on the metadata</option>
+                </param>
+                <when value="All images">
+                    <expand macro="macro_image_type" thing="images" />
+                    <conditional name="con_select_image_type">
+                        <param name="select_image_type" type="select" label="Select the image type">
+                            <option value="Grayscale image">Grayscale image</option>
+                            <option value="Color image">Color image</option>
+                            <option value="Binary mask">Binary mask</option>
+                        </param>
+                        <when value ="Grayscale image">
+                            <expand macro="image_type_condition" />
+                        </when>
+                        <when value="Color image">
+                            <expand macro="image_type_condition" />
+                        </when>
+                        <when value="Binary mask" />
+                    </conditional>
+                </when>
+            <when value="Images matching rules">
+                <expand macro="image_matching_rules"/>
+                <param name="matching_method" type="select" label="Image set matching method">
+                    <option value="Order">Order</option>
+                    <option value="Metadata">Metadata</option>
+                </param>
+            </when>
+        </conditional>
+    </section>
+</xml>
+</macros>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/common-complicated.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,73 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:4
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:2
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:Images matching a rule
+    Select the filtering criteria:and (file does contain "im") (extension does istif)
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:Folder name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)_(?P<folderField2>[a-zA-Z0-9]+)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:3
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does contain "im") (image doesnot ismonochrome)
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Objects
+    Set intensity range from:Image metadata
+    Maximum intensity:255.0
+    Select the rule criteria:and (file does contain "")
+    Name to assign these images:GFP
+    Name to assign these objects:Cell
+    Select the image type:Illumination function
+    Set intensity range from:Image metadata
+    Maximum intensity:255.0
+    Select the rule criteria:or (extension does istif)
+    Name to assign these images:Actin
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/common-nogroup.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,73 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:4
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:2
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:Images matching a rule
+    Select the filtering criteria:and (file does contain "im") (extension does istif)
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:Folder name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)_(?P<folderField2>[a-zA-Z0-9]+)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:3
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does contain "im") (image doesnot ismonochrome)
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Objects
+    Set intensity range from:Image metadata
+    Maximum intensity:255.0
+    Select the rule criteria:and (file does contain "")
+    Name to assign these images:GFP
+    Name to assign these objects:Cell
+    Select the image type:Illumination function
+    Set intensity range from:Image metadata
+    Maximum intensity:255.0
+    Select the rule criteria:or (extension does istif)
+    Name to assign these images:Actin
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:No
+    grouping metadata count:1
+    Metadata category:None
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/common.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,53 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:4
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
--- a/test-data/common.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:4
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/convert_objects_to_image.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,59 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+ConvertObjectsToImage:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:1|show_window:True|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the input objects:Nuclei
+    Name the output image:MaskNuclei
+    Select the color format:Binary (black & white)
+    Select the colormap:Default
--- a/test-data/convert_objects_to_image.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-ConvertObjectsToImage:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:1|show_window:True|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Select the input objects:Nuclei
-    Name the output image:MaskNuclei
-    Select the color format:Binary (black & white)
-    Select the colormap:Default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/display_data_on_image.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,70 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+DisplayDataOnImage:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:6|show_window:False|notes:\x5B\'Add nuclei id as label\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Display object or image measurements?:Object
+    Select the input objects:Nuclei
+    Measurement to display:Number_Object_Number
+    Select the image on which to display the measurements:DNA
+    Text color:#ff0000
+    Name the output image that has the measurements displayed:ImageDisplay
+    Font size (points):11
+    Number of decimals:0
+    Image elements to save:Image
+    Annotation offset (in pixels):0
+    Display mode:Text
+    Color map:Default
+    Display background image?:Yes
+    Color map scale:Use this image's measurement range
+    Color map range:0.0,1.0
--- a/test-data/display_data_on_image.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-DisplayDataOnImage:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:6|show_window:False|notes:\x5B\'Add nuclei id as label\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Display object or image measurements?:Object
-    Select the input objects:Nuclei
-    Measurement to display:Number_Object_Number
-    Select the image on which to display the measurements:DNA
-    Text color:#ff0000
-    Name the output image that has the measurements displayed:ImageDisplay
-    Font size (points):11
-    Number of decimals:0
-    Image elements to save:Image
-    Annotation offset (in pixels):0
-    Display mode:Text
-    Color map:Default
-    Display background image?:Yes
-    Color map scale:Use this image's measurement range
-    Color map range:0.0,1.0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/enhance_or_suppress_features.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,66 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+EnhanceOrSuppressFeatures:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:6|show_window:False|notes:\x5B\'Identify nucleoli\', \'PARAMS\x3A Range of hole sizes'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the input image:DNA
+    Name the output image:DNAdarkholes
+    Select the operation:Enhance
+    Feature size:10
+    Feature type:Dark holes
+    Range of hole sizes:1,15
+    Smoothing scale:2.0
+    Shear angle:0.0
+    Decay:0.95
+    Enhancement method:Tubeness
+    Speed and accuracy:Fast
--- a/test-data/enhance_or_suppress_features.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-EnhanceOrSuppressFeatures:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:6|show_window:False|notes:\x5B\'Identify nucleoli\', \'PARAMS\x3A Range of hole sizes'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Select the input image:DNA
-    Name the output image:DNAdarkholes
-    Select the operation:Enhance
-    Feature size:10
-    Feature type:Dark holes
-    Range of hole sizes:1,15
-    Smoothing scale:2.0
-    Shear angle:0.0
-    Decay:0.95
-    Enhancement method:Tubeness
-    Speed and accuracy:Fast
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/export_to_spreadsheet.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,76 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+ExportToSpreadsheet:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:12|show_window:True|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the column delimiter:Tab
+    Add image metadata columns to your object data file?:Yes
+    Select the measurements to export:No
+    Calculate the per-image mean values for object measurements?:Yes
+    Calculate the per-image median values for object measurements?:Yes
+    Calculate the per-image standard deviation values for object measurements?:Yes
+    Output file location:Default Output Folder\x7C
+    Create a GenePattern GCT file?:No
+    Select source of sample row name:Metadata
+    Select the image to use as the identifier:None
+    Select the metadata to use as the identifier:None
+    Export all measurement types?:Yes
+    Press button to select measurements:
+    Representation of Nan/Inf:NaN
+    Add a prefix to file names?:No
+    Filename prefix:MyPrefix_
+    Overwrite existing files without warning?:Yes
+    Data to export:Do not use
+    Combine these object measurements with those of the previous object?:No
+    File name:DATA.csv
+    Use the object name for the file name?:Yes
--- a/test-data/export_to_spreadsheet.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-ExportToSpreadsheet:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:12|show_window:True|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Select the column delimiter:Tab
-    Add image metadata columns to your object data file?:Yes
-    Select the measurements to export:No
-    Calculate the per-image mean values for object measurements?:Yes
-    Calculate the per-image median values for object measurements?:Yes
-    Calculate the per-image standard deviation values for object measurements?:Yes
-    Output file location:Default Output Folder\x7C
-    Create a GenePattern GCT file?:No
-    Select source of sample row name:Metadata
-    Select the image to use as the identifier:None
-    Select the metadata to use as the identifier:None
-    Export all measurement types?:Yes
-    Press button to select measurements:
-    Representation of Nan/Inf:NaN
-    Add a prefix to file names?:No
-    Filename prefix:MyPrefix_
-    Overwrite existing files without warning?:Yes
-    Data to export:Do not use
-    Combine these object measurements with those of the previous object?:No
-    File name:DATA.csv
-    Use the object name for the file name?:Yes
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/export_to_spreadsheet_create_gene_image_filename.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,76 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+ExportToSpreadsheet:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:12|show_window:True|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the column delimiter:Tab
+    Add image metadata columns to your object data file?:Yes
+    Select the measurements to export:No
+    Calculate the per-image mean values for object measurements?:Yes
+    Calculate the per-image median values for object measurements?:Yes
+    Calculate the per-image standard deviation values for object measurements?:Yes
+    Output file location:Default Output Folder\x7C
+    Create a GenePattern GCT file?:Yes
+    Select source of sample row name:Image filename
+    Select the image to use as the identifier:DNA
+    Select the metadata to use as the identifier:None
+    Export all measurement types?:No
+    Press button to select measurements:
+    Representation of Nan/Inf:NaN
+    Add a prefix to file names?:Yes
+    Filename prefix:MyExpt_
+    Overwrite existing files without warning?:Yes
+    Data to export:Image
+    Combine these object measurements with those of the previous object?:No
+    File name:data.csv
+    Use the object name for the file name?:No
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/export_to_spreadsheet_create_gene_metadata.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,76 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+ExportToSpreadsheet:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:12|show_window:True|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the column delimiter:Tab
+    Add image metadata columns to your object data file?:Yes
+    Select the measurements to export:No
+    Calculate the per-image mean values for object measurements?:Yes
+    Calculate the per-image median values for object measurements?:Yes
+    Calculate the per-image standard deviation values for object measurements?:Yes
+    Output file location:Default Output Folder\x7C
+    Create a GenePattern GCT file?:Yes
+    Select source of sample row name:Metadata
+    Select the image to use as the identifier:None
+    Select the metadata to use as the identifier:FileName_DNA
+    Export all measurement types?:Yes
+    Press button to select measurements:
+    Representation of Nan/Inf:NaN
+    Add a prefix to file names?:No
+    Filename prefix:MyPrefix_
+    Overwrite existing files without warning?:Yes
+    Data to export:Do not use
+    Combine these object measurements with those of the previous object?:No
+    File name:DATA.csv
+    Use the object name for the file name?:Yes
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/export_to_spreadsheet_multi.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,80 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+ExportToSpreadsheet:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:12|show_window:True|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the column delimiter:Tab
+    Add image metadata columns to your object data file?:Yes
+    Select the measurements to export:No
+    Calculate the per-image mean values for object measurements?:Yes
+    Calculate the per-image median values for object measurements?:Yes
+    Calculate the per-image standard deviation values for object measurements?:Yes
+    Output file location:Default Output Folder\x7C
+    Create a GenePattern GCT file?:Yes
+    Select source of sample row name:Image filename
+    Select the image to use as the identifier:DNA
+    Select the metadata to use as the identifier:None
+    Export all measurement types?:No
+    Press button to select measurements:
+    Representation of Nan/Inf:NaN
+    Add a prefix to file names?:Yes
+    Filename prefix:MyExpt_
+    Overwrite existing files without warning?:Yes
+    Data to export:Image
+    Combine these object measurements with those of the previous object?:No
+    File name:data.csv
+    Use the object name for the file name?:No
+    Data to export:Experiment
+    Combine these object measurements with those of the previous object?:No
+    File name:DATA.csv
+    Use the object name for the file name?:Yes
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gray_to_color.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,75 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+GrayToColor:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:3|show_window:False|notes:\x5B\'Combine masks nuclei + nucleoli with colors\'\x5D|batch_state:array(\x5B], dtype=uint8)|enabled:True|wants_pause:False]
+    Select a color scheme:RGB
+    Select the image to be colored red:MaskNucleoli
+    Select the image to be colored green:Leave this black
+    Select the image to be colored blue:MaskNuclei
+    Name the output image:CombinedMask
+    Relative weight for the red image:0.8
+    Relative weight for the green image:1.0
+    Relative weight for the blue image:0.5
+    Select the image to be colored cyan:Leave this black
+    Select the image to be colored magenta:Leave this black
+    Select the image to be colored yellow:Leave this black
+    Select the image that determines brightness:Leave this black
+    Relative weight for the cyan image:1.0
+    Relative weight for the magenta image:1.0
+    Relative weight for the yellow image:1.0
+    Relative weight for the brightness image:1.0
+    Hidden:1
+    Image name:None
+    Color:#FF0000
+    Weight:1.0
--- a/test-data/gray_to_color.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-GrayToColor:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:3|show_window:False|notes:\x5B\'Combine masks nuclei + nucleoli with colors\'\x5D|batch_state:array(\x5B], dtype=uint8)|enabled:True|wants_pause:False]
-    Select a color scheme:RGB
-    Select the image to be colored red:MaskNucleoli
-    Select the image to be colored green:Leave this black
-    Select the image to be colored blue:MaskNuclei
-    Name the output image:CombinedMask
-    Relative weight for the red image:0.8
-    Relative weight for the green image:1.0
-    Relative weight for the blue image:0.5
-    Select the image to be colored cyan:Leave this black
-    Select the image to be colored magenta:Leave this black
-    Select the image to be colored yellow:Leave this black
-    Select the image that determines brightness:Leave this black
-    Relative weight for the cyan image:1.0
-    Relative weight for the magenta image:1.0
-    Relative weight for the yellow image:1.0
-    Relative weight for the brightness image:1.0
-    Hidden:1
-    Image name:None
-    Color:#FF0000
-    Weight:1.0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/identify_primary_objects.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,88 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+IdentifyPrimaryObjects:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:13|show_window:True|notes:\x5B\'Identify the nuclei from the DNA channel.\', \'PARAMS\x3A\', \'- Typical diameter of objects (Min,Max)\', \'- Method to distinguish clumped objects\x3A Shape/None. With Shape, the distance between the 2 centers can be changed.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the input image:DNA
+    Name the primary objects to be identified:Nuclei
+    Typical diameter of objects, in pixel units (Min,Max):15,200
+    Discard objects outside the diameter range?:Yes
+    Discard objects touching the border of the image?:Yes
+    Method to distinguish clumped objects:Shape
+    Method to draw dividing lines between clumped objects:Shape
+    Size of smoothing filter:0
+    Suppress local maxima that are closer than this minimum allowed distance:7
+    Speed up by using lower-resolution image to find local maxima?:Yes
+    Fill holes in identified objects?:After both thresholding and declumping
+    Automatically calculate size of smoothing filter for declumping?:Yes
+    Automatically calculate minimum allowed distance between local maxima?:Yes
+    Handling of objects if excessive number of objects identified:Continue
+    Maximum number of objects:500
+    Use advanced settings?:Yes
+    Threshold settings version:10
+    Threshold strategy:Global
+    Thresholding method:Otsu
+    Threshold smoothing scale:1.3488
+    Threshold correction factor:0.9
+    Lower and upper bounds on threshold:0.0,1.0
+    Manual threshold:0
+    Select the measurement to threshold with:None
+    Two-class or three-class thresholding?:Two classes
+    Assign pixels in the middle intensity class to the foreground or the background?:Foreground
+    Size of adaptive window:500
+    Lower outlier fraction:0.05
+    Upper outlier fraction:0.05
+    Averaging method:Mean
+    Variance method:Standard deviation
+    # of deviations:2.0
+    Thresholding method:Otsu
--- a/test-data/identify_primary_objects.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-IdentifyPrimaryObjects:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:13|show_window:True|notes:\x5B\'Identify the nuclei from the DNA channel.\', \'PARAMS\x3A\', \'- Typical diameter of objects (Min,Max)\', \'- Method to distinguish clumped objects\x3A Shape/None. With Shape, the distance between the 2 centers can be changed.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Select the input image:DNA
-    Name the primary objects to be identified:Nuclei
-    Typical diameter of objects, in pixel units (Min,Max):15,200
-    Discard objects outside the diameter range?:Yes
-    Discard objects touching the border of the image?:Yes
-    Method to distinguish clumped objects:Shape
-    Method to draw dividing lines between clumped objects:Shape
-    Size of smoothing filter:0
-    Suppress local maxima that are closer than this minimum allowed distance:7
-    Speed up by using lower-resolution image to find local maxima?:Yes
-    Fill holes in identified objects?:After both thresholding and declumping
-    Automatically calculate size of smoothing filter for declumping?:Yes
-    Automatically calculate minimum allowed distance between local maxima?:Yes
-    Handling of objects if excessive number of objects identified:Continue
-    Maximum number of objects:500
-    Use advanced settings?:Yes
-    Threshold settings version:10
-    Threshold strategy:Global
-    Thresholding method:Otsu
-    Threshold smoothing scale:1.3488
-    Threshold correction factor:0.9
-    Lower and upper bounds on threshold:0.0,1.0
-    Manual threshold:0
-    Select the measurement to threshold with:None
-    Two-class or three-class thresholding?:Two classes
-    Assign pixels in the middle intensity class to the foreground or the background?:Foreground
-    Size of adaptive window:500
-    Lower outlier fraction:0.05
-    Upper outlier fraction:0.05
-    Averaging method:Mean
-    Variance method:Standard deviation
-    # of deviations:2.0
-    Thresholding method:Otsu
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/identify_primary_objects_adv_adaptive_otsu.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,88 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+IdentifyPrimaryObjects:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:13|show_window:True|notes:\x5B\'Identify the nuclei from the DNA channel.\', \'PARAMS\x3A\', \'- Typical diameter of objects (Min,Max)\', \'- Method to distinguish clumped objects\x3A Shape/None. With Shape, the distance between the 2 centers can be changed.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the input image:DNA
+    Name the primary objects to be identified:Nuclei
+    Typical diameter of objects, in pixel units (Min,Max):15,200
+    Discard objects outside the diameter range?:Yes
+    Discard objects touching the border of the image?:Yes
+    Method to distinguish clumped objects:Shape
+    Method to draw dividing lines between clumped objects:Shape
+    Size of smoothing filter:1
+    Suppress local maxima that are closer than this minimum allowed distance:1
+    Speed up by using lower-resolution image to find local maxima?:Yes
+    Fill holes in identified objects?:After both thresholding and declumping
+    Automatically calculate size of smoothing filter for declumping?:No
+    Automatically calculate minimum allowed distance between local maxima?:No
+    Handling of objects if excessive number of objects identified:Continue
+    Maximum number of objects:500
+    Use advanced settings?:Yes
+    Threshold settings version:10
+    Threshold strategy:Adaptive
+    Thresholding method:Otsu
+    Threshold smoothing scale:1.5000
+    Threshold correction factor:1.0
+    Lower and upper bounds on threshold:0.0,1.0
+    Manual threshold:0
+    Select the measurement to threshold with:None
+    Two-class or three-class thresholding?:Three classes
+    Assign pixels in the middle intensity class to the foreground or the background?:Foreground
+    Size of adaptive window:50
+    Lower outlier fraction:0.05
+    Upper outlier fraction:0.05
+    Averaging method:Mean
+    Variance method:Standard deviation
+    # of deviations:2.00
+    Thresholding method:Otsu
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/identify_primary_objects_adv_global_manual.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,88 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+IdentifyPrimaryObjects:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:13|show_window:True|notes:\x5B\'Identify the nuclei from the DNA channel.\', \'PARAMS\x3A\', \'- Typical diameter of objects (Min,Max)\', \'- Method to distinguish clumped objects\x3A Shape/None. With Shape, the distance between the 2 centers can be changed.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the input image:DNA
+    Name the primary objects to be identified:Nuclei
+    Typical diameter of objects, in pixel units (Min,Max):5,20
+    Discard objects outside the diameter range?:No
+    Discard objects touching the border of the image?:Yes
+    Method to distinguish clumped objects:Shape
+    Method to draw dividing lines between clumped objects:Shape
+    Size of smoothing filter:1
+    Suppress local maxima that are closer than this minimum allowed distance:1
+    Speed up by using lower-resolution image to find local maxima?:Yes
+    Fill holes in identified objects?:After both thresholding and declumping
+    Automatically calculate size of smoothing filter for declumping?:No
+    Automatically calculate minimum allowed distance between local maxima?:No
+    Handling of objects if excessive number of objects identified:Erase
+    Maximum number of objects:499
+    Use advanced settings?:Yes
+    Threshold settings version:10
+    Threshold strategy:Global
+    Thresholding method:Manual
+    Threshold smoothing scale:1.3488
+    Threshold correction factor:1.0
+    Lower and upper bounds on threshold:0.0,1.0
+    Manual threshold:1
+    Select the measurement to threshold with:None
+    Two-class or three-class thresholding?:Two classes
+    Assign pixels in the middle intensity class to the foreground or the background?:Foreground
+    Size of adaptive window:50
+    Lower outlier fraction:0.05
+    Upper outlier fraction:0.05
+    Averaging method:Mean
+    Variance method:Standard deviation
+    # of deviations:2.00
+    Thresholding method:Manual
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/identify_primary_objects_adv_global_mce.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,88 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+IdentifyPrimaryObjects:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:13|show_window:True|notes:\x5B\'Identify the nuclei from the DNA channel.\', \'PARAMS\x3A\', \'- Typical diameter of objects (Min,Max)\', \'- Method to distinguish clumped objects\x3A Shape/None. With Shape, the distance between the 2 centers can be changed.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the input image:DNA
+    Name the primary objects to be identified:Nuclei
+    Typical diameter of objects, in pixel units (Min,Max):15,40
+    Discard objects outside the diameter range?:Yes
+    Discard objects touching the border of the image?:Yes
+    Method to distinguish clumped objects:Shape
+    Method to draw dividing lines between clumped objects:Shape
+    Size of smoothing filter:1
+    Suppress local maxima that are closer than this minimum allowed distance:7
+    Speed up by using lower-resolution image to find local maxima?:Yes
+    Fill holes in identified objects?:After both thresholding and declumping
+    Automatically calculate size of smoothing filter for declumping?:No
+    Automatically calculate minimum allowed distance between local maxima?:No
+    Handling of objects if excessive number of objects identified:Continue
+    Maximum number of objects:500
+    Use advanced settings?:Yes
+    Threshold settings version:10
+    Threshold strategy:Global
+    Thresholding method:Minimum cross entropy
+    Threshold smoothing scale:1.5000
+    Threshold correction factor:1.0
+    Lower and upper bounds on threshold:0.0,1.0
+    Manual threshold:0
+    Select the measurement to threshold with:None
+    Two-class or three-class thresholding?:Two classes
+    Assign pixels in the middle intensity class to the foreground or the background?:Foreground
+    Size of adaptive window:50
+    Lower outlier fraction:0.05
+    Upper outlier fraction:0.05
+    Averaging method:Mean
+    Variance method:Standard deviation
+    # of deviations:2.00
+    Thresholding method:Minimum cross entropy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/identify_primary_objects_adv_global_measurement.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,88 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+IdentifyPrimaryObjects:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:13|show_window:True|notes:\x5B\'Identify the nuclei from the DNA channel.\', \'PARAMS\x3A\', \'- Typical diameter of objects (Min,Max)\', \'- Method to distinguish clumped objects\x3A Shape/None. With Shape, the distance between the 2 centers can be changed.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the input image:DNA
+    Name the primary objects to be identified:Nuclei
+    Typical diameter of objects, in pixel units (Min,Max):5,20
+    Discard objects outside the diameter range?:Yes
+    Discard objects touching the border of the image?:No
+    Method to distinguish clumped objects:Intensity
+    Method to draw dividing lines between clumped objects:Shape
+    Size of smoothing filter:0
+    Suppress local maxima that are closer than this minimum allowed distance:6
+    Speed up by using lower-resolution image to find local maxima?:Yes
+    Fill holes in identified objects?:After both thresholding and declumping
+    Automatically calculate size of smoothing filter for declumping?:Yes
+    Automatically calculate minimum allowed distance between local maxima?:No
+    Handling of objects if excessive number of objects identified:Continue
+    Maximum number of objects:500
+    Use advanced settings?:Yes
+    Threshold settings version:10
+    Threshold strategy:Global
+    Thresholding method:Measurement
+    Threshold smoothing scale:1.3488
+    Threshold correction factor:1.0
+    Lower and upper bounds on threshold:0.1,0.4
+    Manual threshold:0
+    Select the measurement to threshold with:FileName_DNA
+    Two-class or three-class thresholding?:Two classes
+    Assign pixels in the middle intensity class to the foreground or the background?:Foreground
+    Size of adaptive window:50
+    Lower outlier fraction:0.05
+    Upper outlier fraction:0.05
+    Averaging method:Mean
+    Variance method:Standard deviation
+    # of deviations:2.00
+    Thresholding method:Measurement
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/identify_primary_objects_adv_global_rb.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,88 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+IdentifyPrimaryObjects:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:13|show_window:True|notes:\x5B\'Identify the nuclei from the DNA channel.\', \'PARAMS\x3A\', \'- Typical diameter of objects (Min,Max)\', \'- Method to distinguish clumped objects\x3A Shape/None. With Shape, the distance between the 2 centers can be changed.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the input image:DNA
+    Name the primary objects to be identified:Nuclei
+    Typical diameter of objects, in pixel units (Min,Max):10,40
+    Discard objects outside the diameter range?:Yes
+    Discard objects touching the border of the image?:Yes
+    Method to distinguish clumped objects:Shape
+    Method to draw dividing lines between clumped objects:Shape
+    Size of smoothing filter:1
+    Suppress local maxima that are closer than this minimum allowed distance:7
+    Speed up by using lower-resolution image to find local maxima?:Yes
+    Fill holes in identified objects?:After both thresholding and declumping
+    Automatically calculate size of smoothing filter for declumping?:No
+    Automatically calculate minimum allowed distance between local maxima?:No
+    Handling of objects if excessive number of objects identified:Continue
+    Maximum number of objects:500
+    Use advanced settings?:Yes
+    Threshold settings version:10
+    Threshold strategy:Global
+    Thresholding method:RobustBackground
+    Threshold smoothing scale:1.4000
+    Threshold correction factor:1.0
+    Lower and upper bounds on threshold:0.0,1.0
+    Manual threshold:0
+    Select the measurement to threshold with:None
+    Two-class or three-class thresholding?:Two classes
+    Assign pixels in the middle intensity class to the foreground or the background?:Foreground
+    Size of adaptive window:50
+    Lower outlier fraction:0.06
+    Upper outlier fraction:0.07
+    Averaging method:Median
+    Variance method:Median absolute deviation
+    # of deviations:3.00
+    Thresholding method:RobustBackground
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/identify_primary_objects_noadv.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,88 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+IdentifyPrimaryObjects:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:13|show_window:True|notes:\x5B\'Identify the nuclei from the DNA channel.\', \'PARAMS\x3A\', \'- Typical diameter of objects (Min,Max)\', \'- Method to distinguish clumped objects\x3A Shape/None. With Shape, the distance between the 2 centers can be changed.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the input image:DNA
+    Name the primary objects to be identified:Nuclei
+    Typical diameter of objects, in pixel units (Min,Max):15,200
+    Discard objects outside the diameter range?:Yes
+    Discard objects touching the border of the image?:Yes
+    Method to distinguish clumped objects:Intensity
+    Method to draw dividing lines between clumped objects:Intensity
+    Size of smoothing filter:1
+    Suppress local maxima that are closer than this minimum allowed distance:7
+    Speed up by using lower-resolution image to find local maxima?:Yes
+    Fill holes in identified objects?:After both thresholding and declumping
+    Automatically calculate size of smoothing filter for declumping?:Yes
+    Automatically calculate minimum allowed distance between local maxima?:Yes
+    Handling of objects if excessive number of objects identified:Continue
+    Maximum number of objects:500
+    Use advanced settings?:No
+    Threshold settings version:10
+    Threshold strategy:Global
+    Thresholding method:Minimum cross entropy
+    Threshold smoothing scale:1.3488
+    Threshold correction factor:1.0
+    Lower and upper bounds on threshold:0.0,1.0
+    Manual threshold:0
+    Select the measurement to threshold with:None
+    Two-class or three-class thresholding?:Two classes
+    Assign pixels in the middle intensity class to the foreground or the background?:Foreground
+    Size of adaptive window:50
+    Lower outlier fraction:0.05
+    Upper outlier fraction:0.05
+    Averaging method:Mean
+    Variance method:Standard deviation
+    # of deviations:2.00
+    Thresholding method:Minimum cross entropy
Binary file test-data/images.tar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/mask_image.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,61 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+MaskImage:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:3|show_window:False|notes:\x5B'Keep only nucleoli inside the nuclei\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the input image:DNAdarkholes
+    Name the output image:MaskDNAdarkholes
+    Use objects or an image as a mask?:Objects
+    Select object for mask:Nuclei
+    Select image for mask:None
+    Invert the mask?:No
--- a/test-data/mask_image.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-MaskImage:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:3|show_window:False|notes:\x5B'Keep only nucleoli inside the nuclei\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Select the input image:DNAdarkholes
-    Name the output image:MaskDNAdarkholes
-    Use objects or an image as a mask?:Objects
-    Select object for mask:Nuclei
-    Select image for mask:None
-    Invert the mask?:No
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/measure_granularity.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,62 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+MeasureGranularity:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:3|show_window:False|notes:\x5B\'PARAMS\x3A\', \'- Radius\', '- Range\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Image count:1
+    Object count:0
+    Select an image to measure:DNA
+    Subsampling factor for granularity measurements:0.25
+    Subsampling factor for background reduction:0.25
+    Radius of structuring element:10
+    Range of the granular spectrum:16
--- a/test-data/measure_granularity.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-MeasureGranularity:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:3|show_window:False|notes:\x5B\'PARAMS\x3A\', \'- Radius\', '- Range\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Image count:1
-    Object count:0
-    Select an image to measure:DNA
-    Subsampling factor for granularity measurements:0.25
-    Subsampling factor for background reduction:0.25
-    Radius of structuring element:10
-    Range of the granular spectrum:16
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/measure_image_area_occupied.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,62 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+MeasureImageAreaOccupied:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Hidden:2
+    Measure the area occupied in a binary image, or in objects?:Objects
+    Select objects to measure:Nuclei
+    Select a binary image to measure:None
+    Measure the area occupied in a binary image, or in objects?:Objects
+    Select objects to measure:Nucleoli
+    Select a binary image to measure:None
--- a/test-data/measure_image_area_occupied.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-MeasureImageAreaOccupied:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Hidden:2
-    Measure the area occupied in a binary image, or in objects?:Objects
-    Select objects to measure:Nuclei
-    Select a binary image to measure:None
-    Measure the area occupied in a binary image, or in objects?:Objects
-    Select objects to measure:Nucleoli
-    Select a binary image to measure:None
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/measure_image_intensity.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,61 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+MeasureImageIntensity:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the image to measure:DNA
+    Measure the intensity only from areas enclosed by objects?:No
+    Select the input objects:None
+    Select the image to measure:DNA
+    Measure the intensity only from areas enclosed by objects?:Yes
+    Select the input objects:Nuclei
--- a/test-data/measure_image_intensity.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-MeasureImageIntensity:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Select the image to measure:DNA
-    Measure the intensity only from areas enclosed by objects?:No
-    Select the input objects:None
-    Select the image to measure:DNA
-    Measure the intensity only from areas enclosed by objects?:Yes
-    Select the input objects:Nuclei
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/measure_image_quality.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,72 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+MeasureImageQuality:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:5|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Calculate metrics for which images?:All loaded images
+    Image count:1
+    Scale count:1
+    Threshold count:1
+    Select the images to measure:
+    Include the image rescaling value?:Yes
+    Calculate blur metrics?:Yes
+    Spatial scale for blur measurements:20
+    Calculate saturation metrics?:Yes
+    Calculate intensity metrics?:Yes
+    Calculate thresholds?:Yes
+    Use all thresholding methods?:No
+    Select a thresholding method:Otsu
+    Typical fraction of the image covered by objects:0.1
+    Two-class or three-class thresholding?:Two classes
+    Minimize the weighted variance or the entropy:Weighted variance
+    Assign pixels in the middle intensity class to the foreground or the background?:Foreground
--- a/test-data/measure_image_quality.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-MeasureImageQuality:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:5|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Calculate metrics for which images?:All loaded images
-    Image count:1
-    Scale count:1
-    Threshold count:1
-    Select the images to measure:
-    Include the image rescaling value?:Yes
-    Calculate blur metrics?:Yes
-    Spatial scale for blur measurements:20
-    Calculate saturation metrics?:Yes
-    Calculate intensity metrics?:Yes
-    Calculate thresholds?:Yes
-    Use all thresholding methods?:No
-    Select a thresholding method:Otsu
-    Typical fraction of the image covered by objects:0.1
-    Two-class or three-class thresholding?:Two classes
-    Minimize the weighted variance or the entropy:Weighted variance
-    Assign pixels in the middle intensity class to the foreground or the background?:Foreground
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/measure_object_intensity.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,58 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+MeasureObjectIntensity:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:3|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Hidden:1
+    Select an image to measure:DNA
+    Select objects to measure:Nuclei
--- a/test-data/measure_object_intensity.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-MeasureObjectIntensity:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:3|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Hidden:1
-    Select an image to measure:DNA
-    Select objects to measure:Nuclei
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/measure_object_size_shape.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,58 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+MeasureObjectSizeShape:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:1|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select objects to measure:Nuclei
+    Select objects to measure:Nucleoli
+    Calculate the Zernike features?:Yes
--- a/test-data/measure_object_size_shape.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-MeasureObjectSizeShape:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:1|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Select objects to measure:Nuclei
-    Select objects to measure:Nucleoli
-    Calculate the Zernike features?:Yes
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/measure_texture.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,62 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+MeasureTexture:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:5|show_window:False|notes:\x5B\'PARAMS\x3A\', \'- Texture scale']|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Hidden:1
+    Hidden:1
+    Hidden:1
+    Select an image to measure:DNA
+    Select objects to measure:Nuclei
+    Texture scale to measure:3
+    Measure images or objects?:Objects
--- a/test-data/measure_texture.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-MeasureTexture:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:5|show_window:False|notes:\x5B\'PARAMS\x3A\', \'- Texture scale']|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Hidden:1
-    Hidden:1
-    Hidden:1
-    Select an image to measure:DNA
-    Select objects to measure:Nuclei
-    Texture scale to measure:3
-    Measure images or objects?:Objects
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/relate_objects.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,62 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+RelateObjects:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:5|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Parent objects:Nuclei
+    Child objects:Nucleoli
+    Calculate child-parent distances?:Both
+    Calculate per-parent means for all child measurements?:Yes
+    Calculate distances to other parents?:No
+    Do you want to save the children with parents as a new object set?:Yes
+    Name the output object:RelateObjects
--- a/test-data/relate_objects.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-RelateObjects:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:5|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Parent objects:Nuclei
-    Child objects:Nucleoli
-    Calculate child-parent distances?:Both
-    Calculate per-parent means for all child measurements?:Yes
-    Calculate distances to other parents?:No
-    Do you want to save the children with parents as a new object set?:Yes
-    Name the output object:RelateObjects
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/save_images.cppipe	Mon May 11 07:48:09 2020 -0400
@@ -0,0 +1,71 @@
+CellProfiler Pipeline: http://www.cellprofiler.org
+Version:3
+DateRevision:319
+GitHash:
+ModuleCount:5
+HasImagePlaneDetails:False
+
+Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    :
+    Filter images?:Images only
+    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
+
+Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
+    Extract metadata?:Yes
+    Metadata data type:Text
+    Metadata types:{}
+    Extraction method count:1
+    Metadata extraction method:Extract from file/folder names
+    Metadata source:File name
+    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
+    Regular expression to extract from folder name:(?P<folderField1>.*)
+    Extract metadata from:All images
+    Select the filtering criteria:and (file does contain "")
+    Metadata file location:
+    Match file and image metadata:[]
+    Use case insensitive matching?:No
+
+NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Assign a name to:Images matching rules
+    Select the image type:Grayscale image
+    Name to assign these images:DNA
+    Match metadata:[]
+    Image set matching method:Order
+    Set intensity range from:Image metadata
+    Assignments count:1
+    Single images count:0
+    Maximum intensity:255.0
+    Process as 3D?:No
+    Relative pixel spacing in X:1.0
+    Relative pixel spacing in Y:1.0
+    Relative pixel spacing in Z:1.0
+    Select the rule criteria:and (file does startwith "im")
+    Name to assign these images:DNA
+    Name to assign these objects:Cell
+    Select the image type:Grayscale image
+    Set intensity range from:Image metadata
+    Select the image type:Grayscale image
+    Maximum intensity:255.0
+
+Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Do you want to group your images?:Yes
+    grouping metadata count:1
+    Metadata category:field1
+
+SaveImages:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:13|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
+    Select the type of image to save:Image
+    Select the image to save:ImageDisplay
+    Select method for constructing file names:From image filename
+    Select image name for file prefix:DNA
+    Enter single file name:OrigBlue
+    Number of digits:4
+    Append a suffix to the image file name?:Yes
+    Text to append to the image name:_nucleiNumbers
+    Saved file format:tiff
+    Output file location:Default Output Folder\x7Coutput
+    Image bit depth:8-bit integer
+    Overwrite existing files without warning?:Yes
+    When to save:Every cycle
+    Record the file and path information to the saved image?:No
+    Create subfolders in the output folder?:No
+    Base image folder:Elsewhere...
--- a/test-data/save_images.txt	Thu Apr 16 05:35:37 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-CellProfiler Pipeline: http://www.cellprofiler.org
-Version:3
-DateRevision:319
-GitHash:
-ModuleCount:5
-HasImagePlaneDetails:False
-
-Images:[module_num:1|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'To begin creating your project, use the Images module to compile a list of files and/or folders that you want to analyze. You can also specify a set of rules to include only the desired files in your selected folders.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    :
-    Filter images?:Images only
-    Select the rule criteria:and (extension does isimage) (directory doesnot startwith ".")
-
-Metadata:[module_num:2|svn_version:\'Unknown\'|variable_revision_number:4|show_window:False|notes:\x5B\'The Metadata module optionally allows you to extract information describing your images (i.e, metadata) which will be stored along with your measurements. This information can be contained in the file name and/or location, or in an external file.\']|batch_state:array([], dtype=uint8)|enabled:True|wants_pause:False]
-    Extract metadata?:Yes
-    Metadata data type:Text
-    Metadata types:{}
-    Extraction method count:1
-    Metadata extraction method:Extract from file/folder names
-    Metadata source:File name
-    Regular expression to extract from file name:(?P<field1>.*)_(?P<field2>[a-zA-Z0-9]+)_(?P<field3>[a-zA-Z0-9]+)_(?P<field4>[a-zA-Z0-9]+)
-    Regular expression to extract from folder name:(?P<field1>.*)
-    Extract metadata from:All images
-    Select the filtering criteria:and (file does contain "")
-    Metadata file location:
-    Match file and image metadata:[]
-    Use case insensitive matching?:No
-
-NamesAndTypes:[module_num:3|svn_version:\'Unknown\'|variable_revision_number:8|show_window:False|notes:\x5B\'The NamesAndTypes module allows you to assign a meaningful name to each image by which other modules will refer to it.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Assign a name to:Images matching rules
-    Select the image type:Grayscale image
-    Name to assign these images:DNA
-    Match metadata:[]
-    Image set matching method:Order
-    Set intensity range from:Image metadata
-    Assignments count:1
-    Single images count:0
-    Maximum intensity:255.0
-    Process as 3D?:No
-    Relative pixel spacing in X:1.0
-    Relative pixel spacing in Y:1.0
-    Relative pixel spacing in Z:1.0
-    Select the rule criteria:and (file does startwith "im")
-    Name to assign these images:DNA
-    Name to assign these objects:Cell
-    Select the image type:Grayscale image
-    Set intensity range from:Image metadata
-    Select the image type:Grayscale image
-    Maximum intensity:255.0
-
-Groups:[module_num:4|svn_version:\'Unknown\'|variable_revision_number:2|show_window:False|notes:\x5B\'The Groups module optionally allows you to split your list of images into image subsets (groups) which will be processed independently of each other. Examples of groupings include screening batches, microtiter plates, time-lapse movies, etc.\'\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Do you want to group your images?:Yes
-    grouping metadata count:1
-    Metadata category:Screen
-
-SaveImages:[module_num:5|svn_version:\'Unknown\'|variable_revision_number:13|show_window:False|notes:\x5B\x5D|batch_state:array(\x5B\x5D, dtype=uint8)|enabled:True|wants_pause:False]
-    Select the type of image to save:Image
-    Select the image to save:ImageDisplay
-    Select method for constructing file names:From image filename
-    Select image name for file prefix:DNA
-    Enter single file name:OrigBlue
-    Number of digits:4
-    Append a suffix to the image file name?:Yes
-    Text to append to the image name:_nucleiNumbers
-    Saved file format:tiff
-    Output file location:Default Output Folder\x7Coutput
-    Image bit depth:8-bit integer
-    Overwrite existing files without warning?:Yes
-    When to save:Every cycle
-    Record the file and path information to the saved image?:No
-    Create subfolders in the output folder?:No
-    Base image folder:Elsewhere...