view identify_primary_objects.xml @ 1:6bf947501352 draft

"planemo upload for repository https://github.com/bgruening/galaxytools/tree/master/tools commit 6a3036d24b5ec074936f8f8283b7e176f6f1ce70"
author bgruening
date Thu, 09 Apr 2020 08:13:45 -0400
parents 99e493b2e951
children d9bf32d13dfd
line wrap: on
line source

<tool id="cp_identify_primary_objects" name="IdentifyPrimaryObjects" version="@CP_VERSION@">
    <description>module of CellProfiler</description>

    <macros>
        <import>macros.xml</import>
        <xml name="ipo_common"> 
            <param name="input_from_nat" type="text" label="Select the input image (from NamesAndTypes)">
                <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>
            <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="discard_outside_border" type="select" display="radio" label="Discard objects outside the diameter range?">
                <option value="Yes">Yes</option>
                <option value="No">No</option>
            </param>
            <param name="discard_touching_border" type="select" display="radio" label="Discard objects touching the border of the image?">
                <option value="Yes">Yes</option>
                <option value="No">No</option>
            </param>
        </xml>

        <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?">
                    <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"/>
                </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?">
                    <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" />
                </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?">    
                <option value="Yes">Yes</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">
                    <option value="Intensity">Intensity</option>
                    <option value="Shape">Shape</option>
                    <option value="Propagate">Propagate</option>
                    <option value="None">None</option>
                </param>
                <when value="Shape">
                    <expand macro="clumped_objects_params"/>
                </when>
                <when value="Intensity">
                    <expand macro="clumped_objects_params"/>
                </when>
                <when value="Propagate"/>
                <when value="None"/>
            </conditional>
        </xml>   
    </macros>

    <expand macro="py_requirements"/>
    <expand macro="cmd_modules" />
    
    <configfiles>
        <inputs name="inputs" />

        <configfile name="script_file">
import json
import sys
import os

FOURSPACES=@SPACES@

input_json_path = sys.argv[1]
input_pipeline= sys.argv[2]

params = json.load(open(input_json_path, "r"))

ipo = params['con_advanced']

adv = params['con_advanced']['advanced']


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 + "Method to distinguish clumped objects:%s\n" % 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']
            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']

            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"
            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']

            _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']

        _str += FOURSPACES + "Fill holes in identified objects?:%s\n" % ipo['fill_hole']

        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']

        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"
            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']

        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'])

        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']
        else:
            _str += FOURSPACES + "Select the measurement to threshold with:None\n"

        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_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 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":
            _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 + "Thresholding method:%s\n" % threshold_method    # This is a repeated entry, but needed for pipeline file

    return _str


with open(input_pipeline) as fin:
    lines = fin.readlines()

    k, v = lines[4].strip().split(':')

    module_count = int(v)
    new_count = module_count + 1
    lines[4] = k + ":%d\n" % new_count
    with open("output", "w") as f:
        f.writelines(lines)
        f.write(write_ipo())

f.close()
      </configfile>
    </configfiles>

    <inputs>
        <expand macro="input_pipeline_macro" /> 
        <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>
            <when value="No">
                <expand macro="ipo_common" />
            </when>
            <when value="Yes">
                <expand macro="ipo_common" />
                <conditional name="con_threshold_strategy">
                    <param name="threshold_strategy" type="select" label="Threshold strategy">
                        <option value="Global">Global</option>
                        <option value="Adaptive">Adaptive</option>
                    </param>
                    <when value="Adaptive">
                        <param name="adaptive_window" type="integer" label="Size of adaptive window" value="500"/>
                    </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>
                            </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>
                                </param>
                            </when>
                            <when value="Two classes" />
                        </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">
                        <option value="Shape">Shape</option>
                        <option value="Intensity">Intensity</option>
                        <option value="None">None</option>
                    </param>
                    <when value="Shape">
                        <expand macro="clumped_objects"/>
                    </when>
                    <when value="Intensity">
                        <expand macro="clumped_objects"/>
                    </when>
                    <when value="None"/>
                </conditional>
                <param name="fill_hole" type="select" label="Fill holes in identified objects">
                    <option value="Never">Never</option>
                    <option value="After both thresholding and declumping">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">
                        <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" />
                    </when>
                    <when value="Continue" />
                </conditional>
            </when>
        </conditional>
    </inputs>

    <outputs>
        <expand macro="output_pipeline_macro" />
    </outputs>

    <tests>
        <test>
            <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="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="Global" />
                </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>
                </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" />
                <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="Yes" />
                        </conditional>
                        <conditional name="con_min_distance">
                            <param name="min_distance" value="Yes" />
                        </conditional>     
                        <param name="speed_up" value="Yes" />             
                    </conditional>
                </conditional>
                <conditional name="con_handling_excessive">
                        <param name="excessive_handling" value="Continue" />
                </conditional>
                <param name="fill_hole" value="After both thresholding and declumping" />
            </conditional>
            <expand macro="test_out_file" file="identify_primary_objects.txt" />
        </test>
    </tests>

    <expand macro="help" module="IdentifyPrimaryObjects"/>

    <expand macro="citations" />

</tool>