changeset 0:60609a9cef3b draft

Uploaded
author crs4
date Mon, 09 Sep 2013 05:44:31 -0400
parents
children cd6cc6d76708
files COPYING datatypes_conf.xml edena_ass_wrapper.py edena_ass_wrapper.xml edena_ovl_wrapper.py edena_ovl_wrapper.xml tool_dependencies.xml
diffstat 7 files changed, 469 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/COPYING	Mon Sep 09 05:44:31 2013 -0400
@@ -0,0 +1,23 @@
+Copyright © 2013 CRS4 Srl. http://www.crs4.it/
+Created by:
+Andrea Pinna <andrea.pinna@crs4.it>
+Nicola Soranzo <nicola.soranzo@crs4.it>
+
+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/datatypes_conf.xml	Mon Sep 09 05:44:31 2013 -0400
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<datatypes>
+  <registration>
+    <datatype extension="ovl" type="galaxy.datatypes.binary:Binary" mimetype="application/octet-stream" subclass="True" display_in_upload="true" />
+  </registration>
+</datatypes>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/edena_ass_wrapper.py	Mon Sep 09 05:44:31 2013 -0400
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+"""
+Edena (assembling)
+version 0.2.1 (andrea.pinna@crs4.it)
+"""
+
+import optparse
+import shutil
+import subprocess
+import sys
+
+def __main__():
+    # load arguments
+    print 'Parsing Edena (assembling) input options...'
+    parser = optparse.OptionParser(description='Edena assembly')
+    parser.add_option('--ovl_input', dest='ovl_input', help='')
+    parser.add_option('--overlapCutoff', dest='overlapCutoff', type='int', help='')
+    parser.add_option('--cc', action="store_true", dest='cc', help='')
+    parser.add_option('--discardNonUsable', action="store_true", dest='discardNonUsable', help='')
+    parser.add_option('--minContigSize', dest='minContigSize', type='int', help='')
+    parser.add_option('--minCoverage', dest='minCoverage', type='float', help='')
+    parser.add_option('--trim', dest='trim', type='int', help='')
+    parser.add_option('--peHorizon', dest='peHorizon', type='int', help='')
+    parser.add_option('--covStats', dest='covStats', help='')
+    parser.add_option('--out_contigs_cov', dest='out_contigs_cov', help='')
+    parser.add_option('--out_contigs_fasta', dest='out_contigs_fasta', help='')
+    parser.add_option('--out_contigs_lay', dest='out_contigs_lay', help='')
+    parser.add_option('--out_log_txt', dest='out_log_txt', help='')
+    parser.add_option('--out_nodesInfo', dest='out_nodesInfo', help='')
+    parser.add_option('--out_nodesPosition', dest='out_nodesPosition', help='')
+    parser.add_option('--logfile', dest='logfile', help='logfile')
+    (options, args) = parser.parse_args()
+    if len(args) > 0:
+        parser.error('Wrong number of arguments')
+    
+    # build Edena (assembling) command to be executed
+    ovl_input = '-e %s' % (options.ovl_input)
+    if options.overlapCutoff is not None:
+        overlapCutoff = '-m %d' % (options.overlapCutoff)
+    else:
+        overlapCutoff = ''
+    if options.cc:
+        cc = '-cc yes'
+    else:
+        cc = '-cc no'
+    if options.discardNonUsable:
+        discardNonUsable = '-discardNonUsable yes'
+    else:
+        discardNonUsable = '-discardNonUsable no'
+    if options.minContigSize is not None:
+        minContigSize = '-c %d' % (options.minContigSize)
+    else:
+        minContigSize = ''
+    if options.minCoverage is not None:
+        minCoverage = '-minCoverage %s' % (options.minCoverage)
+    else:
+        minCoverage = ''
+    if options.trim is not None:
+        trim = '-trim %d' % (options.trim)
+    else:
+        trim = ''
+    if options.peHorizon is not None:
+        peHorizon = '-peHorizon %d' % (options.peHorizon)
+    else:
+        peHorizon = ''
+    covStats = options.covStats
+    out_contigs_cov = options.out_contigs_cov
+    out_contigs_fasta = options.out_contigs_fasta
+    out_contigs_lay = options.out_contigs_lay
+    out_log_txt = options.out_log_txt
+    out_nodesInfo = options.out_nodesInfo
+    out_nodesPosition = options.out_nodesPosition
+    logfile = options.logfile
+    
+    # Build Edena (assembling) command
+    cmd1 = '%s %s %s %s %s %s %s %s' % (ovl_input, overlapCutoff, cc, discardNonUsable, minContigSize, minCoverage, trim, peHorizon)
+    cmd2 = 'edena %s' % ( cmd1 )
+    print '\nEdena (assembling) command to be executed: \n %s' % ( cmd2 )
+    
+    # Execution of Edena
+    print 'Executing Edena (assembling)...'
+    if logfile:
+        log = open(logfile, 'w')
+    else:
+        log = sys.stdout
+    try:
+        subprocess.check_call(cmd2, stdout=log, stderr=subprocess.STDOUT, shell=True) # need to redirect stderr because edena writes some logging info there (e.g. "Condensing overlaps graph...")
+    finally:
+        if log != sys.stdout:
+            log.close()
+    print 'Edena (assembling) executed!'
+
+    shutil.move("covStats", covStats)
+    shutil.move("out_contigs.cov", out_contigs_cov)
+    shutil.move("out_contigs.fasta", out_contigs_fasta)
+    shutil.move("out_contigs.lay", out_contigs_lay)
+    shutil.move("out_log.txt", out_log_txt)
+    shutil.move("out_nodesInfo", out_nodesInfo)
+    shutil.move("out_nodesPosition", out_nodesPosition)
+
+
+if __name__ == "__main__":
+    __main__()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/edena_ass_wrapper.xml	Mon Sep 09 05:44:31 2013 -0400
@@ -0,0 +1,89 @@
+<tool id="edena_ass_wrapper" name="Edena (assembling)" version="0.2.1">
+  <description></description>
+  <requirements>
+    <requirement type="package" version="3.130110">edena</requirement>
+  </requirements>
+  <version_command>edena -v</version_command>
+  <command interpreter="python">
+    edena_ass_wrapper.py --ovl_input=$ovl_input
+    #if str($overlapCutoff)
+      --overlapCutoff=$overlapCutoff
+    #end if
+    #if $cc
+      --cc
+    #end if
+    #if $discardNonUsable
+      --discardNonUsable
+    #end if
+    #if str($minContigSize)
+      --minContigSize=$minContigSize
+    #end if
+    #if str($minCoverage)
+      --minCoverage=$minCoverage
+    #end if
+    #if str($trim)
+      --trim=$trim
+    #end if
+    #if str($peHorizon)
+      --peHorizon=$peHorizon
+    #end if
+    --covStats=$covStats --out_contigs_cov=$out_contigs_cov --out_contigs_fasta=$out_contigs_fasta --out_contigs_lay=$out_contigs_lay --out_log_txt=$out_log_txt --out_nodesInfo=$out_nodesInfo --out_nodesPosition=$out_nodesPosition
+    --logfile=$logfile
+  </command>
+
+  <inputs>
+    <param name="ovl_input" type="data" format="ovl" label="Edena .ovl file (-e)" help="Specify here the Edena “.ovl” file obtained from the overlapping step" />
+
+    <param name="overlapCutoff" type="integer" value="" optional="true" label="Overlap cutoff (-m)" help="The overlap cutoff is by default set to half of the reads length L (see the log output by the overlapping step to identify it). It is however still worth trying to increase this setting since it can greatly simplify highly connected overlaps graphs, and thus speed up the assembly. If one step during the assembly hangs, increasing the overlap cutoff is the first thing to do." />
+
+    <param name="cc" type="boolean" checked="true" label="Contextual cleaning (-cc)" help="This option is enabled by default. Contextual cleaning is a procedure that efficiently identifies and removes false positive edges, improving thus the assembly. This procedure can be seen as a dynamic overlap cutoff on the overlaps graph. It is possible however for this step to be slow on ultra-high covered sequencing data. In such cases, try to increase the overlap cutoff value, or to simply disable this option." />
+
+    <param name="discardNonUsable" type="boolean" checked="true" label="Discard non usable nodes (-discardNonUsable)" help="Enabled by default, this procedure discards nodes smaller than 1.5*readLength and that are not connected to any other nodes." />
+
+    <param name="minContigSize" type="integer" value="" optional="true" label="Minimum size of the contigs to output (-c)" help="If not specified, this value is set to 1.5*readLength." />
+
+    <param name="minCoverage" type="float" value="" optional="true" label="Minimum required coverage for the contigs (-minCoverage)" help="If not specified, this value is automatically determined from the nodes coverage distribution. This estimation however supposes a uniform coverage. It could be worth overriding this parameter in some cases, i.e. with transcriptome data, or a mix of PCR product assemblies." />
+
+    <param name="trim" type="integer" value="4" optional="true" label="Coverage cutoff for contigs ends (-trim)" help="Contig interruptions are caused either because of a non-resolved ambiguity, or because of a lack of overlapping reads. In the latter case, the contig end may be inaccurate. This option will trim such ends until a minimum coverage is reached. By default, this value is set to 4. To disable contigs ends trimming, set this value to 1." />
+
+    <param name="peHorizon" type="integer" value="" optional="true" label="Maximum search distance for paired-end reads connection (-peHorizon)" help="Edena samples the overlaps graph to accurately determine the paired distance distribution. This parameter specifies the maximum distance that is searched during this sampling. By default, this value is set to 1000 if solely direct-reverse mates are used and 10000 if reverse-direct mates are also used. This value has to be set to at least 2X the expected size of the longest mate library." />
+  </inputs>
+
+  <outputs>
+    <data name="covStats" format="tabular" label="${tool.name} on ${on_string}: CovStats" />
+    <data name="out_contigs_cov" format="txt" label="${tool.name} on ${on_string}: ContigsCov" />
+    <data name="out_contigs_fasta" format="fasta" label="${tool.name} on ${on_string}: ContigsFasta" />
+    <data name="out_contigs_lay" format="txt" label="${tool.name} on ${on_string}: ContigsLay" />
+    <data name="out_log_txt" format="txt" label="${tool.name} on ${on_string}: log" />
+    <data name="out_nodesInfo" format="txt" label="${tool.name} on ${on_string}: nodes info" />
+    <data name="out_nodesPosition" format="txt" label="${tool.name} on ${on_string}: nodes position" />
+    <data name="logfile" format="txt" label="${tool.name} on ${on_string}: log (terminal)" />
+  </outputs>
+
+  <tests>
+
+  </tests>
+  <help>
+**What it does**
+
+The key parameter for this mode is the overlaps size cutoff (option –m). By default it is set to half of the reads length, which is quite conservative. If your sequencing project is well covered (>50-100x) you may try increasing a bit this value. The minCoverage is an important parameter which is automatically determined. You may check this value in the program output and possibly override it.
+
+**License and citation**
+
+This Galaxy tool is Copyright © 2013 `CRS4 Srl.`_ and is released under the `MIT license`_.
+
+.. _CRS4 Srl.: http://www.crs4.it/
+.. _MIT license: http://opensource.org/licenses/MIT
+
+If you use this tool in Galaxy, please cite |Cuccuru2013|_.
+
+.. |Cuccuru2013| replace:: Cuccuru, G., Orsini, M., Pinna, A., Sbardellati, A., Soranzo, N., Travaglione, A., Uva, P., Zanetti, G., Fotia, G. (2013) Orione, a web-based framework for NGS analysis in microbiology. *Submitted*
+.. _Cuccuru2013: http://orione.crs4.it/
+
+This tool uses `Edena`_, which is licensed separately. Please cite |Hernandez2008|_.
+
+.. _Edena: http://www.genomic.ch/edena.php
+.. |Hernandez2008| replace:: Hernandez, D., *et al.* (2008) De novo bacterial genome sequencing: Millions of very short reads assembled on a desktop computer. *Genome Res.* 18(5), 802-809
+.. _Hernandez2008: http://genome.cshlp.org/content/18/5/802
+  </help>
+</tool>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/edena_ovl_wrapper.py	Mon Sep 09 05:44:31 2013 -0400
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+"""
+Edena (overlapping)
+version 0.2.1 (andrea.pinna@crs4.it)
+"""
+
+import optparse
+import shutil
+import subprocess
+import sys
+
+def __main__():
+    # load arguments
+    print 'Parsing Edena (overlapping) input options...'
+    parser = optparse.OptionParser()
+    parser.add_option('--unpaired_input', dest='unpaired_input', help='')
+    parser.add_option('--dr_pair_1', dest='dr_pair_1', help='')
+    parser.add_option('--dr_pair_2', dest='dr_pair_2', help='')
+    parser.add_option('--rd_pair_1', dest='rd_pair_1', help='')
+    parser.add_option('--rd_pair_2', dest='rd_pair_2', help='')
+    parser.add_option('--nThreads', dest='nThreads', type='int', help='')
+    parser.add_option('--minOlap', dest='minOlap', type='int', help='')
+    parser.add_option('--readsTruncation', dest='readsTruncation', type='int', help='')
+    parser.add_option('--output', dest='output', help='')
+    parser.add_option('--logfile', dest='logfile', help='')
+    (options, args) = parser.parse_args()
+    if len(args) > 0:
+        parser.error('Wrong number of arguments')
+    
+    # build Edena (overlapping) command to be executed
+    # unpaired input(s)
+    if options.unpaired_input:
+        unpaired_inputs = options.unpaired_input.split('+')[0:-1]
+        unpaired_input = '-r'
+        for item in unpaired_inputs:
+            unpaired_input += ' %s' % (item)
+    else:
+        unpaired_input = ''
+    # direct-reverse paired-end files
+    if options.dr_pair_1 and options.dr_pair_2:
+        dr_pairs_1 = options.dr_pair_1.split('+')[0:-1]
+        dr_pairs_2 = options.dr_pair_2.split('+')[0:-1]
+        dr_pairs = '-DRpairs'
+        for i in xrange(len(dr_pairs_1)):
+            dr_pairs += ' %s %s' % (dr_pairs_1[i], dr_pairs_2[i])
+    else:
+        dr_pairs = ''
+     # reverse-direct paired-end files
+    if options.rd_pair_1 and options.rd_pair_2:
+        rd_pairs_1 = options.rd_pair_1.split('+')[0:-1]
+        rd_pairs_2 = options.rd_pair_2.split('+')[0:-1]
+        rd_pairs = '-RDpairs'
+        for i in xrange(len(rd_pairs_1)):
+            rd_pairs += ' %s %s' % (rd_pairs_1[i], rd_pairs_2[i])
+    else:
+        rd_pairs = ''
+    # nThreads
+    if options.nThreads is not None:
+        nThreads = '-nThreads %d' % (options.nThreads)
+    else:
+        nThreads = ''
+    # minimum overlap
+    if options.minOlap is not None:
+        minOlap = '-M %d' % (options.minOlap)
+    else:
+        minOlap = ''
+    # 3' end reads truncation
+    if options.readsTruncation is not None:
+        readsTruncation = '-t %d' % (options.readsTruncation)
+    else:
+        readsTruncation = ''
+    # output file(s)
+    output = options.output
+    logfile = options.logfile
+    
+    # Build Edena (overlapping) command
+    cmd = 'edena %s %s %s %s %s %s -p galaxy_output' % (unpaired_input, dr_pairs, rd_pairs, nThreads, minOlap, readsTruncation)
+    print '\nEdena (overlapping) command to be executed: \n %s' % ( cmd )
+    
+    # Execution of Edena
+    print 'Executing Edena (overlapping)...'
+    if logfile:
+        log = open(logfile, 'w')
+    else:
+        log = sys.stdout
+    try:
+        subprocess.check_call(cmd, stdout=log, stderr=subprocess.STDOUT, shell=True) # need to redirect stderr because edena writes some logging info there (e.g. "Computing overlaps >=30...")
+    finally:
+        if log != sys.stdout:
+            log.close()
+    print 'Edena (overlapping) executed!'
+    
+    shutil.move( "galaxy_output.ovl", output)
+
+
+if __name__ == "__main__":
+    __main__()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/edena_ovl_wrapper.xml	Mon Sep 09 05:44:31 2013 -0400
@@ -0,0 +1,127 @@
+<tool id="edena_ovl_wrapper" name="Edena (overlapping)" version="0.2.2">
+  <description></description>
+  <requirements>
+    <requirement type="package" version="3.130110">edena</requirement>
+  </requirements>
+  <version_command>edena -v</version_command>
+  <command interpreter="python">
+    edena_ovl_wrapper.py
+    \${EDENA_SITE_OPTIONS:---nThreads 2}
+    #if $input_selection.input == "unpaired_file"
+      #for $i, $unpaired_file in enumerate( $input_selection.unpaired_input ):
+        #if $i == 0
+          #echo "--unpaired_input="
+        #end if
+        #echo $unpaired_file.unpaired_file
+        #echo '+'
+      #end for
+    #elif $input_selection.input == "dr_pairs"
+      #for $i, $dr_pair_1 in enumerate( $input_selection.dr_pairs_input ):
+        #if $i == 0
+          #echo "--dr_pair_1="
+        #end if
+        #echo $dr_pair_1.dr_pair_1
+        #echo '+'
+      #end for
+      #echo ' '
+      #for $i, $dr_pair_2 in enumerate( $input_selection.dr_pairs_input ):
+        #if $i == 0
+          #echo "--dr_pair_2="
+        #end if
+        #echo $dr_pair_2.dr_pair_2
+        #echo '+'
+      #end for
+    #elif $input_selection.input == "rd_pairs"
+      #for $i, $rd_pair_1 in enumerate( $input_selection.rd_pairs_input ):
+        #if $i == 0
+          #echo "--rd_pair_1="
+        #end if
+        #echo $rd_pair_1.rd_pair_1
+        #echo '+'
+      #end for
+      #echo ' '
+      #for $i, $rd_pair_2 in enumerate( $input_selection.rd_pairs_input ):
+        #if $i == 0
+          #echo "--rd_pair_2="
+        #end if
+        #echo $rd_pair_2.rd_pair_2
+        #echo '+'
+      #end for
+    #end if
+    #if str($minOlap)
+      --minOlap=$minOlap
+    #end if
+    #if str($readsTruncation)
+      --readsTruncation=$readsTruncation
+    #end if
+    --output=$output
+    --logfile=$logfile
+  </command>
+
+  <inputs>
+    <conditional name="input_selection">
+      <param name="input" type="select" label="Select input type">
+        <option value="unpaired_file" selected="True">Unpaired files</option>
+        <option value="dr_pairs">Direct-reverse paired-end files</option>
+        <option value="rd_pairs">Reverse-direct paired-end files</option>
+      </param>
+
+      <when value="unpaired_file">
+        <repeat name="unpaired_input" title="Unpaired inputs (-r)" min="1">
+          <param name="unpaired_file" type="data" format="fasta,fastq" label="Unpaired file" help="FASTA or FASTQ format" />
+        </repeat>
+      </when>
+
+      <when value="dr_pairs">
+        <repeat name="dr_pairs_input" title="DR paired-end inputs (-DRpairs, -paired)" min="1">
+          <param name="dr_pair_1" type="data" format="fasta,fastq" label="DR paired-end file 1" help="FASTA or FASTQ format" />
+          <param name="dr_pair_2" type="data" format="fasta,fastq" label="DR paired-end file 2" help="FASTA or FASTQ format" />
+        </repeat>
+      </when>
+
+      <when value="rd_pairs">
+        <repeat name="rd_pairs_input" title="RD paired-end inputs (-RDpairs, -matePairs)" min="1">
+          <param name="rd_pair_1" type="data" format="fasta,fastq" label="RD paired-end file 1" help="FASTA or FASTQ format" />
+          <param name="rd_pair_2" type="data" format="fasta,fastq" label="RD paired-end file 2" help="FASTA or FASTQ format" />
+        </repeat>
+      </when>
+    </conditional>
+
+    <param name="minOlap" type="integer" value="" optional="true" label="Minimum overlap size to compute (-M)" help="If not specified, this value is set to half of the reads length. When the sequencing coverage is sufficient, you can increase this value which will reduce the computational time. Edena will compute the overlaps whose sizes range from this value to the reads length." />
+
+    <param name="readsTruncation" type="integer" value="" optional="true" label="3' end reads truncation (-t)" help="Use this option to truncate the 3’end of the reads such that the resulting length is the inserted value. You may consider reads truncation since it can significantly improve the assembly. Since Edena computes exact overlaps, only error free reads can take part to the assembly. Since errors are likely to occur at the 3’ ends, shortening the reads by some nucleotides may increase the number of errors-free reads in the dataset, and thus increase the assembly performance." />
+
+  </inputs>
+
+  <outputs>
+    <data name="logfile" format="txt" label="${tool.name} on ${on_string}: log" />
+    <data name="output" format="ovl" label="${tool.name} on ${on_string}: overlapping" />
+  </outputs>
+
+  <tests>
+
+  </tests>
+  <help>
+**What it does**
+
+Edena can accept both unpaired and paired files, FASTQ and FASTA format. Note that for technical reasons, all reads are required to be of the same length. You can however provide the program with different files containing different reads length. In such case, Edena will trim the 3’ ends of the longer reads so that they fit the shorter length. It is however required that reads within each individual file are of the same length (as Illumina GA reads are). By default all overlaps with a minimum size corresponding to half of the reads length are computed. This is quite conservative. Provided enough coverage, this value can be increased (option -M) to reduce the memory requirements. For reads longer than 100bp, you may consider the reads truncation option, which could help in discarding 3’ base calling errors.
+
+**License and citation**
+
+This Galaxy tool is Copyright © 2013 `CRS4 Srl.`_ and is released under the `MIT license`_.
+
+.. _CRS4 Srl.: http://www.crs4.it/
+.. _MIT license: http://opensource.org/licenses/MIT
+
+If you use this tool in Galaxy, please cite |Cuccuru2013|_.
+
+.. |Cuccuru2013| replace:: Cuccuru, G., Orsini, M., Pinna, A., Sbardellati, A., Soranzo, N., Travaglione, A., Uva, P., Zanetti, G., Fotia, G. (2013) Orione, a web-based framework for NGS analysis in microbiology. *Submitted*
+.. _Cuccuru2013: http://orione.crs4.it/
+
+This tool uses `Edena`_, which is licensed separately. Please cite |Hernandez2008|_.
+
+.. _Edena: http://www.genomic.ch/edena.php
+.. |Hernandez2008| replace:: Hernandez, D., *et al.* (2008) De novo bacterial genome sequencing: Millions of very short reads assembled on a desktop computer. *Genome Res.* 18(5), 802-809
+.. _Hernandez2008: http://genome.cshlp.org/content/18/5/802
+  </help>
+</tool>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_dependencies.xml	Mon Sep 09 05:44:31 2013 -0400
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<tool_dependency>
+  <package name="edena" version="3.130110">
+    <install version="1.0">
+      <actions>
+        <action type="download_by_url">http://www.genomic.ch/edena/EdenaV3.130110.tar.gz</action>
+        <action type="shell_command">make</action>
+        <action type="move_directory_files">
+          <source_directory>bin</source_directory>
+          <destination_directory>$INSTALL_DIR/bin</destination_directory>
+        </action>
+        <action type="set_environment">
+          <environment_variable name="PATH" action="prepend_to">$INSTALL_DIR/bin</environment_variable>
+        </action>
+        <action type="set_environment">
+          <environment_variable name="EDENA_SITE_OPTIONS" action="set_to">"--nThreads 2"</environment_variable>
+        </action>
+      </actions>
+    </install>
+    <readme>
+Change the EDENA_SITE_OPTIONS variable in the installed env.sh file to adjust the number of threads to use (--nThreads).
+    </readme>
+  </package>
+</tool_dependency>