changeset 0:d79569f269c7 draft

planemo upload
author mingchen0919
date Fri, 23 Mar 2018 01:53:24 -0400
parents
children ddc3c3527f49
files LICENSE README.md dynamic_tool.Rmd dynamic_tool.xml dynamic_tool_render.R dynamic_tool_wrappers_macros.xml
diffstat 6 files changed, 475 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LICENSE	Fri Mar 23 01:53:24 2018 -0400
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Staton Laboratory
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md	Fri Mar 23 01:53:24 2018 -0400
@@ -0,0 +1,116 @@
+# Dynamic Galaxy Tool wrappers
+
+Use this repository as a template to develop a dynamic Galaxy tools in one minute!
+
+## Step 1: clone this repository
+
+```bash
+git clone https://github.com/statonlab/dynamic-galaxy-tool-wrappers.git
+``` 
+
+## Step 2: edit tool requirements
+
+Open the `dynamic_tool_wrappers_macros.xml` file and add your tool requirements. **Only tools from the 
+[conda repository](https://anaconda.org/anaconda/repo) can be added as a tool requirement. For example, for a wrapper
+of the **FastQC** tool, go to [https://anaconda.org/anaconda/repo](https://anaconda.org/anaconda/repo) and search for
+`fastqc`. You will get a list of `fastqc` tools. Find the appropriate version and add it as a tool requirement.
+
+Before editing tool requirement:
+
+```xml
+    <xml name="rmarkdown_requirements">
+        <requirement type="package" version="1.15.0.6-0">pandoc</requirement>
+        <requirement type="package" version="1.6">r-rmarkdown</requirement>
+    </xml>
+```
+
+After editing tool requirement:
+
+```xml
+    <xml name="rmarkdown_requirements">
+        <requirement type="package" version="1.15.0.6-0">pandoc</requirement>
+        <requirement type="package" version="1.6">r-rmarkdown</requirement>
+        <requirement type="package" version="0.11.7">fastqc</requirement>
+    </xml>
+```
+
+
+
+## Step 3: edit template for a specific command line tool
+
+Open the `dynamic_tool_wrappers_macros.xml` file and replace `tool_name` in 
+`<option value="tool_name" selected="false">tool_name</option>` with a valid command line tool name.
+
+```xml
+    <xml name="tool_name">
+        <param type="select" name="tool_name" multiple="false" label="Tool name">
+            <option value="tool_name" selected="false">tool_name</option>
+        </param>
+    </xml>
+```
+
+Use the **FastQC** tool as an example again, the content after replacement would be
+
+```xml
+    <xml name="tool_name">
+        <param type="select" name="tool_name" multiple="false" label="Tool name">
+            <option value="fastqc" selected="false">fastqc</option>
+        </param>
+    </xml>
+```
+
+You can add multiple `tool_name` options if the tool has sub command line tools. For example, 
+for the `samtools` tool, it could be
+
+```xml
+    <xml name="tool_name">
+        <param type="select" name="tool_name" multiple="false" label="Tool name">
+            <option value="samtools view" selected="false">samtols view</option>
+            <option value="samtools sort" selected="false">samtols sort</option>
+            <option value="samtools index" selected="false">samtols index</option>
+        </param>
+    </xml>
+```
+
+## Step 4: edit **tool name** and **tool id** in `dynamic_tool.xml`
+
+Open the `dynamic_tool.xml` file and replace `dynamic_tool` with an appropriate **tool id** and the `dynamic tool` with
+an appropriate **tool name**.
+
+```xml
+<tool id="dynamic_tool" name="dynamic tool" version="1.0.0">
+```
+
+Use the **FastQC** tool as an example, it could be:
+
+```xml
+<tool id="dynamic_fastqc" name="Dynamic FastQC" version="1.0.0">
+```
+
+## Step 5: Publish tool to [ToolShed](https://toolshed.g2.bx.psu.edu/) or [Test ToolShed](https://testtoolshed.g2.bx.psu.edu/)
+
+Please check [planemo's documentation site](http://planemo.readthedocs.io/en/latest/publishing.html) for more details.
+
+* Within the tool directory, `planemo shed_init` command can be used to bootstrap a `.shed.yml` file.
+
+```bash
+planemo shed_init --name=<name>
+                  --owner=<shed_username>
+                  --description=<short description>
+                  [--remote_repository_url=<URL to .shed.yml on github>]
+                  [--homepage_url=<Homepage for tool.>]
+                  [--long_description=<long description>]
+                  [--category=<category name>]*
+```
+
+* **Create tool repository on ToolShed or Test ToolShed**
+
+```bash
+planemo shed_create --shed_target testtoolshed
+```
+
+* **Update a tool repository**
+
+```bash
+planemo shed_diff --shed_target testtoolshed
+```
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dynamic_tool.Rmd	Fri Mar 23 01:53:24 2018 -0400
@@ -0,0 +1,97 @@
+---
+title: 'Dynamic tool'
+output: html_document
+---
+
+```{r setup, include=FALSE, warning=FALSE, message=FALSE}
+knitr::opts_chunk$set(error = TRUE)
+```
+
+## User input
+
+```{r, echo=FALSE}
+##-------- build script files -----------
+
+# build script file: script.sh
+df = read.table(paste0(Sys.getenv('REPORT_FILES_PATH'), '/options_and_arguments.txt'), 
+                sep = '|', header = TRUE)
+
+# get tool name
+tool_name = df[df$type == 'tool_name', 'value']
+# build script for displaying help messages (this probably should be tool specific)
+write(paste0(tool_name, ' -h'), 
+        file = paste0(Sys.getenv('REPORT_FILES_PATH'), '/help.sh'))
+
+knitr::kable(df[, c('flag', 'value')])
+
+# if the number of option/argument pairs is larger than 0, build script file
+df2 = df[df$type != 'tool_name', ]
+if (nrow(df2) > 0) {
+  # write tool name as the first line of the script.sh
+  # before running the job, cd into the ${REPORT_FILES_PATH} directory
+  write(paste0(tool_name, ' \\'), 
+        paste0(Sys.getenv('REPORT_FILES_PATH'), '/script.sh'))
+  df2 = df[df$type != 'tool_name', ]
+  write(paste(' ', df2$flag, df2$value, '\\', sep = ' '), 
+        file = paste0(Sys.getenv('REPORT_FILES_PATH'), '/script.sh'), 
+        append = TRUE )
+  # remember that after writing option/argument lines to the script.sh, the last line
+  # has an extra newline character '\' which causes a problem. We can either remove that extra
+  # '\' or add a new line to the end. We choose to add a new line.
+  
+  # add an extra line to the end to redirect stdout to stdout.txt and stderr to stderr.txt
+  write('  > ${REPORT_FILES_PATH}/stdout.txt 2>${REPORT_FILES_PATH}/stderr.txt', 
+        paste0(Sys.getenv('REPORT_FILES_PATH'), '/script.sh'), append = TRUE)
+} else {
+  # if no option/argument input, simply display the help message
+  write(paste0(tool_name, ' -h'), 
+        file = paste0(Sys.getenv('REPORT_FILES_PATH'), '/script.sh'))
+}
+
+```
+
+
+```{bash, echo=FALSE}
+## code to open help documentation
+sh ${REPORT_FILES_PATH}/help.sh > ${TOOL_HELP_DOC}
+```
+
+```{bash, results='asis', echo=FALSE}
+echo '## Show help documentation'
+echo ''
+echo ''
+echo '```bash'
+cat ${REPORT_FILES_PATH}/help.sh
+echo '```'
+```
+
+
+```{bash, echo=FALSE}
+# run job script
+# it's important to run the job within the REPORT_FILES_PATH
+cd ${REPORT_FILES_PATH} && sh script.sh
+```
+
+```{bash, results='asis', echo=FALSE}
+echo '## Job script'
+echo ''
+echo ''
+echo '```bash'
+cat ${REPORT_FILES_PATH}/script.sh
+echo '```'
+```
+
+
+```{r, results='asis', echo=FALSE}
+cat('##All output files')
+cat('\n\n')
+all_files = list.files(path = Sys.getenv('REPORT_FILES_PATH'), 
+                       full.names = TRUE, 
+                       recursive = TRUE)
+
+for (f in sub(Sys.getenv('REPORT_FILES_PATH'), '.', all_files) ) {
+  cat('* [', f, '](', f, ')\n')
+}
+cat('\n')
+```
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dynamic_tool.xml	Fri Mar 23 01:53:24 2018 -0400
@@ -0,0 +1,27 @@
+<tool id="dynamic_STAR" name="Dynamic STAR" version="1.0.0">
+    <macros>
+        <import>dynamic_tool_wrappers_macros.xml</import>
+    </macros>
+    <description></description>
+    <requirements>
+        <expand macro="rmarkdown_requirements" />
+        <requirement type="package" version="0.11.7">fastqc</requirement>
+    </requirements>
+    <expand macro="stdio" />
+    <expand macro="shell_command" />
+    <inputs>
+        <expand macro="tool_name" />
+        <expand macro="option_argument_one_dataset" />
+        <expand macro="option_argument_multiple_datasets" />
+        <expand macro="option_argument_path_relative_to_upstream_tool" />
+        <expand macro="option_argument_string" />
+        <expand macro="option_argument_float" />
+        <expand macro="option_argument_integer" />
+    </inputs>
+    <outputs>
+        <expand macro="output_set" />
+    </outputs>
+    <citations>
+        <expand macro="citations" />
+    </citations>
+</tool>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dynamic_tool_render.R	Fri Mar 23 01:53:24 2018 -0400
@@ -0,0 +1,28 @@
+##============ Sink warnings and errors to a file ==============
+## use the sink() function to wrap all code within it.
+##==============================================================
+zz = file(Sys.getenv('TOOL_LOG'))
+sink(zz)
+sink(zz, type = 'message')
+
+#------------import libraries--------------------
+options(stringsAsFactors = FALSE)
+
+library(getopt)
+library(rmarkdown)
+#------------------------------------------------
+
+#------------------------------------------------
+options_and_arguments = read.table(paste0(Sys.getenv('REPORT_FILES_PATH'), '/options_and_arguments.txt'), 
+                                   sep = '|', header = TRUE)
+
+
+#-----------------render Rmd--------------
+render(paste0(Sys.getenv('TOOL_INSTALL_DIR'), '/dynamic_tool.Rmd'), 
+       output_file = Sys.getenv('REPORT'))
+#------------------------------------------
+
+
+##--------end of code rendering .Rmd templates----------------
+sink()
+##=========== End of sinking output=============================
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dynamic_tool_wrappers_macros.xml	Fri Mar 23 01:53:24 2018 -0400
@@ -0,0 +1,186 @@
+<macros>
+
+    <xml name="rmarkdown_requirements">
+        <requirement type="package" version="1.15.0.6-0">pandoc</requirement>
+        <requirement type="package" version="1.6">r-rmarkdown</requirement>
+        <requirement type="package" version="2.54a">star</requirement>
+    </xml>
+
+    <xml name="stdio">
+        <stdio>
+            <regex match="XXX" source="stderr" level="warning"
+                   description="Check the tool log output file for more details."/>
+        </stdio>
+    </xml>
+
+    <!--Tool name-->
+    <xml name="tool_name">
+        <param type="select" name="tool_name" multiple="false" label="Tool name">
+            <option value="STAR" selected="false">STAR</option>
+        </param>
+    </xml>
+
+    <!--OPTION/ARGUMENT PAIRS and INPUT types-->
+    <!--input files-->
+    <xml name="option_argument_one_dataset">
+        <repeat name="option_argument_one_dataset_repeat" title="OPTION and ARGUMENT: input one dataset" min="0" default="0">
+            <param type="text" name="flag" optional="true" label="flag" />
+            <param name="value" type="data" optional="true" multiple="false" label="value"/>
+        </repeat>
+    </xml>
+    <xml name="option_argument_multiple_datasets">
+        <repeat name="option_argument_multiple_datasets_repeat" title="OPTION and ARGUMENT: input multiple datasets" min="0" default="0">
+            <param type="text" name="flag" optional="true" label="flag" />
+            <param name="value" type="data" optional="true" multiple="true" label="value" />
+        </repeat>
+    </xml>
+    <xml name="option_argument_path_relative_to_upstream_tool">
+        <repeat name="option_argument_path_relative_to_upstream_tool_repeat" title="OPTION and ARGUMENT: path relative to upstream tool" min="0" default="0">
+            <param type="text" name="flag" optional="true" label="flag"  />
+            <param name="upstream_tool_output_dir" type="data" optional="true" multiple="false" label="upstream tool output directory"/>
+            <param type="text" name="value" optional="true" label="value"  />
+        </repeat>
+    </xml>
+
+    <!--input values: string, float and integer-->
+    <xml name="option_argument_string">
+        <repeat name="option_argument_string_repeat" title="OPTION and ARGUMENT: input string" min="0" default="0">
+            <param type="text" name="flag" label="flag"  />
+            <param type="text" name="value"  label="value"  />
+        </repeat>
+    </xml>
+    <xml name="option_argument_float">
+        <repeat name="option_argument_float_repeat" title="OPTION and ARGUMENT: input float" min="0" default="0">
+            <param type="text" name="flag" label="flag"  />
+            <param type="text" name="value" label="value"  />
+        </repeat>
+    </xml>
+    <xml name="option_argument_integer">
+        <repeat name="option_argument_integer_repeat" title="OPTION and ARGUMENT: input integer" min="0" default="0">
+            <param type="text" name="flag" label="flag"  />
+            <param type="text" name="value"  label="value"  />
+        </repeat>
+    </xml>
+
+    <!--output set-->
+    <xml name="output_set">
+        <data format="html" name="report" label="${tool.name} report"/>
+        <data format="txt" name="tool_help_doc" label="${tool.name} help doc"/>
+        <data format="txt" name="tool_output_dir" label="${tool.name} output directory"/>
+        <data format="txt" name="tool_log" label="${tool.name} log" />
+    </xml>
+
+
+    <!--shell command fragment-->
+    <xml name="shell_command">
+        <command><![CDATA[
+
+        ############ first, create a directory to store all files
+        mkdir -p $report.files_path && cd $report.files_path &&
+
+
+        ############ save the tool installation directory to an environment variable
+        export TOOL_INSTALL_DIR='${__tool_directory__}' &&
+
+
+        #########################
+        ##
+        ## save user input option/argument pairs into a file
+        ##
+        #########################
+
+        ## first line will be the header
+        echo 'type|flag|value' > options_and_arguments.txt &&
+
+        ############ tool_name
+        ##-t '$tool_name'
+        echo "tool_name|tool_flag|${tool_name}" >> options_and_arguments.txt &&
+
+        ####################################################
+        ## loop through repeats to get option/argument pairs
+        ####################################################
+
+        ############ option_argument_one_dataset
+        #for i in $option_argument_one_dataset_repeat:
+            #set $item = 'one_dataset|' + str($i.flag) + "|" + str($i.value)
+            echo '$item' >> options_and_arguments.txt &&
+        #end for
+
+        ############ option_argument_multiple_datasets
+        #for i in $option_argument_multiple_datasets_repeat:
+            #set $item = 'multiple_datasets|' + str($i.flag) + "|" + str($i.value)
+            echo '$item' >> options_and_arguments.txt &&
+        #end for
+
+        ############ option_argument_path_relative_to_upstream_tool
+        #for i in $option_argument_path_relative_to_upstream_tool_repeat:
+             #set $item = 'path_relative_to_upstream_tool|' + str($i.flag) + "|" + str($i.value)
+             echo '$item' >> options_and_arguments.txt &&
+        #end for
+
+        ############ option_argument_string
+        #for i in $option_argument_string_repeat:
+             #set $item = 'string|' + str($i.flag) + "|" + str($i.value)
+             echo '$item' >> options_and_arguments.txt &&
+        #end for
+
+        ############ option_argument_float
+        #for i in $option_argument_float_repeat:
+             #set $item = 'float|' + str($i.flag) + "|" + str($i.value)
+             echo '$item' >> options_and_arguments.txt &&
+        #end for
+
+
+        ############ option_argument_integer
+        #for i in $option_argument_integer_repeat:
+             #set $item = 'integer|' + str($i.flag) + "|" + str($i.value)
+             echo '$item' >> options_and_arguments.txt &&
+        #end for
+
+
+        ############ output_set
+        ## '$report'
+        ## '$report.files_path'
+        ## '$tool_help_doc'
+        ## '$tool_output_dir'
+        ## '$tool_log'
+        #######################
+        export REPORT='$report' &&
+        export REPORT_FILES_PATH='$report.files_path' &&
+        export TOOL_HELP_DOC='$tool_help_doc' &&
+        export TOOL_OUTPUT_DIR='$tool_output_dir' &&
+        export TOOL_LOG='$tool_log' &&
+
+
+        ############ save tool files path to a tool output so that it can be accessed from galaxy history
+        echo '$report.files_path' > $tool_output_dir &&
+
+        ############ run render R script to render R markdowns
+        Rscript '${__tool_directory__}/dynamic_tool_render.R'
+
+        ]]></command>
+    </xml>
+
+    <!--tool citations-->
+    <xml name="citations">
+        <citation type="bibtex"><![CDATA[
+            @article{allaire2016rmarkdown,
+            title={rmarkdown: Dynamic Documents for R, 2016},
+            author={Allaire, J and Cheng, Joe and Xie, Yihui and McPherson, Jonathan and Chang, Winston and Allen, Jeff
+            and Wickham, Hadley and Atkins, Aron and Hyndman, Rob},
+            journal={R package version 0.9},
+            volume={6},
+            year={2016}
+            }
+        ]]></citation>
+        <citation type="bibtex"><![CDATA[
+            @book{xie2015dynamic,
+            title={Dynamic Documents with R and knitr},
+            author={Xie, Yihui},
+            volume={29},
+            year={2015},
+            publisher={CRC Press}
+            }
+        ]]></citation>
+    </xml>
+</macros>
\ No newline at end of file