view color_to_gray.py @ 2:443638c10c61 draft default tip

planemo upload for repository https://github.com/bgruening/galaxytools/tree/master/tools commit 57a0433defa3cbc37ab34fbb0ebcfaeb680db8d5
author bgruening
date Sun, 05 Nov 2023 09:31:03 +0000
parents 878bafb411dd
children
line wrap: on
line source

#!/usr/bin/env python

import argparse
import json

from cp_common_functions import (get_json_value,
                                 get_pipeline_lines,
                                 get_total_number_of_modules,
                                 INDENTATION, update_module_count,
                                 write_pipeline)

MODULE_NAME = "ColorToGray"
OUTPUT_FILENAME = "output.cppipe"


def build_ctg_header(module_name, module_number):
    """Creates the first line of a module given the name and module number"""
    result = "|".join(
        [
            f"{module_name}:[module_num:{module_number}",
            "svn_version:\\'Unknown\\'",
            "variable_revision_number:4",
            "show_window:True",
            "notes:\\x5B\\'Convert the color image to grayscale.\\'\\x5D",
            "batch_state:array(\\x5B\\x5D, dtype=uint8)",
            "enabled:True",
            "wants_pause:False]\n",
        ]
    )
    return result


def build_main_block(input_params):
    """Creates the main block of the CP pipeline with the parameters that don't depend on conditional choices"""
    result = INDENTATION.join(
        [
            f"{INDENTATION}Select the input image:{get_json_value(input_params,'name_input_image')}\n",
            f"Conversion method:{get_json_value(input_params,'con_conversion_method.conversion_method')}\n",
            f"Image type:{get_json_value(input_params,'con_conversion_method.con_image_type.image_type')}\n",
        ]
    )

    conversion_method = get_json_value(
        input_params, "con_conversion_method.conversion_method"
    )

    image_type = get_json_value(
        input_params, "con_conversion_method.con_image_type.image_type"
    )
    rgb_comb_name_out = "OrigGray"
    combine_w_red = 1.0
    combine_w_green = 1.0
    combine_w_blue = 1.0

    split_red = "Yes"
    split_green = "Yes"
    split_blue = "Yes"
    red_output_name = "OrigRed"
    green_output_name = "OrigGreen"
    blue_output_name = "OrigBlue"

    split_hue = "Yes"
    split_saturation = "Yes"
    split_value = "Yes"
    hue_output_name = "OrigHue"
    saturation_output_name = "OrigSaturation"
    value_output_name = "OrigValue"

    channel_count = 1
    if conversion_method == "Combine":
        if image_type == "RGB" or image_type == "HSV":
            rgb_comb_name_out = get_json_value(
                input_params, "con_conversion_method.name_output_image"
            )
            combine_w_red = get_json_value(
                input_params, "con_conversion_method.con_image_type.weight_red_channel"
            )
            combine_w_green = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.weight_green_channel",
            )
            combine_w_blue = get_json_value(
                input_params, "con_conversion_method.con_image_type.weight_blue_channel"
            )
    elif conversion_method == "Split":
        if image_type == "RGB":
            split_red = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_red.yes_no",
            )
            red_output_name = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_red.name_output_image",
            )
            split_green = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_green.yes_no",
            )
            green_output_name = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_green.name_output_image",
            )
            split_blue = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_blue.yes_no",
            )
            blue_output_name = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_blue.name_output_image",
            )
        elif image_type == "HSV":
            split_hue = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_hue.yes_no",
            )
            hue_output_name = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_hue.name_output_image",
            )
            split_saturation = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_saturation.yes_no",
            )
            saturation_output_name = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_saturation.name_output_image",
            )
            split_value = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_value.yes_no",
            )
            value_output_name = get_json_value(
                input_params,
                "con_conversion_method.con_image_type.con_convert_value.name_output_image",
            )

    result += INDENTATION.join(
        [
            f"{INDENTATION}Name the output image:{rgb_comb_name_out}\n",
            f"Relative weight of the red channel:{str(combine_w_red)}\n",
            f"Relative weight of the green channel:{str(combine_w_green)}\n",
            f"Relative weight of the blue channel:{str(combine_w_blue)}\n",
            f"Convert red to gray?:{split_red}\n",
            f"Name the output image:{red_output_name}\n",
            f"Convert green to gray?:{split_green}\n",
            f"Name the output image:{green_output_name}\n",
            f"Convert blue to gray?:{split_blue}\n",
            f"Name the output image:{blue_output_name}\n",
            f"Convert hue to gray?:{split_hue}\n",
            f"Name the output image:{hue_output_name}\n",
            f"Convert saturation to gray?:{split_saturation}\n",
            f"Name the output image:{saturation_output_name}\n",
            f"Convert value to gray?:{split_value}\n",
            f"Name the output image:{value_output_name}\n",
        ]
    )

    channel_count = 1
    if image_type == "Channels":
        channels = input_params["con_conversion_method"]["con_image_type"][
            "rpt_channel"
        ]
        channel_count = len(channels)
        result += INDENTATION.join([f"{INDENTATION}Channel count:{channel_count}\n"])

        for ch in channels:
            rel_weight_ch = 1.0
            image_name = "Channel1"
            if conversion_method == "Combine":
                rel_weight_ch = get_json_value(ch, "weight_of_channel")
            else:
                image_name = get_json_value(ch, "image_name")
            result += INDENTATION.join(
                [
                    f"{INDENTATION}Channel number:{get_json_value(ch,'channel_no')}\n",
                    f"Relative weight of the channel:{str(rel_weight_ch)}\n",
                    f"Image name:{image_name}\n",
                ]
            )
    else:
        result += INDENTATION.join(
            [
                f"{INDENTATION}Channel count:{channel_count}\n",
                "Channel number:Red\\x3A 1\n",
                "Relative weight of the channel:1.0\n",
                "Image name:Channel1\n",
            ]
        )
    result = result.rstrip("\n")
    return result


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-p", "--pipeline", help="CellProfiler pipeline")
    parser.add_argument("-i", "--inputs", help="JSON inputs from Galaxy")
    args = parser.parse_args()

    pipeline_lines = get_pipeline_lines(args.pipeline)
    inputs_galaxy = json.load(open(args.inputs, "r"))

    current_module_num = get_total_number_of_modules(pipeline_lines)
    current_module_num += 1
    pipeline_lines = update_module_count(pipeline_lines, current_module_num)

    header_block = build_ctg_header(MODULE_NAME, current_module_num)
    main_block = build_main_block(inputs_galaxy)

    module_pipeline = f"\n{header_block}{main_block}\n"
    pipeline_lines.append(module_pipeline)

    write_pipeline(OUTPUT_FILENAME, pipeline_lines)