view msi_classification.xml @ 0:f0b415eb3bcf draft default tip

planemo upload for repository https://github.com/galaxyproteomics/tools-galaxyp/tree/master/tools/msi_classification commit 8087490eb4dcaf4ead0f03eae4126780d21e5503
author galaxyp
date Fri, 06 Jul 2018 14:12:51 -0400
parents
children
line wrap: on
line source

<tool id="mass_spectrometry_imaging_classification" name="MSI classification" version="1.10.0.0">
    <description>spatial classification of mass spectrometry imaging data</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="0.20-35">r-lattice</requirement>
        <requirement type="package" version="2.2.1">r-ggplot2</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_segmentation}' &&
        echo ${MSI_segmentation} &&
        Rscript '${MSI_segmentation}'

    ]]>
    </command>
    <configfiles>
        <configfile name="MSI_segmentation"><![CDATA[


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

library(Cardinal)
library(gridExtra)
library(lattice)
library(ggplot2)


#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')
    #end if
#elif $infile.ext == 'analyze75'
    msidata = readAnalyze('infile')
#else
    load('infile.RData')
#end if

## function to later read RData reference files in

loadRData <- function(fileName){
#loads an RData file, and returns it
load(fileName)
get(ls()[ls() != "fileName"])
}

## create full matrix to make processed imzML files compatible with classification
iData(msidata) <- iData(msidata)[] 

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

## Number of features (mz)
maxfeatures = length(features(msidata))
## Range mz
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)[]), digits=2)
maxint = round(max(spectra(msidata)[]), digits=2)
medint = round(median(spectra(msidata)[]), digits=2)
## Number of intensities > 0
npeaks= sum(spectra(msidata)[]>0)
## Spectra multiplied with mz (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)[]) 
NumemptyTIC = sum(TICs == 0)


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

## if TRUE write processinginfo if no 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 mz features",
               "Range of mz values",
               "Number of pixels", 
               "Range of x coordinates", 
               "Range of y coordinates",
               "Range of intensities", 
               "Median of intensities",
               "Intensities > 0",
               "Number of empty spectra",
               "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 ###################################
################################################################################
################################################################################

Title = "Prediction"

#if str( $type_cond.type_method) == "training":
    #if str( $type_cond.method_cond.class_method) == "PLS":
        Title = "PLS"
    #elif str( $type_cond.method_cond.class_method) == "OPLS":
        Title = "OPLS"
    #elif str( $type_cond.method_cond.class_method) == "spatialShrunkenCentroids":
        Title = "SSC"
    #end if
#end if

pdf("classificationpdf.pdf", fonts = "Times", pointsize = 12)
plot(0,type='n',axes=FALSE,ann=FALSE)


title(main=paste0(Title," for file: \n\n", "$infile.display_name"))



##################### I) numbers and control plots #############################
###############################################################################

## table with values
grid.table(property_df, rows= NULL)

