view msi_spectra_plots.xml @ 6:2e0368a6bfe8 draft

planemo upload for repository https://github.com/galaxyproteomics/tools-galaxyp/tree/master/tools/msi_spectra_plots commit 5bceedc3a11c950790692a4c64bbb83d46897bee
author galaxyp
date Tue, 24 Jul 2018 04:53:42 -0400
parents 4f13aec6d8ff
children 7d94faee0731
line wrap: on
line source

<tool id="mass_spectrometry_imaging_mzplots" name="MSI plot spectra" version="1.10.0.4">
    <description>
        mass spectrometry imaging mass spectra plots
    </description>
    <requirements>
        <requirement type="package" version="1.10.0">bioconductor-cardinal</requirement>
        <requirement type="package" version="2.2.1">r-gridextra</requirement>
        <requirement type="package" version="2.2.1">r-ggplot2</requirement>
        <requirement type="package" version="0.5.0">r-scales</requirement>
    </requirements>
    <command detect_errors="exit_code">
    <![CDATA[
        #if $infile.ext == 'imzml'
            ln -s '${infile.extra_files_path}/imzml' infile.imzML &&
            ln -s '${infile.extra_files_path}/ibd' infile.ibd &&
        #elif $infile.ext == 'analyze75'
            ln -s '${infile.extra_files_path}/hdr' infile.hdr &&
            ln -s '${infile.extra_files_path}/img' infile.img &&
            ln -s '${infile.extra_files_path}/t2m' infile.t2m &&
        #else
            ln -s $infile infile.RData &&
        #end if
        cat '${MSI_mzplots}' &&
        Rscript '${MSI_mzplots}'
    ]]>
    </command>
    <configfiles>
        <configfile name="MSI_mzplots"><![CDATA[

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

library(Cardinal)
library(gridExtra)
library(ggplot2)
library(scales)


#if $infile.ext == 'imzml'
    #if str($processed_cond.processed_file) == "processed":
        msidata <- readImzML('infile', mass.accuracy=$processed_cond.accuracy, units.accuracy = "$processed_cond.units")
    #else
        msidata <- readImzML('infile', attach.only=TRUE)
    #end if
#elif $infile.ext == 'analyze75'
    msidata = readAnalyze('infile', attach.only=TRUE)
#else
    load('infile.RData')
#end if

###################################### file properties in numbers ##############

## Number of features (m/z)
maxfeatures = length(features(msidata))
## Range m/z
minmz = round(min(mz(msidata)), digits=2)
maxmz = round(max(mz(msidata)), digits=2)
## Number of spectra (pixels)
pixelcount = length(pixels(msidata))
## Range x coordinates
minimumx = min(coord(msidata)[,1])
maximumx = max(coord(msidata)[,1])
## Range y coordinates
minimumy = min(coord(msidata)[,2])
maximumy = max(coord(msidata)[,2])
## Range of intensities
minint = round(min(spectra(msidata)[], na.rm=TRUE), digits=2)
maxint = round(max(spectra(msidata)[], na.rm=TRUE), digits=2)
medint = round(median(spectra(msidata)[], na.rm=TRUE), digits=2)
## Number of intensities > 0
npeaks= sum(spectra(msidata)[]>0, na.rm=TRUE)
## Spectra multiplied with m/z (potential number of peaks)
numpeaks = ncol(spectra(msidata)[])*nrow(spectra(msidata)[])
## Percentage of intensities > 0
percpeaks = round(npeaks/numpeaks*100, digits=2)
## Number of empty TICs
TICs = colSums(spectra(msidata)[], na.rm=TRUE) 
NumemptyTIC = sum(TICs == 0)


## Processing informations
processinginfo = processingData(msidata)
centroidedinfo = processinginfo@centroided

## if TRUE write processinginfo if FALSE write FALSE

## normalization
if (length(processinginfo@normalization) == 0) {
  normalizationinfo='FALSE'
} else {
  normalizationinfo=processinginfo@normalization
}
## smoothing
if (length(processinginfo@smoothing) == 0) {
  smoothinginfo='FALSE'
} else {
  smoothinginfo=processinginfo@smoothing
}
## baseline
if (length(processinginfo@baselineReduction) == 0) {
  baselinereductioninfo='FALSE'
} else {
  baselinereductioninfo=processinginfo@baselineReduction
}
## peak picking
if (length(processinginfo@peakPicking) == 0) {
  peakpickinginfo='FALSE'
} else {
  peakpickinginfo=processinginfo@peakPicking
}

properties = c("Number of m/z features",
               "Range of m/z values",
               "Number of pixels", 
               "Range of x coordinates", 
               "Range of y coordinates",
               "Range of intensities", 
               "Median of intensities",
               "Intensities > 0",
               "Number of zero TICs",
               "Preprocessing", 
               "Normalization", 
               "Smoothing",
               "Baseline reduction",
               "Peak picking",
               "Centroided")

values = c(paste0(maxfeatures), 
           paste0(minmz, " - ", maxmz), 
           paste0(pixelcount), 
           paste0(minimumx, " - ", maximumx),  
           paste0(minimumy, " - ", maximumy), 
           paste0(minint, " - ", maxint), 
           paste0(medint),
           paste0(percpeaks, " %"), 
           paste0(NumemptyTIC), 
           paste0(" "),
           paste0(normalizationinfo),
           paste0(smoothinginfo),
           paste0(baselinereductioninfo),
           paste0(peakpickinginfo),
           paste0(centroidedinfo))

property_df = data.frame(properties, values)

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


pdf("mzplots.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=paste0("Mass spectra for file: \n\n","$filename"))


############################# I) numbers ######################################
###############################################################################

grid.table(property_df, rows= NULL)

if (npeaks > 0){

    pixeldf = data.frame(matrix(ncol = 2, nrow=0))

    ############################# single pixel ################################
    ###########################################################################

    #if str( $pixel_conditional.pixel_type) == 'single_pixel':
        print("single_pixel")

        #for $chosenpixel in $pixel_conditional.repeatpixel: 

            pixelisvalid = as.character($chosenpixel.inputx %in% coord(msidata)\$x & $chosenpixel.inputy %in% coord(msidata)\$y)
            pixelname = paste0("x=", $chosenpixel.inputx,", ", "y=", $chosenpixel.inputy)
            pixeldf = rbind(pixeldf, cbind(pixelname, pixelisvalid))

            ############################# II) control image ####################

                if (pixelisvalid == "TRUE"){
                    print(pixelisvalid)

                    image(msidata, mz=$chosenpixel.inputmz, ylim = c(maximumy+(0.2*maximumy),minimumy-1),
                    colorkey=FALSE, plusminus = $chosenpixel.plusminusinDalton,
                    main= paste0("x= ",$chosenpixel.inputx, ", y= ", $chosenpixel.inputy))

                    abline(v=$chosenpixel.inputx, col ="$chosenpixel.inputcolour", lty="$chosenpixel.inputtype", lwd=$chosenpixel.inputwidth)
                    abline(h=$chosenpixel.inputy, col ="$chosenpixel.inputcolour", lty="$chosenpixel.inputtype", lwd=$chosenpixel.inputwidth)

            ##################### III) plot full mass spectrum #################

                    plot(msidata, coord=list(x=$chosenpixel.inputx, y=$chosenpixel.inputy))

            ##################### IV) plot zoom-in mass spectrum ###############

                    #if $chosenpixel.zoomedplot:
                            iData(msidata) <- iData(msidata)[] ## getting back data on disk 

                        #for $token in $chosenpixel.zoomedplot:

                            minmasspixel = features(msidata, mz=$token.xlimmin)
                            maxmasspixel = features(msidata, mz=$token.xlimmax)

                            plot(msidata[minmasspixel:maxmasspixel,], coord=list(x=$chosenpixel.inputx, y=$chosenpixel.inputy), 
                                 xlim= c($token.xlimmin,$token.xlimmax))

                        #end for
                    #end if
                }else{
                    print("The pixel coordinates did not correspond to a real pixel")}
        #end for

    colnames(pixeldf) = c("pixel coordinates", "coordinates were found in this file")

    ############################# sample pixel ################################
    ###########################################################################

    #elif str( $pixel_conditional.pixel_type) == 'sample_pixel':
        print("sample pixels")

        ## optional annotation from tabular file to obtain pixel groups (otherwise all pixels are considered to be one sample)

        #if str($pixel_conditional.tabular_annotation.load_annotation) == 'yes_annotation':

            ## read and extract x,y,annotation information
            input_tabular = read.delim("$pixel_conditional.tabular_annotation.annotation_file", header = $pixel_conditional.tabular_annotation.tabular_header, stringsAsFactors = FALSE)
            annotation_input = input_tabular[,c($pixel_conditional.tabular_annotation.column_x, $pixel_conditional.tabular_annotation.column_y, $pixel_conditional.tabular_annotation.column_names)]
            colnames(annotation_input) = c("x", "y", "annotation")

            ## merge with coordinate information of msidata
            msidata_coordinates = cbind(coord(msidata)[,1:2], c(1:ncol(msidata)))
            colnames(msidata_coordinates)[3] = "pixel_index"
            merged_annotation = merge(msidata_coordinates, annotation_input, by=c("x", "y"), all.x=TRUE)
            merged_annotation[is.na(merged_annotation)] = "NA"
            merged_annotation = merged_annotation[order(merged_annotation\$pixel_index),]
            msidata\$annotation = as.factor(merged_annotation[,4])

        #end if

        ##################### I) Sample: plot full mass spectrum ##############

        ## coloured plot with mean over all spectra with the same annotation, if no annotation is provided all pixels are considered as one sample

        if (!is.null(levels(msidata\$annotation))){
            print("annotated samples")

                    ## overview plot over annotated samples
                    number_combined = length(levels(msidata\$annotation))

                    ## the more annotation groups a file has the smaller will be the legend
                    if (number_combined<20){
                        legend_size = 10
                    }else if (number_combined>20 && number_combined<40){
                        legend_size = 9
                    }else if (number_combined>40 && number_combined<60){
                        legend_size = 8
                    }else if (number_combined>60 && number_combined<100){
                        legend_size = 7
                    }else{
                        legend_size = 6
                    }

                    position_df = cbind(coord(msidata)[,1:2], msidata\$annotation)
                    colnames(position_df)[3] = "sample_name"

                    combine_plot = ggplot(position_df, aes(x=x, y=y, fill=sample_name))+
                           geom_tile() +
                           coord_fixed()+
                           ggtitle("Spatial orientation of annotated data")+
                           theme_bw()+
                           theme(plot.title = element_text(hjust = 0.5))+
                           theme(text=element_text(family="ArialMT", face="bold", size=12))+
                           theme(legend.position="bottom",legend.direction="vertical")+
                           theme(legend.key.size = unit(0.2, "line"), legend.text = element_text(size = legend_size))+
                           guides(fill=guide_legend(ncol=5,byrow=TRUE))

                    print(combine_plot)

                    ## print legend only for less than 10 samples
                    if (length(levels(msidata\$annotation)) < 10){
                        key_legend = TRUE
                    }else{key_legend = FALSE}

            is.na(spectra(msidata)[]) == 0 ## in case of NA values they will be set to zero
            plot(msidata, pixel=1:ncol(msidata), pixel.groups=msidata\$annotation, key=key_legend, col=hue_pal()(length(levels(msidata\$annotation))),superpose=TRUE)
        }else{
            is.na(spectra(msidata)[]) == 0 ## in case of NA values they will be set to zero
            plot(msidata, pixel=1:ncol(msidata), key=TRUE)}

        ##################### II) Sample: plot zoom-in mass spectrum ##########

        #if $pixel_conditional.zoomed_sample:
            iData(msidata) <- iData(msidata)[] ## getting back data on disk 
            #for $token in $pixel_conditional.zoomed_sample:
                print("zoomed sample pixels")

                minmasspixel = features(msidata, mz=$token.xlimmin)
                maxmasspixel = features(msidata, mz=$token.xlimmax)

                ## coloured plot with mean over all spectra for annotation group, otherwise only 1 black plot
                if (!is.null(levels(msidata\$annotation))){
                    print("annotation samples")
                    plot(msidata[minmasspixel:maxmasspixel,], pixel=1:ncol(msidata),
                    xlim= c($token.xlimmin,$token.xlimmax),pixel.groups=msidata\$annotation,
                    key=key_legend,col=hue_pal()(length(levels(msidata\$annotation))), superpose=TRUE)
                }else{
                    plot(msidata[minmasspixel:maxmasspixel,], pixel=1:ncol(msidata), key=TRUE, xlim= c($token.xlimmin,$token.xlimmax))}

            #end for
        #end if

        if (!is.null(levels(msidata\$annotation))){
            pixeldf = data.frame(table(msidata\$annotation))
        }else{
            pixeldf = data.frame("$filename", ncol(msidata))}
        colnames(pixeldf) = c("sample name", "number of pixels")

    #end if


############################# pixel table ######################################
###############################################################################


    ### overview table of pixels or samples:
    plot(0,type='n',axes=FALSE,ann=FALSE)
    title(main="Overview of chosen pixel:")

    ### for more than 20 annotation groups print only 20 samples per page:
    if (is.null(levels(msidata\$annotation))){
        grid.table(pixeldf, rows= NULL)
    }else if (length(levels(msidata\$annotation)) <= 20){
        grid.table(pixeldf, rows= NULL)
    }else{
        grid.table(pixeldf[1:20,], rows= NULL)
        mincount = 21
        maxcount = 40
        for (count20 in 1:(ceiling(nrow(pixeldf)/20)-1)){
            plot(0,type='n',axes=FALSE,ann=FALSE)
            if (maxcount <= nrow(pixeldf)){
                grid.table(pixeldf[mincount:maxcount,], rows= NULL)
                mincount = mincount+20
                maxcount = maxcount+20
            }else{### stop last page with last sample otherwise NA in table
                grid.table(pixeldf[mincount:nrow(pixeldf),], rows= NULL)} 
        }
    }

    dev.off()

}else{
    print("Inputfile has no intensities > 0")
    dev.off()
}
    ]]></configfile>
    </configfiles>
    <inputs>
        <param name="infile" type="data" format="imzml,rdata,analyze75" label="Inputfile as imzML, Analyze7.5 or Cardinal MSImageSet saved as RData"
            help="Upload composite datatype imzml (ibd+imzML) or analyze75 (hdr+img+t2m) or regular upload .RData (Cardinal MSImageSet)"/>
        <conditional name="processed_cond">
            <param name="processed_file" type="select" label="Is the input file a processed imzML file ">
                <option value="no_processed" selected="True">not a processed imzML</option>
                <option value="processed">processed imzML</option>
            </param>
            <when value="no_processed"/>
            <when value="processed">
                <param name="accuracy" type="float" value="50" label="Mass accuracy to which the m/z values will be binned" help="This should be set to the native accuracy of the mass spectrometer, if known"/>
                <param name="units" display="radio" type="select" label="Unit of the mass accuracy" help="either m/z or ppm">
                    <option value="mz" >mz</option>
                    <option value="ppm" selected="True" >ppm</option>
                </param>
            </when>
        </conditional>
        <param name="filename" type="text" value="" label="Title" help="will appear in the pdf output. If nothing given it will take the dataset name"/>
        <conditional name="pixel_conditional">
            <param name="pixel_type" type="select" label="Select if you want to plot the mass spectrum of a single pixel or the average spectrum of all pixels of a sample">
                <option value="single_pixel" selected="True">Single pixel</option>
                <option value="sample_pixel">Average spectrum for each sample</option>
            </param>
            <when value="single_pixel">
                <repeat name="repeatpixel" title="Plot mass spectra for pixel of interest" min="1" max="20">
                    <param name="inputx" type="integer" value="" label="x-coordinate of pixel of interest" help="x-value of the pixel of interest"/>
                    <param name="inputy" type="integer" value="" label="y-coordinate of pixel of interest" help="y-value of the pixel of interest"/>
                    <param name="inputmz" type="float" value="1296.7" label="Next parameters are to control heatmap image which will be plotted, define m/z here" help="m/z will be displayed as heatmap and the pixel of interest will be visualized by the intersection of two lines"/>
                    <param name="plusminusinDalton" value="0.25" type="float" label="m/z range for this m/z value" help="plusminus m/z window "/>
                    <param name="inputcolour" type="select" label="select the colour for the lines at x and y position">
                        <option value="white" selected="True">white</option>
                        <option value="black">black</option>
                        <option value="grey">grey</option>
                        <option value="blue">blue</option>
                        <option value="red">red</option>
                        <option value="green">green</option>
                    </param>
                    <param name="inputtype" type="select" label="select the line type for the lines at x and y position">
                        <option value="solid" selected="True">solid</option>
                        <option value="dashed">dashed</option>
                        <option value="dotted">dotted</option>
                        <option value="longdash">longdash</option>
                    </param>
                    <param name="inputwidth" type="integer" value="2" label="select the width of the lines at x and y position"/>
                    <repeat name="zoomedplot" title="Zoomed in plots with m/z min and m/z max to define the plot window" min="0" max="50">
                        <param name="xlimmin" type="integer" value="" label="lower m/z boundary for plotting window" help="minimum m/z for zoomed in window"/>
                        <param name="xlimmax" type="integer" value="" label="upper m/z boundary for plotting window" help="maximum m/z for zoomed in window"/>
                    </repeat>
                </repeat>
            </when>
            <when value="sample_pixel">
            <conditional name="tabular_annotation">
                <param name="load_annotation" type="select" label="Use pixel annotation from tabular file for spectra plots">
                    <option value="no_annotation" selected="True">pixels belong into one group only</option>
                    <option value="yes_annotation">group pixels according to annotations</option>
                </param>
                    <when value="yes_annotation">
                        <param name="annotation_file" type="data" format="tabular" label="Use annotations from tabular file"
                        help="Tabular file with three columns: x values, y values and pixel annotations"/>
                            <param name="column_x" data_ref="annotation_file" label="Column with x values" type="data_column"/>
                            <param name="column_y" data_ref="annotation_file" label="Column with y values" type="data_column"/>
                            <param name="column_names" data_ref="annotation_file" label="Column with pixel annotations" type="data_column"/>
                            <param name="tabular_header" type="boolean" label="Tabular file contains a header line" truevalue="TRUE" falsevalue="FALSE"/>
                    </when>
                    <when value="no_annotation"/>
            </conditional>
                <repeat name="zoomed_sample" title="Zoomed in plots with m/z min and m/z max to define the plot window" min="0" max="50">
                    <param name="xlimmin" type="integer" value="" label="lower m/z boundary for plotting window" help="minimum m/z for zoomed in window"/>
                    <param name="xlimmax" type="integer" value="" label="upper m/z boundary for plotting window" help="maximum m/z for zoomed in window"/>
                </repeat>
            </when>
        </conditional>
    </inputs>
    <outputs>
        <data format="pdf" name="plots" from_work_dir="mzplots.pdf" label = "$infile.display_name mass_spectra"/>
    </outputs>
    <tests>
        <test>
            <param name="infile" value="" ftype="imzml">
                <composite_data value="Example_Continuous.imzML"/>
                <composite_data value="Example_Continuous.ibd"/>
            </param>
            <conditional name="pixel_conditional">
                <param name="pixel_type" value="single_pixel"/>
                    <repeat name="repeatpixel">
                        <param name="plusminusinDalton" value="0.25"/>
                        <param name="inputx" value="3"/>
                        <param name="inputy" value="3"/>
                        <repeat name="zoomedplot">
                            <param name="xlimmin" value="310"/>
                            <param name="xlimmax" value="320"/>
                        </repeat>
                        <repeat name="zoomedplot">
                            <param name="xlimmin" value="350"/>
                            <param name="xlimmax" value="400"/>
                        </repeat>
                        <repeat name="zoomedplot">
                            <param name="xlimmin" value="400"/>
                            <param name="xlimmax" value="420"/>
                        </repeat>
                    </repeat>
                    <repeat name="repeatpixel">
                        <param name="plusminusinDalton" value="0.25"/>
                        <param name="inputx" value="2"/>
                        <param name="inputy" value="2"/>
                    </repeat>
                    <repeat name="repeatpixel">
                        <param name="plusminusinDalton" value="0.25"/>
                        <param name="inputx" value="1"/>
                        <param name="inputy" value="1"/>
                    </repeat>
                </conditional>
            <output name="plots" file="Plot_imzml.pdf" compare="sim_size" delta="20000"/>
        </test>
        <test>
            <param name="infile" value="" ftype="analyze75">
                <composite_data value="Analyze75.hdr"/>
                <composite_data value="Analyze75.img"/>
                <composite_data value="Analyze75.t2m"/>
            </param>
            <conditional name="pixel_conditional">
                <param name="pixel_type" value="single_pixel"/>
                    <repeat name="repeatpixel">
                        <param name="plusminusinDalton" value="0.25"/>
                        <param name="inputx" value="5"/>
                        <param name="inputy" value="2"/>
                        <repeat name="zoomedplot">
                            <param name="xlimmin" value="840"/>
                            <param name="xlimmax" value="850"/>
                        </repeat>
                    </repeat>
                    <repeat name="repeatpixel">
                        <param name="plusminusinDalton" value="0.25"/>
                        <param name="inputx" value="2"/>
                        <param name="inputy" value="2"/>
                    </repeat>
            </conditional>
            <output name="plots" file="Plot_analyze75.pdf" compare="sim_size" delta="20000"/>
        </test>
        <test>
            <param name="infile" value="" ftype="analyze75">
                <composite_data value="Analyze75.hdr"/>
                <composite_data value="Analyze75.img"/>
                <composite_data value="Analyze75.t2m"/>
            </param>
            <conditional name="pixel_conditional">
                <param name="pixel_type" value="sample_pixel"/>
                <conditional name="tabular_annotation">
                    <param name="load_annotation" value="yes_annotation"/>
                    <param name="annotation_file" value="annotations.tabular" ftype="tabular"/>
                    <param name="column_x" value="1"/>
                    <param name="column_y" value="2"/>
                    <param name="column_names" value="4"/>
                    <param name="tabular_header" value="TRUE"/>
                </conditional>
                <repeat name="zoomed_sample">
                     <param name="xlimmin" value="1250"/>
                     <param name="xlimmax" value="1270"/>
                 </repeat>
            </conditional>
            <output name="plots" file="Plot_analyze75_allpixels.pdf" compare="sim_size" delta="20000"/>
        </test>
        <test>
            <param name="infile" value="123_combined.RData" ftype="rdata"/>
            <conditional name="pixel_conditional">
                <param name="pixel_type" value="sample_pixel"/>
                    <repeat name="zoomed_sample">
                         <param name="xlimmin" value="350"/>
                         <param name="xlimmax" value="360"/>
                     </repeat>
            </conditional>
            <output name="plots" file="Plot_rdata.pdf" compare="sim_size" delta="20000"/>
        </test>
        <test>
            <param name="infile" value="empty_spectra.rdata" ftype="rdata"/>
            <conditional name="pixel_conditional">
                <param name="pixel_type" value="single_pixel"/>
                    <repeat name="repeatpixel">
                        <param name="plusminusinDalton" value="0.1"/>
                        <param name="inputx" value="1"/>
                        <param name="inputy" value="1"/>
                    </repeat>
            </conditional>
            <output name="plots" file="Plot_empty_spectra.pdf" compare="sim_size" delta="20000"/>
        </test>
    </tests>
    <help><![CDATA[

Cardinal is an R package that implements statistical & computational tools for analyzing mass spectrometry imaging datasets. `More information on Cardinal <http://cardinalmsi.org//>`_

This tool uses the Cardinal plot function to generate (zoomed in) mass spectra plots of mass spectrometry imaging data.

Input data: 3 types of input data can be used:

- imzml file (upload imzml and ibd file via the "composite" function) `Introduction to the imzml format <https://ms-imaging.org/wp/imzml/>`_
- Analyze7.5 (upload hdr, img and t2m file via the "composite" function)
- Cardinal "MSImageSet" data (with variable name "msidata", saved as .RData)

Options:

- "single pixel": Returns a full mass spectrum plot for one pixel, which is defined by its x- and y-coordinates

    - Enter the x and y coordinates of your pixel of interest
    - To have a visual control for the selected pixel, a heatmap of a m/z of interest will be drawn. Two intersecting lines will show the pixel location. This procedure requires an m/z of interest together with a m/z range and for the lines the colour and type.
    - Additionally zoom into mass spectra plots is possible by providing the minimum and maximum m/z value to define the limits of the plot
- "All pixels of a sample": Returns a full average mass spectrum plot with different colours for each pixel annotation group, without annotations the average of all pixels is plotted
    - Additionally zoom into mass spectra plots is possible by providing the minimum and maximum m/z value to define the limits of the plot

Output:

- Pdf with the selected mass spectra plots and additional control plots

Tip: 

- Corresponding mass spectra with m/z intensity pairs as tabular output can be obtained with the filtering tool option "ranges for x and y"


]]>
    </help>
    <citations>
        <citation type="doi">10.1093/bioinformatics/btv146</citation>
    </citations>
</tool>