Mercurial > repos > mingchen0919 > dynamic_star
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