if (npeaks > 0){

opar <- par()
 
    ######################## II) Training #############################
    #############################################################################
    #if str( $type_cond.type_method) == "training":
        print("training")


        ## load y response (will be needed in every training scenario)

        #if str($type_cond.y_cond.y_vector) == "y_internal":
            y_vector = msidata\$$type_cond.y_cond.y_name
        #elif str($type_cond.y_cond.y_vector) == "y_external":
            y_tabular = read.delim("$type_cond.y_cond.y_data", header = FALSE, stringsAsFactors = FALSE)
            y_vector = as.factor(y_tabular[,$type_cond.y_cond.y_column])
            number_pixels = length(y_vector) ## should be same as in data
        #end if

    ## plot of y vector

    position_df = cbind(coord(msidata)[,1:2], y_vector)
    y_plot = ggplot(position_df, aes(x=x, y=y, fill=y_vector))+
           geom_tile() +
           coord_fixed()+
           ggtitle("Distribution of the response variable y")+
           theme_bw()+
           theme(text=element_text(family="ArialMT", face="bold", size=15))+
           theme(legend.position="bottom",legend.direction="vertical")+
           guides(fill=guide_legend(ncol=4,byrow=TRUE))
    coord_labels = aggregate(cbind(x,y)~y_vector, data=position_df, mean, na.rm=TRUE, na.action="na.pass")
    coord_labels\$file_number = gsub( "_.*$", "", coord_labels\$y_vector)
    print(y_plot)


        ######################## PLS #############################
        #if str( $type_cond.method_cond.class_method) == "PLS":
            print("PLS")

            ######################## PLS - CV #############################
            #if str( $type_cond.method_cond.analysis_cond.PLS_method) == "cvapply":
                print("PLS cv")

                ## folds
                #if str($type_cond.method_cond.analysis_cond.fold_cond.fold_vector) == "fold_internal":

                    fold_vector = msidata\$$type_cond.method_cond.analysis_cond.fold_cond.fold_name
                #elif str($type_cond.method_cond.analysis_cond.fold_cond.fold_vector) == "fold_external":
                    fold_tabular = read.delim("$type_cond.method_cond.analysis_cond.fold_cond.fold_data", header = FALSE, stringsAsFactors = FALSE)
                    fold_vector = as.factor(fold_tabular[,$type_cond.method_cond.analysis_cond.fold_cond.fold_column])
                    number_pixels = length(fold_vector) ## should be same as in data
                #end if

                ## plot of folds

                    position_df = cbind(coord(msidata)[,1:2], fold_vector)
                    fold_plot = ggplot(position_df, aes(x=x, y=y, fill=fold_vector))+
                           geom_tile() +
                           coord_fixed()+
                           ggtitle("Distribution of the fold variable")+
                           theme_bw()+
                           theme(text=element_text(family="ArialMT", face="bold", size=15))+
                           theme(legend.position="bottom",legend.direction="vertical")+
                           guides(fill=guide_legend(ncol=4,byrow=TRUE))
                    coord_labels = aggregate(cbind(x,y)~fold_vector, data=position_df, mean, na.rm=TRUE, na.action="na.pass")
                    coord_labels\$file_number = gsub( "_.*$", "", coord_labels\$fold_vector)
                    print(fold_plot)

                ## number of components
                components = c($type_cond.method_cond.analysis_cond.plscv_comp)

                ## PLS-cvApply:
                msidata.cv.pls <- cvApply(msidata, .y = y_vector, .fold = fold_vector, .fun = "PLS", ncomp = components)

                ## create table with summary
                count = 1
                summary_plscv = list()
                accuracy_vector = numeric()
                for (iteration in components){

                    summary_iteration = summary(msidata.cv.pls)\$accuracy[[paste0("ncomp = ", iteration)]]
                    summary_iteration = cbind(rownames(summary_iteration), summary_iteration) ## include rownames in table
                    accuracy_vector[count] = summary_iteration[1,2] ## vector with accuracies to find later maximum for plot
                    empty_row = c(paste0("ncomp = ", iteration), rep( "", length(levels(y_vector)))) ## add line with ncomp for each iteration
                    ##rownames(labeled_iteration)[1] = paste0("ncomp = ", iteration)
                    ##labeled_iteration = cbind(rownames(labeled_iteration), labeled_iteration)
                    labeled_iteration = rbind(empty_row, summary_iteration)

                    summary_plscv[[count]] = labeled_iteration
                    count = count+1} ## create list with summary table for each component
                ## create dataframe from list
                summary_plscv = do.call(rbind, summary_plscv) 
                summary_df = as.data.frame(summary_plscv)
                rownames(summary_df) = NULL

                ## plots
                ## plot to find ncomp with highest accuracy
                plot(summary(msidata.cv.pls), main="Accuracy of PLS classification")
                ncomp_max = components[which.max(accuracy_vector)] ## find ncomp with max. accuracy
                ## one image for each sample/fold, 4 images per page
                image(msidata.cv.pls, model = list(ncomp = ncomp_max), layout = c(2, 2))

                par(opar)   
                ## print table with summary in pdf
                plot(0,type='n',axes=FALSE,ann=FALSE)
                title(main="Summary for the different components\n", adj=0.5)
                ## summary for 4 components (20 rows) fits in one page:
                if (length(components)<5){
                    grid.table(summary_df, rows= NULL)
                }else{
                    grid.table(summary_df[1:20,], rows= NULL)
                    mincount = 21
                    maxcount = 40
                    for (count20 in 1:(ceiling(nrow(summary_df)/20)-1)){
                        plot(0,type='n',axes=FALSE,ann=FALSE)
                        if (maxcount <= nrow(summary_df)){
                            grid.table(summary_df[mincount:maxcount,], rows= NULL)
                            mincount = mincount+20
                            maxcount = maxcount+20
                        }else{### stop last page with last sample otherwise NA in table
                            grid.table(summary_df[mincount:nrow(summary_df),], rows= NULL)} 
                    }
                }

                ## optional output as .RData
                #if $output_rdata:
                save(msidata.cv.pls, file="$classification_rdata")
                #end if
            ######################## PLS - analysis ###########################
            #elif str( $type_cond.method_cond.analysis_cond.PLS_method) == "PLS_analysis":
                print("PLS analysis")

                ## number of components
                component = c($type_cond.method_cond.analysis_cond.pls_comp)

                ### pls analysis
                msidata.pls <- PLS(msidata, y = y_vector, ncomp = component, scale=$type_cond.method_cond.analysis_cond.pls_scale)

                ### plot of PLS coefficients
                plot(msidata.pls, main="PLS coefficients per m/z")

                ### summary table of PLS
                summary_table = summary(msidata.pls)\$accuracy[[paste0("ncomp = ",component)]]
                summary_table = cbind(rownames(summary_table), data.frame(summary_table))
                rownames(summary_table) = NULL
print(summary_table)
                ###plot(0,type='n',axes=FALSE,ann=FALSE)
                ###grid.table(test, rows= TRUE)

                ### image of the best m/z
                print(image(msidata, mz = topLabels(msidata.pls)[1,1], normalize.image = "linear", contrast.enhance = "histogram",smooth.image="gaussian", main="best m/z heatmap"))

                ## m/z and pixel information output
                pls_classes = data.frame(msidata.pls\$classes[[1]])
                rownames(pls_classes) = names(pixels(msidata))
                colnames(pls_classes) = "predicted diagnosis"
                pls_toplabels = topLabels(msidata.pls, n=$type_cond.method_cond.analysis_cond.pls_toplabels)

                write.table(pls_toplabels, file="$mzfeatures", quote = FALSE, row.names = TRUE, col.names=NA, sep = "\t")
                write.table(pls_classes, file="$pixeloutput", quote = FALSE, row.names = TRUE, col.names=NA, sep = "\t")

                ## optional output as .RData
                #if $output_rdata:
                save(msidata.pls, file="$classification_rdata")
                #end if

            #end if


        ######################## OPLS #############################
        #elif str( $type_cond.method_cond.class_method) == "OPLS":
            print("OPLS")

            ######################## OPLS -CV #############################
            #if str( $type_cond.method_cond.opls_analysis_cond.opls_method) == "opls_cvapply":
                print("OPLS cv")

                ## folds
                #if str($type_cond.method_cond.opls_analysis_cond.opls_fold_cond.opls_fold_vector) == "opls_fold_internal":
                    fold_vector = msidata\$$type_cond.method_cond.opls_analysis_cond.opls_fold_cond.opls_fold_name
                #elif str($type_cond.method_cond.opls_analysis_cond.opls_fold_cond.opls_fold_vector) == "opls_fold_external":
                    fold_tabular = read.delim("$type_cond.method_cond.opls_analysis_cond.opls_fold_cond.opls_fold_data", header = FALSE, stringsAsFactors = FALSE)
                    fold_vector = as.factor(fold_tabular[,$type_cond.method_cond.opls_analysis_cond.opls_fold_cond.opls_fold_column])
                    number_pixels = length(fold_vector) ## should be same as in data
                #end if

                ## plot of folds

                position_df = cbind(coord(msidata)[,1:2], fold_vector)
                fold_plot = ggplot(position_df, aes(x=x, y=y, fill=fold_vector))+
                       geom_tile() +
                       coord_fixed()+
                       ggtitle("Distribution of the fold variable")+
                       theme_bw()+
                       theme(text=element_text(family="ArialMT", face="bold", size=15))+
                       theme(legend.position="bottom",legend.direction="vertical")+
                       guides(fill=guide_legend(ncol=4,byrow=TRUE))
                coord_labels = aggregate(cbind(x,y)~fold_vector, data=position_df, mean, na.rm=TRUE, na.action="na.pass")
                coord_labels\$file_number = gsub( "_.*$", "", coord_labels\$fold_vector)
                print(fold_plot)

                ## number of components
                components = c($type_cond.method_cond.opls_analysis_cond.opls_cvcomp)

                ## OPLS-cvApply:
                msidata.cv.opls <- cvApply(msidata, .y = y_vector, .fold = fold_vector, .fun = "OPLS", ncomp = components, keep.Xnew = $type_cond.method_cond.opls_analysis_cond.xnew_cv)

                ## create table with summary
                count = 1
                summary_oplscv = list()
                accuracy_vector = numeric()
                for (iteration in components){
                    summary_iteration = summary(msidata.cv.opls)\$accuracy[[paste0("ncomp = ", iteration)]]
                    summary_iteration = cbind(rownames(summary_iteration), summary_iteration) ## include rownames in table
                    accuracy_vector[count] = summary_iteration[1,2] ## vector with accuracies to find later maximum for plot
                    empty_row = c(paste0("ncomp = ", iteration), rep( "", length(levels(y_vector)))) ## add line with ncomp for each iteration
                    ##rownames(labeled_iteration)[1] = paste0("ncomp = ", iteration)
                    ##labeled_iteration = cbind(rownames(labeled_iteration), labeled_iteration)
                    labeled_iteration = rbind(empty_row, summary_iteration)
                    summary_oplscv[[count]] = labeled_iteration ## create list with summary table for each component
                    count = count+1} 
                ## create dataframe from list
                summary_oplscv = do.call(rbind, summary_oplscv) 
                summary_df = as.data.frame(summary_oplscv)
                rownames(summary_df) = NULL

                ## plots
                ## plot to find ncomp with highest accuracy
                plot(summary(msidata.cv.opls), main="Accuracy of OPLS classification")
                ncomp_max = components[which.max(accuracy_vector)] ## find ncomp with max. accuracy
                ## one image for each sample/fold, 4 images per page
                image(msidata.cv.opls, model = list(ncomp = ncomp_max), layout = c(2, 2))

                par(opar)   
                ## print table with summary in pdf
                plot(0,type='n',axes=FALSE,ann=FALSE)
                title(main="Summary for the different components\n", adj=0.5)
                ## summary for 4 components (20 rows) fits in one page:
                if (length(components)<5){
                    grid.table(summary_df, rows= NULL)
                }else{
                    grid.table(summary_df[1:20,], rows= NULL)
                    mincount = 21
                    maxcount = 40
                    for (count20 in 1:(ceiling(nrow(summary_df)/20)-1)){
                        plot(0,type='n',axes=FALSE,ann=FALSE)
                        if (maxcount <= nrow(summary_df)){
                            grid.table(summary_df[mincount:maxcount,], rows= NULL)
                            mincount = mincount+20
                            maxcount = maxcount+20
                        }else{### stop last page with last sample otherwise NA in table
                            grid.table(summary_df[mincount:nrow(summary_df),], rows= NULL)} 
                    }
                }

                ## optional output as .RData
                #if $output_rdata:
                save(msidata.cv.opls, file="$classification_rdata")
                #end if

            ######################## OPLS -analysis ###########################
            #elif str( $type_cond.method_cond.opls_analysis_cond.opls_method) == "opls_analysis":
                print("OPLS analysis")

                ## number of components
                component = c($type_cond.method_cond.opls_analysis_cond.opls_comp)

                ### opls analysis
                msidata.opls <- PLS(msidata, y = y_vector, ncomp = component, scale=$type_cond.method_cond.opls_analysis_cond.opls_scale, keep.Xnew = $type_cond.method_cond.opls_analysis_cond.xnew)

                ### plot of OPLS coefficients
                plot(msidata.opls, main="OPLS coefficients per m/z")

                ### summary table of OPLS
                summary_table = summary(msidata.opls)\$accuracy[[paste0("ncomp = ",component)]]
                summary_table = cbind(rownames(summary_table), summary_table)
                rownames(summary_table) = NULL
                summary_table = data.frame(summary_table)
                print(summary_table)
                ###plot(0,type='n',axes=FALSE,ann=FALSE)
                ###grid.table(test, rows= TRUE)

                ### image of the best m/z
                print(image(msidata, mz = topLabels(msidata.opls)[1,1], normalize.image = "linear", contrast.enhance = "histogram",smooth.image="gaussian", main="best m/z heatmap"))

                ## m/z and pixel information output
                opls_classes = data.frame(msidata.opls\$classes[[1]])
                rownames(opls_classes) = names(pixels(msidata))
                colnames(opls_classes) = "predicted diagnosis"
                opls_toplabels = topLabels(msidata.opls, n=$type_cond.method_cond.opls_analysis_cond.opls_toplabels)

                write.table(opls_toplabels, file="$mzfeatures", quote = FALSE, row.names = TRUE, col.names=NA, sep = "\t")
                write.table(opls_classes, file="$pixeloutput", quote = FALSE, row.names = TRUE, col.names=NA, sep = "\t")

                ## optional output as .RData
                #if $output_rdata:
                save(msidata.opls, file="$classification_rdata")
                #end if

            #end if

        ######################## SSC #############################
        #elif str( $type_cond.method_cond.class_method) == "spatialShrunkenCentroids":
            print("SSC")

            ######################## SSC - CV #############################
            #if str( $type_cond.method_cond.ssc_analysis_cond.ssc_method) == "ssc_cvapply":
                print("SSC cv")

                ## folds
                #if str($type_cond.method_cond.ssc_analysis_cond.ssc_fold_cond.ssc_fold_vector) == "ssc_fold_internal":
                    fold_vector = msidata\$$type_cond.method_cond.ssc_analysis_cond.ssc_fold_cond.ssc_fold_name

                #elif str($type_cond.method_cond.ssc_analysis_cond.ssc_fold_cond.ssc_fold_vector) == "ssc_fold_external":
                    fold_tabular = read.delim("$type_cond.method_cond.ssc_analysis_cond.ssc_fold_cond.ssc_fold_data", header = FALSE, stringsAsFactors = FALSE)
                    fold_vector = as.factor(fold_tabular[,$type_cond.method_cond.ssc_analysis_cond.ssc_fold_cond.ssc_fold_column])
                    number_pixels = length(fold_vector) ## should be same as in data
                #end if

                ## plot of folds
                position_df = cbind(coord(msidata)[,1:2], fold_vector)
                fold_plot = ggplot(position_df, aes(x=x, y=y, fill=fold_vector))+
                       geom_tile() +
                       coord_fixed()+
                       ggtitle("Distribution of the fold variable")+
                       theme_bw()+
                       theme(text=element_text(family="ArialMT", face="bold", size=15))+
                       theme(legend.position="bottom",legend.direction="vertical")+
                       guides(fill=guide_legend(ncol=4,byrow=TRUE))
                coord_labels = aggregate(cbind(x,y)~fold_vector, data=position_df, mean, na.rm=TRUE, na.action="na.pass")
                coord_labels\$file_number = gsub( "_.*$", "", coord_labels\$fold_vector)
                print(fold_plot)

                ## SSC-cvApply:
                msidata.cv.ssc <- cvApply(msidata, .y = y_vector,.fold = fold_vector,.fun = "spatialShrunkenCentroids", r = c($type_cond.method_cond.ssc_r), s = c($type_cond.method_cond.ssc_s), method = "$type_cond.method_cond.ssc_kernel_method")

                ## create table with summary
                count = 1
                summary_ssccv = list()
                accuracy_vector = numeric()

                for (iteration in names(msidata.cv.ssc@resultData[[1]][,1])){
                    summary_iteration = summary(msidata.cv.ssc)\$accuracy[[iteration]]
                    summary_iteration = cbind(rownames(summary_iteration), summary_iteration) ## include rownames in table
                    accuracy_vector[count] = summary_iteration[1,2] ## vector with accuracies to find later maximum for plot
                    empty_row = c(iteration, rep( "", length(levels(y_vector)))) ## add line with ncomp for each iteration
                    labeled_iteration = rbind(empty_row, summary_iteration)
                    summary_ssccv[[count]] = labeled_iteration ## create list with summary table for each component
                    count = count+1
                }

                ##create dataframe from list
                summary_ssccv = do.call(rbind, summary_ssccv) 
                summary_df = as.data.frame(summary_ssccv)
                rownames(summary_df) = NULL

                ## plot to find parameters with highest accuracy
                plot(summary(msidata.cv.ssc), main="Accuracy of SSC classification")
                best_params = names(msidata.cv.ssc@resultData[[1]][,1])[which.max(accuracy_vector)] ## find parameters with max. accuracy
                r_value = as.numeric(substring(unlist(strsplit(best_params, ","))[1], 4))
                s_value = as.numeric(substring(unlist(strsplit(best_params, ","))[3], 5)) ## remove space

                image(msidata.cv.ssc, model = list( r = r_value, s = s_value ), layout=c(2,2))

                par(opar)
                ## print table with summary in pdf
                plot(0,type='n',axes=FALSE,ann=FALSE)
                title(main="Summary for the different parameters\n", adj=0.5)
                ## summary for 4 parameters (20 rows) fits in one page:
                if (length(names(msidata.cv.ssc@resultData[[1]][,1]))<5){
                    grid.table(summary_df, rows= NULL)
                }else{
                    grid.table(summary_df[1:20,], rows= NULL)
                    mincount = 21
                    maxcount = 40
                    for (count20 in 1:(ceiling(nrow(summary_df)/20)-1)){
                        plot(0,type='n',axes=FALSE,ann=FALSE)
                        if (maxcount <= nrow(summary_df)){
                            grid.table(summary_df[mincount:maxcount,], rows= NULL)
                            mincount = mincount+20
                            maxcount = maxcount+20
                        }else{### stop last page with last sample otherwise NA in table
                            grid.table(summary_df[mincount:nrow(summary_df),], rows= NULL)} 
                    }
                }

                ## optional output as .RData
                #if $output_rdata:
                save(msidata.cv.opls, file="$classification_rdata")
                #end if

            ######################## SSC -analysis ###########################
            #elif str( $type_cond.method_cond.ssc_analysis_cond.ssc_method) == "ssc_analysis":
                print("SSC analysis")

                ## SSC analysis
                msidata.ssc <- spatialShrunkenCentroids(msidata, y = y_vector, .fold = fold_vector, 
r = c($type_cond.method_cond.ssc_r), s = c($type_cond.method_cond.ssc_s), method = "$type_cond.method_cond.ssc_kernel_method")

                plot(msidata.ssc, mode = "tstatistics", model = list("r" = c($type_cond.method_cond.ssc_r), "s" = c($type_cond.method_cond.ssc_s)))

                ### summary table SSC

                ##summary(msidata.ssc)\$accuracy[[names(msidata.ssc@resultData)]]
                summary_table = summary(msidata.ssc)
print(summary_table)
                ##summary_table = cbind(rownames(summary_table), summary_table)
                ##rownames(summary_table) = NULL

                ###plot(0,type='n',axes=FALSE,ann=FALSE)
                ###grid.table(summary_table, rows= TRUE)

                ### image of the best m/z
                print(image(msidata, mz = topLabels(msidata.ssc)[1,1], normalize.image = "linear", contrast.enhance = "histogram",smooth.image="gaussian", main="best m/z heatmap"))

                ## m/z and pixel information output
                ssc_classes = data.frame(msidata.ssc\$classes[[1]])
                rownames(ssc_classes) = names(pixels(msidata))
                colnames(ssc_classes) = "predicted diagnosis"
                ssc_toplabels = topLabels(msidata.ssc)

                write.table(ssc_toplabels, file="$mzfeatures", quote = FALSE, row.names = TRUE, col.names=NA, sep = "\t")
                write.table(ssc_classes, file="$pixeloutput", quote = FALSE, row.names = TRUE, col.names=NA, sep = "\t")

                ## optional output as .RData
                #if $output_rdata:
                save(msidata.ssc, file="$classification_rdata")
                #end if

            #end if
        #end if


    ######################## II) Prediction #############################
    #############################################################################
    #elif str( $type_cond.type_method) == "prediction":
        print("prediction")

        #if str($type_cond.new_y.new_y_values) == "no_new_y": 
            new_y_vector = FALSE
        #elif str($type_cond.new_y.new_y_values) == "new_y_internal":
            new_y_vector = msidata\$$type_cond.new_y.new_y_name
        #elif str($type_cond.new_y.new_y_values) == "new_y_external":
            
            new_y_tabular = read.delim("$type_cond.new_y.new_y_data", header = FALSE, stringsAsFactors = FALSE)
            new_y_vector = new_y_tabular[,$type_cond.new_y.new_y_column]
            number_pixels = length(new_y_vector) ## should be same as in data
        #end if

        training_data = loadRData("$type_cond.training_result")
        prediction = predict(training_data,msidata, newy = new_y_vector)

        ## optional output as .RData
        #if $output_rdata:
        msidata = prediction
        save(msidata, file="$classification_rdata")
        #end if
    #end if

    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>

        <conditional name="type_cond">
            <param name="type_method" type="select" label="Analysis step to perform">
                <option value="training" selected="True">training</option>
                <option value="prediction">prediction</option>
            </param>
            <when value="training">

                <conditional name="method_cond">
                    <param name="class_method" type="select" label="Select the method for classification">
                        <option value="PLS" selected="True">PLS</option>
                        <option value="OPLS">OPLS</option>
                        <option value="spatialShrunkenCentroids">spatial shrunken centroids</option>
                    </param>
                    <when value="PLS">

                        <conditional name="analysis_cond">
                            <param name="PLS_method" type="select" label="Crossvalidation or analysis">
                                <option value="cvapply" selected="True">cvApply</option>
                                <option value="PLS_analysis">PLS analysis</option>
                            </param>
                            <when value="cvapply">

                                <param name="plscv_comp" type="text" value="1:2"
                                       label="The number of PLS components" help="Multiple values are allowed (e.g. 1,2,3 or 2:5)"/>
                                <conditional name="fold_cond">
                                    <param name="fold_vector" type="select" label="Define the fold variable">
                                        <option value="fold_internal" selected="True">dataset contains already fold</option>
                                        <option value="fold_external">use fold from tabular file</option>
                                    </param>
                                    <when value="fold_internal">
                                        <param name="fold_name" type="text" value="sample" label="Name of the pData slot where fold is stored" help="each fold must contain pixels of all categories"/>
                                    </when>
                                    <when value="fold_external">
                                        <param name="fold_data" type="data" format="tabular" label="Tabular file with column for folds" help="Number of rows must be number of pixels"/>
                                        <param name="fold_column" data_ref="fold_data" label="Column with folds" type="data_column"/>
                                    </when>
                                </conditional>
                            </when>

                            <when value="PLS_analysis">
                                <param name="pls_comp" type="integer" value="5"
                                       label="The optimal number of PLS components as indicated by cross-validations" help="Run cvApply first to optain optiaml number of PLS components"/>
                                <param name="pls_scale" type="boolean" display="radio" label="data scaling" truevalue="TRUE" falsevalue="FALSE"/>
                                <param name="pls_toplabels" type="integer" value="100"
                                   label="Number of toplabels (masses) which should be written in tabular output"/>
                            </when>
                        </conditional>
                    </when>

                    <when value="OPLS">

                        <conditional name="opls_analysis_cond">
                            <param name="opls_method" type="select" label="Analysis step to perform">
                                <option value="opls_cvapply" selected="True">cvApply</option>
                                <option value="opls_analysis">OPLS analysis</option>
                            </param>

                            <when value="opls_cvapply">
                                <param name="opls_cvcomp" type="text" value="1:2"
                                       label="The number of OPLS components" help="Multiple values are allowed (e.g. 1,2,3 or 2:5)"/>
                                <param name="xnew_cv" type="boolean" display="radio" truevalue="TRUE" falsevalue="FALSE" label="Keep new matrix"/>
                                <conditional name="opls_fold_cond">
                                    <param name="opls_fold_vector" type="select" label="Define the fold variable">
                                        <option value="opls_fold_internal" selected="True">dataset contains already fold</option>
                                        <option value="opls_fold_external">use fold from tabular file</option>
                                    </param>
                                    <when value="opls_fold_internal">
                                        <param name="opls_fold_name" type="text" value="sample" label="Name of the pData slot where fold is stored" help="each fold must contain pixels of all categories"/>
                                    </when>
                                    <when value="opls_fold_external">
                                        <param name="opls_fold_data" type="data" format="tabular" label="Tabular file with column for folds" help="Number of rows must be number of pixels"/>
                                        <param name="opls_fold_column" data_ref="opls_fold_data" label="Column with folds" type="data_column"/>
                                    </when>
                                </conditional>
                            </when>

                            <when value="opls_analysis">
                                <param name="opls_comp" type="integer" value="5"
                                       label="The optimal number of PLS components as indicated by cross-validations" help="Run cvApply first to optain optiaml number of PLS components"/>
                                <param name="xnew" type="boolean" display="radio" truevalue="TRUE" falsevalue="FALSE" label="Keep new matrix"/>                                
                                <param name="opls_scale" type="select" label="data scaling" display="radio" optional="False">
                                    <option value="TRUE">yes</option>
                                    <option value="FALSE" selected="True">no</option>
                               </param>
                                <param name="opls_toplabels" type="integer" value="100"
                                   label="Number of toplabels (features) which should be written in tabular output"/>
                            </when>
                        </conditional>
                    </when>

                    <when value="spatialShrunkenCentroids">
                        <conditional name="ssc_analysis_cond">
                            <param name="ssc_method" type="select" label="Analysis step to perform">
                                <option value="ssc_cvapply" selected="True">cvApply</option>
                                <option value="ssc_analysis">spatial shrunken centroids analysis</option>
                            </param>
                            <when value="ssc_cvapply">

                                <conditional name="ssc_fold_cond">
                                    <param name="ssc_fold_vector" type="select" label="Define the fold variable">
                                        <option value="ssc_fold_internal" selected="True">dataset contains already fold</option>
                                        <option value="ssc_fold_external">use fold from tabular file</option>
                                    </param>
                                    <when value="ssc_fold_internal">
                                        <param name="ssc_fold_name" type="text" value="sample" label="Name of the pData slot where fold is stored" help="each fold must contain pixels of all categories"/>
                                    </when>
                                    <when value="ssc_fold_external">
                                        <param name="ssc_fold_data" type="data" format="tabular" label="Tabular file with column for folds" help="Number of rows must be number of pixels"/>
                                        <param name="ssc_fold_column" data_ref="ssc_fold_data" label="Column with folds" type="data_column"/>
                                    </when>
                                </conditional>
                            </when>

                            <when value="ssc_analysis">

                                <param name="ssc_toplabels" type="integer" value="100"
                                   label="Number of toplabels (features) which should be written in tabular output"/>
                            </when>
                        </conditional>
                        <param name="ssc_r" type="text" value="2"
                               label="The spatial neighborhood radius of nearby pixels to consider (r)" help="For cvapply multiple values are allowed (e.g. 1,2,3 or 2:5)"/>
                        <param name="ssc_s" type="text" value="2"
                               label="The sparsity thresholding parameter by which to shrink the t-statistics (s)" help="For cvapply multiple values are allowed (e.g. 1,2,3 or 2:5)"/>
                        <param name="ssc_kernel_method" type="select" display="radio" label = "The method to use to calculate the spatial smoothing kernels for the embedding. The 'gaussian' method refers to spatially-aware (SA) weights, and 'adaptive' refers to spatially-aware structurally-adaptive (SASA) weights">
                            <option value="gaussian">gaussian</option>
                            <option value="adaptive" selected="True">adaptive</option>
                        </param>

                    </when>
                </conditional>
                <conditional name="y_cond">
                    <param name="y_vector" type="select" label="Define the response variable y">
                        <option value="y_internal" selected="True">dataset contains already y</option>
                        <option value="y_external">use y from tabular file</option>
                    </param>
                    <when value="y_internal">
                        <param name="y_name" type="text" value="combined_sample" label="Name of the pData slot where y is stored" help="Outputs of MSI_combine tool have 'combined_sample' as name"/>
                    </when>
                    <when value="y_external">
                        <param name="y_data" type="data" format="tabular" label="Tabular file with column for y response"/>
                        <param name="y_column" data_ref="y_data" label="Column with y response" type="data_column"/>
                    </when>
                </conditional>
            </when>

            <when value="prediction">
                <param name="training_result" type="data" format="rdata" label="Result from previous classification training"/>
                <conditional name="new_y">
                    <param name="new_y_values" type="select" label="Define the new response y">
                        <option value="no_new_y" >no new y response</option>
                        <option value="new_y_internal" selected="True">dataset contains already y</option>
                        <option value="new_y_external">use y from tabular file</option>
                    </param>
                    <when value="no_new_y"/>
                    <when value="new_y_internal">
                        <param name="new_y_name" type="text" value="combined_sample" label="Name of the pData slot where y is stored" help="data merged with MSI_combine tool has 'combined_sample' as name"/>
                    </when>

                    <when value="new_y_external">
                        <param name="new_y_data" type="data" format="tabular" label="Tabular file with column for y response"/>
                        <param name="new_y_column" data_ref="new_y_data" label="Column with y response" type="data_column"/>
                    </when>
                </conditional>
            </when>
        </conditional>
        <param name="output_rdata" type="boolean" display="radio" label="Results as .RData output"/>
    </inputs>
    <outputs>
        <data format="pdf" name="classification_images" from_work_dir="classificationpdf.pdf" label = "$infile.display_name classification"/>
        <data format="tabular" name="mzfeatures" label="$infile.display_name features"/>
        <data format="tabular" name="pixeloutput" label="$infile.display_name pixels"/>
        <data format="rdata" name="classification_rdata" label="$infile.display_name classification">
            <filter>output_rdata</filter>
        </data>
    </outputs>
    <tests>
        <test expect_num_outputs="3">
            <param name="infile" value="testfile_squares.rdata" ftype="rdata"/>
            <conditional name="type_cond">
                <param name="type_method" value="training"/>
                <conditional name="method_cond">
                    <param name="class_method" value="PLS"/>
                    <conditional name="analysis_cond">
                        <param name="PLS_method" value="cvapply"/>

                        <param name="plscv_comp" value="2:4"/>
                        <conditional name="fold_cond">
                            <param name="fold_vector" value="fold_external"/>
                            <param name="fold_data" value="pixel_annotation_file1.tabular" ftype="tabular"/>
                            <param name="fold_column" value="1"/>
                        </conditional>

                    </conditional>
                </conditional>
                <conditional name="y_cond">
                    <param name="y_vector" value="y_external"/>
                    <param name="y_data" value="pixel_annotation_file1.tabular" ftype="tabular"/>
                    <param name="y_column" value="2"/>
                </conditional>
            </conditional>
            <output name="mzfeatures" file="features_test1.tabular"/>
            <output name="pixeloutput" file="pixels_test1.tabular"/>
            <output name="classification_images" file="test1.pdf" compare="sim_size" delta="20000"/>
        </test>

        <test expect_num_outputs="4">
            <param name="infile" value="testfile_squares.rdata" ftype="rdata"/>
            <conditional name="type_cond">
                <param name="type_method" value="training"/>
                <conditional name="method_cond">
                    <param name="class_method" value="PLS"/>
                    <conditional name="analysis_cond">
                        <param name="PLS_method" value="PLS_analysis"/>

                        <param name="pls_comp" value="2"/>
                        <param name="pls_scale" value="TRUE"/>
                        <param name="pls_toplabels" value="100"/>
                        <conditional name="fold_cond">
                            <param name="fold_vector" value="fold_external"/>
                            <param name="fold_data" value="pixel_annotation_file1.tabular" ftype="tabular"/>
                            <param name="fold_column" value="1"/>
                        </conditional>

                    </conditional>
                </conditional>
                <conditional name="y_cond">
                    <param name="y_vector" value="y_external"/>
                    <param name="y_data" value="pixel_annotation_file1.tabular" ftype="tabular"/>
                    <param name="y_column" value="2"/>
                </conditional>
            </conditional>
            <param name="output_rdata" value="True"/>
            <output name="mzfeatures" file="features_test2.tabular"/>
            <output name="pixeloutput" file="pixels_test2.tabular"/>
            <output name="classification_images" file="test2.pdf" compare="sim_size" delta="20000"/>
            <output name="classification_rdata" file="test2.rdata" compare="sim_size" />
        </test>

        <test expect_num_outputs="3">
            <param name="infile" value="testfile_squares.rdata" ftype="rdata"/>
            <conditional name="type_cond">
                <param name="type_method" value="training"/>
                <conditional name="method_cond">
                    <param name="class_method" value="OPLS"/>
                    <conditional name="opls_analysis_cond">
                        <param name="opls_method" value="opls_analysis"/>

                        <param name="opls_cvcomp" value="1:2"/>
                        <param name="xnew_cv" value="FALSE"/>
                        <conditional name="opls_fold_cond">
                            <param name="opls_fold_vector" value="opls_fold_external"/>
                            <param name="opls_fold_data" ftype="tabular" value="random_factors.tabular"/>
                            <param name="opls_fold_column" value="1"/>
                        </conditional>
                    </conditional>
                </conditional>
                <conditional name="y_cond">
                    <param name="y_vector" value="y_external"/>
                    <param name="y_data" value="random_factors.tabular" ftype="tabular"/>
                    <param name="y_column" value="2"/>
                </conditional>
            </conditional>
            <output name="mzfeatures" file="features_test3.tabular"/>
            <output name="pixeloutput" file="pixels_test3.tabular"/>
            <output name="classification_images" file="test3.pdf" compare="sim_size" delta="20000"/>
        </test>

        <test expect_num_outputs="4">
            <param name="infile" value="testfile_squares.rdata" ftype="rdata"/>
            <conditional name="type_cond">
                <param name="type_method" value="training"/>
                <conditional name="method_cond">
                    <param name="class_method" value="OPLS"/>
                    <conditional name="opls_analysis_cond">

                        <param name="opls_method" value="opls_analysis"/>
                        <param name="opls_comp" value="3"/>
                        <param name="xnew" value="FALSE"/>
                        <param name="opls_scale" value="FALSE"/>
                        <param name="opls_toplabels" value="100"/>
                    </conditional>

                </conditional>
                <conditional name="y_cond">
                    <param name="y_vector" value="y_external"/>
                    <param name="y_data" value="random_factors.tabular" ftype="tabular"/>
                    <param name="y_column" value="2"/>
                </conditional>
            </conditional>
            <param name="output_rdata" value="True"/>
            <output name="mzfeatures" file="features_test4.tabular"/>
            <output name="pixeloutput" file="pixels_test4.tabular"/>
            <output name="classification_images" file="test4.pdf" compare="sim_size" delta="20000"/>
            <output name="classification_rdata" file="test4.rdata" compare="sim_size" />
        </test>

        <test expect_num_outputs="3">
            <param name="infile" value="testfile_squares.rdata" ftype="rdata"/>
            <conditional name="type_cond">
                <param name="type_method" value="training"/>
                <conditional name="method_cond">
                    <param name="class_method" value="spatialShrunkenCentroids"/>
                    <conditional name="ssc_analysis_cond">
                        <param name="ssc_method" value="ssc_cvapply"/>
                        <conditional name="ssc_fold_cond">
                            <param name="ssc_fold_vector" value="ssc_fold_external"/>
                            <param name="ssc_fold_data" value="pixel_annotation_file1.tabular" ftype="tabular"/>
                            <param name="ssc_fold_column" value="1"/>
                        </conditional>
                        <param name="ssc_r" value="1:2"/>
                        <param name="ssc_s" value="2:3"/>
                        <param name="ssc_kernel_method" value="adaptive"/>
                    </conditional>
                </conditional>
                <conditional name="y_cond">
                    <param name="y_vector" value="y_external"/>
                    <param name="y_data" value="pixel_annotation_file1.tabular" ftype="tabular"/>
                    <param name="y_column" value="2"/>
                </conditional>
            </conditional>
            <output name="mzfeatures" file="features_test5.tabular"/>
            <output name="pixeloutput" file="pixels_test5.tabular"/>
            <output name="classification_images" file="test5.pdf" compare="sim_size" delta="20000"/>
        </test>

        <test expect_num_outputs="4">
            <param name="infile" value="testfile_squares.rdata" ftype="rdata"/>
            <conditional name="type_cond">
                <param name="type_method" value="training"/>
                <conditional name="method_cond">
                    <param name="class_method" value="spatialShrunkenCentroids"/>
                    <conditional name="ssc_analysis_cond">
                        <param name="ssc_method" value="ssc_analysis"/>
                        <param name="ssc_toplabels" value="100"/>
                     </conditional>
                    <param name="ssc_r" value="2"/>
                    <param name="ssc_s" value="2"/>
                    <param name="ssc_kernel_method" value="adaptive"/>
                </conditional>
                <conditional name="y_cond">
                    <param name="y_vector" value="y_external"/>
                    <param name="y_data" value="random_factors.tabular" ftype="tabular"/>
                    <param name="y_column" value="2"/>
                </conditional>
            </conditional>
            <param name="output_rdata" value="True"/>
            <output name="mzfeatures" file="features_test6.tabular"/>
            <output name="pixeloutput" file="pixels_test6.tabular"/>
            <output name="classification_images" file="test6.pdf" compare="sim_size" delta="20000"/>
            <output name="classification_rdata" file="test6.rdata" compare="sim_size" />
        </test>

        <test expect_num_outputs="4">
            <param name="infile" value="testfile_squares.rdata" ftype="rdata"/>
            <conditional name="type_cond">
                <param name="type_method" value="prediction"/>
                <param name="training_result" value="test2.rdata" ftype="rdata"/>
                <conditional name="new_y">
                    <param name="new_y_values" value="new_y_external"/>
                    <param name="new_y_data" value="pixel_annotation_file1.tabular" ftype="tabular"/>
                        <param name="new_y_column" value="2"/>
                </conditional>
            </conditional>
            <param name="output_rdata" value="True"/>
            <output name="mzfeatures" file="features_test7.tabular"/>
            <output name="pixeloutput" file="pixels_test7.tabular"/>
            <output name="classification_images" file="test7.pdf" compare="sim_size" delta="20000"/>
            <output name="classification_rdata" file="test7.rdata" compare="sim_size" />
        </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 provides three different Cardinal functions for supervised classification 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: 

- PLS(-DA): partial least square (discriminant analysis)
- O-PLS(-DA): Orthogonal partial least squares (discriminant analysis)
- Spatial shrunken centroids

Output: 

- Pdf with the heatmaps and plots for the classification
- Tabular file with information on masses and pixels: toplabels/classes (PLS, spatial shrunken centroids)
- optional RData output to further explore the results with Cardinal in R

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