view mz_images.xml @ 18:ae304a72db7b draft default tip

planemo upload for repository https://github.com/galaxyproteomics/tools-galaxyp/tree/master/tools/cardinal commit 91e77c139cb3b7c6d67727dc39140dd79355fa0c
author galaxyp
date Thu, 04 Jul 2024 13:42:18 +0000
parents 5629069fca8f
children
line wrap: on
line source

<tool id="cardinal_mz_images" name="MSI mz images" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="22.05">
    <description>
        mass spectrometry imaging m/z heatmaps
    </description>
    <macros>
        <import>macros.xml</import>
    </macros>
    <expand macro="requirements"/>
    <command detect_errors="aggressive">
<![CDATA[
        @INPUT_LINKING@
        cat '${MSI_heatmaps}' &&
        Rscript '${MSI_heatmaps}'
]]>
    </command>
    <configfiles>
        <configfile name="MSI_heatmaps"><![CDATA[

################################# load libraries and read file #################

library(Cardinal)
library(gridExtra)
##library(lattice)

@READING_MSIDATA_FULLY_COMPATIBLE@

@DATA_PROPERTIES@

##in case it exists, remove z-dimension:
coord(msidata)\$z <- NULL

##################################### read and filter input m/z ##############

input_list = read.delim("$calibrant_file", header = $calibrant_header, stringsAsFactors = FALSE)
input_list = input_list[,c($mz_column, $name_column)]

### calculate how many input m/z are valid: 
inputmasses = input_list[input_list[,1]>minmz & input_list[,1]<maxmz,]
inputmz = as.numeric(inputmasses[,1])
inputnames = as.character(inputmasses[,2])


############################## PDF #############################################
################################################################################

pdf("heatmaps.pdf", fonts = "Times", pointsize = 12)
plot(0,type='n',axes=FALSE,ann=FALSE)
#if not $filename:
    #set $filename = $infile.display_name
#end if
title(main=paste("\nHeatmap images\n\n", "Filename:\n", "$filename"))

new_row = data.frame(paste0("# valid m/z in \n", "$calibrant_file.display_name"), paste0(length(inputmz), "/", length(input_list[,1])))
colnames(new_row) = c("properties", "values")
property_df = rbind(property_df, new_row)

grid.table(property_df, rows= NULL)

############################# II) images ####################################

### only plot images when file has features and pixels: 
par(mar=c(0,0,0,0), oma=c(0,0,0,1))## margin for image legend

#if str($light_mode) == "white":
    lightmode()
#else
    darkmode()
#end if

if (ncol(msidata)>0 & nrow(msidata) >0){
    if (length(inputmz) != 0){
        for (mass in 1:length(inputmz)){

                print(image(msidata, mz=inputmz[mass],plusminus = $plusminus_dalton, normalize.image="$normalize_image", contrast.enhance = "$image_contrast", 
                smooth.image = "$image_smoothing", colorkey=$colorkey, colorscale=$colorscale, alpha.power=$alpha_power, ylim= c(maximumy,minimumy)))
                title(inputnames[mass], adj = 0.5, line = 1)}


        ## optional svg output with original coordinates
        #if $svg_pixelimage:
            print("svg pixel image")
            ## reverse y axis for svg output = correct order and nice svg image
            coord(msidata)\$y <- max(coord(msidata)\$y) - coord(msidata)\$y + 1

            msidata = as(msidata,"MSImagingExperiment")

            svg(file="svg_pixel_output.svg", width=maximumx, height=maximumy)
            par(mar=c(0,0,0,0), oma=c(0,0,0,0))## no margin for svg
	    #if str($light_mode) == "white":
	        lightmode()
	    #else
	        darkmode()
	    #end if
            print(image(msidata, mz = inputmz[1],strip=FALSE, plusminus = $plusminus_dalton,colorscale=$colorscale, colorkey = FALSE,axes=FALSE, xlab=NA, ylab=NA,contrast.enhance = "$image_contrast", smooth.image = "$image_smoothing", alpha.power=$alpha_power, normalize.image="$normalize_image"))
            dev.off()
        #end if

        ## optional overlay all input m/z in one image
        #if str($overlay_cond.overlay_selection) == "yes_overlay":

        #set $color_string = ','.join(['"%s"' % $color.feature_color for $color in $overlay_cond.colours])
        colourvector = c($color_string)
            print(image(msidata, mz=inputmz, 
                  plusminus = $plusminus_dalton,
                  col=colourvector, 
                  contrast.enhance = "$image_contrast", 
                  normalize.image="$normalize_image", 
                  smooth.image = "$image_smoothing",
                  superpose=TRUE, main="overlay of all m/z", 
                  key=FALSE, alpha.power=$alpha_power,
                  ylim= c(maximumy,minimumy)))

             legend("$overlay_cond.legend_position",
                       fill=colourvector,
                      legend=as.numeric(inputmz))
        #end if

    } else {print("The input m/z were invalid")}
    dev.off()
}else{
    print("input file has no features or pixels left")
dev.off()
}


    ]]></configfile>
    </configfiles>
    <inputs>
        <expand macro="reading_msidata"/>
        <expand macro="pdf_filename"/>
        <expand macro="reading_2_column_mz_tabular"/>

        <param name="plusminus_dalton" value="0.25" type="float" label="plusminus m/z" help="m/z range to add on either side of the given m/z to create a window in which the mean of all intensities will be computed"/>
        <param name="image_contrast" type="select" label="Contrast enhancement" help="The 'histogram' equalization method flatterns the distribution of intensities. The hotspot 'suppression' method uses thresholding to reduce the intensities of hotspots">
            <option value="none" selected="True">none</option>
            <option value="suppression">suppression</option>
            <option value="histogram">histogram</option>
        </param>
        <param name="image_smoothing" type="select" label="Image smoothing" help="The 'gaussian' smoothing method smooths images with a simple gaussian kernel. The 'adaptive' method uses bilateral filtering to preserve edges">
            <option value="none" selected="True">none</option>
            <option value="gaussian">gaussian</option>
            <option value="adaptive">adaptive</option>
        </param>
        <param name="colorscale" type="select" display="radio" label="Colorscale">
            <option value="viridis" selected="True">viridis</option>
            <option value="magma">magma</option>
            <option value="plasma">plasma</option>
            <option value="inferno">inferno</option>
        </param>
        <param name="light_mode" type="select" display="radio" label="Image Background">
            <option value="white" selected="True">white</option>
            <option value="black">black</option>
        </param>
        <param name="alpha_power" type="float" value="1" label="Alpha power" help="Opacity scaling factor (1 is linear)"/>
        <param name="colorkey" type="boolean" checked="True" truevalue="TRUE" falsevalue="FALSE" label="Display colorkey in plot"/>
        <param name="normalize_image" type="boolean" truevalue="linear" falsevalue="none" label="Linear normalization of image"/>
        <param name="svg_pixelimage" type="boolean" label="Export first valid m/z from tabular file as SVG"/>
        <conditional name="overlay_cond">
            <param name="overlay_selection" type="select" label="Overlay image">
                <option value="no_overlay" selected="True">no</option>
                <option value="yes_overlay">yes</option>
            </param>
            <when value="no_overlay"/>
            <when value="yes_overlay">
            <repeat name="colours" title="Colours for the plots" min="1" max="50">
                <param name="feature_color" type="color" label="Colours" value="#ff00ff" help="Numbers of colours should be the same as number of m/z in tabular file">
                  <sanitizer>
                    <valid initial="string.letters,string.digits">
                      <add value="#" />
                    </valid>
                  </sanitizer>
                </param>
            </repeat>
            <param name="legend_position" type="select" display="radio" label="Position of legend">
                <option value="topright" selected="True">topright</option>
                <option value="top">top</option>
                <option value="topleft">topleft</option>
                <option value="left">left</option>
                <option value="bottomleft">bottomleft</option>
                <option value="bottom">bottom</option>
                <option value="bottomright">bottomright</option>
                <option value="right">right</option>
            </param>
            </when>
        </conditional>
    </inputs>
    <outputs>
        <data format="pdf" name="plots" from_work_dir="heatmaps.pdf" label="${tool.name} on ${on_string}: results"/>
        <data format="svg" name="svg_output" from_work_dir="svg_pixel_output.svg" label="${tool.name} on ${on_string}: image.svg">
            <filter>svg_pixelimage</filter>
        </data>
    </outputs>
    <tests>
        <test expect_num_outputs="1">
            <expand macro="infile_imzml"/>
            <param name="calibrant_file" value="inputpeptides.tabular" ftype="tabular"/>
            <param name="mz_column" value="1"/>
            <param name="name_column" value="2"/>
            <param name="plusminus_dalton" value="0.25"/>
            <param name="filename" value="Testfile_imzml"/>
            <param name="image_contrast" value="histogram"/>
            <param name="colorkey" value="True"/>
            <output name="plots" file="Heatmaps_imzml.pdf" ftype="pdf" compare="sim_size"/>
        </test>
        <test expect_num_outputs="2">
            <expand macro="infile_analyze75"/>
            <param name="calibrant_file" value="inputpeptides2.tabular" ftype="tabular"/>
            <param name="mz_column" value="1"/>
            <param name="name_column" value="1"/>
            <param name="plusminus_dalton" value="0.5"/>
            <param name="filename" value="Testfile_analyze75"/>
            <param name="colorscale" value="magma"/>
            <param name="image_smoothing" value="gaussian"/>
            <param name="colorkey" value="True"/>
            <param name="svg_pixelimage" value="True"/>
            <output name="plots" file="Heatmaps_analyze75.pdf" ftype="pdf" compare="sim_size"/>
            <output name="svg_output" file="analyze75.svg" ftype="svg" compare="sim_size"/>
        </test>
        <test expect_num_outputs="1">
            <param name="infile" value="preprocessed.RData" ftype="rdata"/>
            <param name="calibrant_file" value="inputpeptides.tabular" ftype="tabular"/>
            <param name="mz_column" value="1"/>
            <param name="name_column" value="2"/>
            <param name="plusminus_dalton" value="0.5"/>
            <param name="colorkey" value="True"/>
            <param name="filename" value="Testfile_rdata"/>
            <output name="plots" file="Heatmaps_rdata.pdf" ftype="pdf" compare="sim_size"/>
        </test>
        <test expect_num_outputs="1">
            <param name="infile" value="empty_spectra.rdata" ftype="rdata"/>
            <param name="calibrant_file" value="inputpeptides2.tabular" ftype="tabular"/>
            <param name="mz_column" value="1"/>
            <param name="name_column" value="1"/>
            <param name="plusminus_dalton" value="0.5"/>
            <param name="colorscale" value="plasma"/>
            <param name="colorkey" value="False"/>
            <param name="filename" value="Testfile_rdata"/>
            <output name="plots" file="Heatmaps_LM8_file16.pdf" ftype="pdf" compare="sim_size"/>
        </test>
        <test expect_num_outputs="1">
            <expand macro="processed_infile_imzml"/>
            <conditional name="processed_cond">
                <param name="processed_file" value="processed"/>
                <param name="accuracy" value="200"/>
                <param name="units" value="ppm"/>
            </conditional>
            <param name="calibrant_file" value="inputpeptides.tabular" ftype="tabular"/>
            <param name="mz_column" value="1"/>
            <param name="name_column" value="2"/>
            <param name="light_mode" value="black"/>
            <conditional name="overlay_cond">
                <param name="overlay_selection" value="yes_overlay"/>
                <repeat name="colours">
                    <param name="feature_color" value="#ff00ff"/>
                </repeat>
                <repeat name="colours">
                    <param name="feature_color" value="#1f497d"/>
                </repeat>
                <repeat name="colours">
                    <param name="feature_color" value="#00b050"/>
                </repeat>
                <param name="legend_position" value="topleft"/>
            </conditional>
            <output name="plots" file="Heatmaps_processed.pdf" ftype="pdf" compare="sim_size"/>
        </test>
    </tests>
    <help><![CDATA[

@CARDINAL_DESCRIPTION@

-----

This tool uses the Cardinal image function to plot the intensity distribution of m/z features of mass spectrometry imaging data. 

@MSIDATA_INPUT_DESCRIPTION@

@MZ_2COLS_TABULAR_INPUT_DESCRIPTION@


**Tips** 

- In case tabular file cannot be selected in drop-down menu: Datatype in Galaxy must be tabular otherwise file will not appear in selection window (if Galaxy auto-detection was wrong, datatype can be changed by pressing the pen button (edit attributes))
- The contrast enhance and image smoothing functions require a certain number (about 2%) of m/z features with intensities > 0 across all spectra

**Output**

- Single Pdf with the heatmap images
- optional: svg file with the heatmap of the first valid m/z in the tabular file


    ]]>
    </help>
    <expand macro="citations"/>
</tool>