changeset 24:2f2c62ec2d08 draft

v0.0.10 explicit galaxy_sequence_utils dependency etc
author peterjc
date Thu, 02 Feb 2017 11:14:53 -0500
parents c4ec51cb5acc
children faf1ea8d1c06
files tools/venn_list/README.rst tools/venn_list/tool_dependencies.xml tools/venn_list/venn_list.py tools/venn_list/venn_list.xml
diffstat 4 files changed, 218 insertions(+), 214 deletions(-) [+]
line wrap: on
line diff
--- a/tools/venn_list/README.rst	Sat Oct 10 08:51:00 2015 -0400
+++ b/tools/venn_list/README.rst	Thu Feb 02 11:14:53 2017 -0500
@@ -1,7 +1,7 @@
 Galaxy tool to draw a Venn Diagram with up to 3 sets
 ====================================================
 
-This tool is copyright 2011-2015 by Peter Cock, The James Hutton Institute
+This tool is copyright 2011-2017 by Peter Cock, The James Hutton Institute
 (formerly SCRI, Scottish Crop Research Institute), UK. All rights reserved.
 See the licence text below.
 
@@ -72,6 +72,9 @@
         - Includes testing of failure mode.
         - Planemo for Tool Shed upload (``.shed.yml``, internal change only).
         - Tool Shed dependency for rpy and limma (thanks to Björn Grüning).
+v0.0.10 - Updated to point at Biopython 1.67 (latest version in Tool Shed).
+        - Explicit dependency on ``galaxy_sequence_utils``.
+        - Python style updates (internal change only).
 ======= ======================================================================
 
 
--- a/tools/venn_list/tool_dependencies.xml	Sat Oct 10 08:51:00 2015 -0400
+++ b/tools/venn_list/tool_dependencies.xml	Thu Feb 02 11:14:53 2017 -0500
@@ -1,12 +1,15 @@
 <?xml version="1.0"?>
 <tool_dependency>
+    <package name="galaxy_sequence_utils" version="1.0.1">
+        <repository changeset_revision="c38bd3fe9da6" name="package_galaxy_sequence_utils_1_0_1" owner="iuc" toolshed="https://testtoolshed.g2.bx.psu.edu" />
+    </package>
     <package name="limma" version="3.25.3">
         <repository changeset_revision="55850b0ff6a3" name="package_r2_limma_3_25_3" owner="iuc" toolshed="https://testtoolshed.g2.bx.psu.edu" />
     </package>
     <package name="rpy" version="1.0.3">
-        <repository changeset_revision="c0eb80864491" name="package_rpy_1_0_3" owner="devteam" toolshed="https://testtoolshed.g2.bx.psu.edu" />
+        <repository changeset_revision="3e11ba53f2a6" name="package_rpy_1_0_3" owner="devteam" toolshed="https://testtoolshed.g2.bx.psu.edu" />
     </package>
-    <package name="biopython" version="1.65">
-        <repository changeset_revision="f8d72690eeae" name="package_biopython_1_65" owner="biopython" toolshed="https://testtoolshed.g2.bx.psu.edu" />
+    <package name="biopython" version="1.67">
+        <repository changeset_revision="fc45a61abc2f" name="package_biopython_1_67" owner="biopython" toolshed="https://testtoolshed.g2.bx.psu.edu" />
     </package>
 </tool_dependency>
--- a/tools/venn_list/venn_list.py	Sat Oct 10 08:51:00 2015 -0400
+++ b/tools/venn_list/venn_list.py	Thu Feb 02 11:14:53 2017 -0500
@@ -11,127 +11,124 @@
 
 import sys
 
-def sys_exit(msg, error_level=1):
-    """Print error message to stdout and quit with given error level."""
-    sys.stderr.write("%s\n" % msg)
-    sys.exit(error_level)
-
 try:
     import rpy
 except ImportError:
-    sys_exit("Requires the Python library rpy (to call R)")
+    sys.exit("Requires the Python library rpy (to call R)")
 except RuntimeError, e:
-    sys_exit("The Python library rpy is not availble for the current R version\n\n%s" % e)
+    sys.exit("The Python library rpy is not availble for the current R version\n\n%s" % e)
 
 try:
     rpy.r.library("limma")
-except:
-    sys_exit("Requires the R library limma (for vennDiagram function)")
+except Exception:
+    sys.exit("Requires the R library limma (for vennDiagram function)")
 
 
-if len(sys.argv)-1 not in [7, 10, 13]:
-    sys_exit("Expected 7, 10 or 13 arguments (for 1, 2 or 3 sets), not %i" % (len(sys.argv)-1))
+if len(sys.argv) - 1 not in [7, 10, 13]:
+    sys.exit("Expected 7, 10 or 13 arguments (for 1, 2 or 3 sets), not %i" % (len(sys.argv) - 1))
 
 all_file, all_type, all_label = sys.argv[1:4]
 set_data = []
-if len(sys.argv)-1 >= 7:
+if len(sys.argv) - 1 >= 7:
     set_data.append(tuple(sys.argv[4:7]))
-if len(sys.argv)-1 >= 10:
+if len(sys.argv) - 1 >= 10:
     set_data.append(tuple(sys.argv[7:10]))
-if len(sys.argv)-1 >= 13:
+if len(sys.argv) - 1 >= 13:
     set_data.append(tuple(sys.argv[10:13]))
 pdf_file = sys.argv[-1]
 n = len(set_data)
 print "Doing %i-way Venn Diagram" % n
 
+
 def load_ids(filename, filetype):
-    if filetype=="tabular":
+    if filetype == "tabular":
         for line in open(filename):
             line = line.rstrip("\n")
             if line and not line.startswith("#"):
-                yield line.split("\t",1)[0]
-    elif filetype=="fasta":
+                yield line.split("\t", 1)[0]
+    elif filetype == "fasta":
         for line in open(filename):
             if line.startswith(">"):
-                yield line[1:].rstrip("\n").split(None,1)[0]
+                yield line[1:].rstrip("\n").split(None, 1)[0]
     elif filetype.startswith("fastq"):
-        #Use the Galaxy library not Biopython to cope with CS
+        # Use the Galaxy library not Biopython to cope with CS
         from galaxy_utils.sequence.fastq import fastqReader
         handle = open(filename, "rU")
         for record in fastqReader(handle):
-            #The [1:] is because the fastaReader leaves the @ on the identifer.
+            # The [1:] is because the fastaReader leaves the @ on the identifer.
             yield record.identifier.split()[0][1:]
         handle.close()
-    elif filetype=="sff":
+    elif filetype == "sff":
         try:
             from Bio.SeqIO import index
         except ImportError:
-            sys_exit("Require Biopython 1.54 or later (to read SFF files)")
-        #This will read the SFF index block if present (very fast)
+            sys.exit("Require Biopython 1.54 or later (to read SFF files)")
+        # This will read the SFF index block if present (very fast)
         for name in index(filename, "sff"):
             yield name
     else:
-        sys_exit("Unexpected file type %s" % filetype)
+        sys.exit("Unexpected file type %s" % filetype)
+
 
 def load_ids_whitelist(filename, filetype, whitelist):
     for name in load_ids(filename, filetype):
         if name in whitelist:
             yield name
         else:
-            sys_exit("Unexpected ID %s in %s file %s" % (name, filetype, filename))
+            sys.exit("Unexpected ID %s in %s file %s" % (name, filetype, filename))
 
 if all_file in ["", "-", '""', '"-"']:
-    #Load without white list
-    sets = [set(load_ids(f,t)) for (f,t,c) in set_data]
-    #Take union
-    all = set()
+    # Load without white list
+    sets = [set(load_ids(f, t)) for (f, t, c) in set_data]
+    # Take union
+    all_ids = set()
     for s in sets:
-        all.update(s)
-    print "Inferred total of %i IDs" % len(all)
+        all_ids.update(s)
+    print "Inferred total of %i IDs" % len(all_ids)
 else:
-    all = set(load_ids(all_file, all_type))
-    print "Total of %i IDs" % len(all)
-    sets = [set(load_ids_whitelist(f,t,all)) for (f,t,c) in set_data]
+    all_ids = set(load_ids(all_file, all_type))
+    print "Total of %i IDs" % len(all_ids)
+    sets = [set(load_ids_whitelist(f, t, all_ids)) for (f, t, c) in set_data]
 
-for s, (f,t,c) in zip(sets, set_data):
+for s, (f, t, c) in zip(sets, set_data):
     print "%i in %s" % (len(s), c)
 
-#Now call R library to draw simple Venn diagram
+# Now call R library to draw simple Venn diagram
 try:
-    #Create dummy Venn diagram counts object for three groups
-    cols = 'c("%s")' % '","'.join("Set%i" % (i+1) for i in range(n))
-    rpy.r('groups <- cbind(%s)' % ','.join(['1']*n))
+    # Create dummy Venn diagram counts object for three groups
+    cols = 'c("%s")' % '","'.join("Set%i" % (i + 1) for i in range(n))
+    rpy.r('groups <- cbind(%s)' % ','.join(['1'] * n))
     rpy.r('colnames(groups) <- %s' % cols)
     rpy.r('vc <- vennCounts(groups)')
-    #Populate the 2^n classes with real counts
-    #Don't make any assumptions about the class order
-    #print rpy.r('vc')
+    # Populate the 2^n classes with real counts
+    # Don't make any assumptions about the class order
+    # print rpy.r('vc')
     for index, row in enumerate(rpy.r('vc[,%s]' % cols)):
         if isinstance(row, int) or isinstance(row, float):
-            #Hack for rpy being too clever for single element row
+            # Hack for rpy being too clever for single element row
             row = [row]
-        names = all
+        names = all_ids
         for wanted, s in zip(row, sets):
             if wanted:
                 names = names.intersection(s)
             else:
                 names = names.difference(s)
-        rpy.r('vc[%i,"Counts"] <- %i' % (index+1, len(names)))
-    #print rpy.r('vc')
+        rpy.r('vc[%i,"Counts"] <- %i' % (index + 1, len(names)))
+    # print rpy.r('vc')
     if n == 1:
-        #Single circle, don't need to add (Total XXX) line
-        names = [c for (t,f,c) in set_data]
+        # Single circle, don't need to add (Total XXX) line
+        names = [c for (t, f, c) in set_data]
     else:
-        names = ["%s\n(Total %i)" % (c, len(s)) for s, (f,t,c) in zip(sets, set_data)]
+        names = ["%s\n(Total %i)" % (c, len(s)) for s, (f, t, c) in zip(sets, set_data)]
     rpy.r.assign("names", names)
-    rpy.r.assign("colors", ["red","green","blue"][:n])
+    rpy.r.assign("colors", ["red", "green", "blue"][:n])
     rpy.r.pdf(pdf_file, 8, 8)
     rpy.r("""vennDiagram(vc, include="both", names=names,
                          main="%s", sub="(Total %i)",
                          circle.col=colors)
-                         """ % (all_label, len(all)))
+                         """ % (all_label, len(all_ids)))
     rpy.r.dev_off()
 except Exception, exc:
-    sys_exit( "%s" %str( exc ) )
-rpy.r.quit( save="no" )
+    sys.exit("%s" % str(exc))
+rpy.r.quit(save="no")
 print "Done"
--- a/tools/venn_list/venn_list.xml	Sat Oct 10 08:51:00 2015 -0400
+++ b/tools/venn_list/venn_list.xml	Thu Feb 02 11:14:53 2017 -0500
@@ -1,157 +1,158 @@
-<tool id="venn_list" name="Venn Diagram" version="0.0.9">
-    <description>from lists</description>
-    <requirements>
-        <requirement type="python-module">rpy</requirement>
-        <requirement type="python-module">Bio</requirement>
-        <requirement type="package" version="1.0.3">rpy</requirement>
-        <requirement type="package" version="3.25.3">limma</requirement>
-        <requirement type="package" version="1.65">biopython</requirement>
-    </requirements>
-    <stdio>
-        <!-- Anything other than zero is an error -->
-        <exit_code range="1:" />
-        <exit_code range=":-1" />
-    </stdio>
-    <command interpreter="python">
-venn_list.py
-#if $universe.type_select=="implicit":
-  - -
-#else:
-  "$main" $main.ext
-#end if
-"$main_lab"
-#for $s in $sets:
-  "$s.set" $s.set.ext "$s.lab"
-#end for
-$PDF
-    </command>
-    <inputs>
-        <param name="main_lab" size="30" type="text" value="Venn Diagram" label="Plot title"/>
-        <conditional name="universe">
-            <param name="type_select" type="select" label="Implicit or explicit full ID list?">
-                <option value="explicit">Explicit</option>
-                <option value="implicit">Implicit (use union of sets below)</option>
-            </param>
-            <when value="explicit">
-                 <param name="main" type="data" format="tabular,fasta,fastq,sff" label="Full dataset (with all identifiers)" help="Tabular file (uses column one), FASTA, FASTQ or SFF file."/>
-            </when>
-            <when value="implicit"/>
-        </conditional>
-        <repeat name="sets" min="1" max="3" title="Sets">
-            <param name="set" type="data" format="tabular,fasta,fastq,sff" label="Members of set" help="Tabular file (uses column one), FASTA, FASTQ or SFF file."/>
-            <param name="lab" size="30" type="text" value="Group" label="Caption for set"/>
-        </repeat>
-    </inputs>
-    <outputs>
-        <data format="pdf" name="PDF" />
-    </outputs>
-    <tests>
-         <!-- Doesn't seem to work properly, manages to get two sets, both
-              with same FASTA file, but second with default "Group" label. -->
-        <test>
-            <param name="type_select" value="explicit"/>
-            <param name="main" value="venn_list.tabular" ftype="tabular"/>
-            <param name="main_lab" value="Some Proteins"/>
-            <param name="set" value="rhodopsin_proteins.fasta"/>
-            <param name="lab" value="Rhodopsins"/>
-            <output name="PDF" file="magic.pdf" ftype="pdf" compare="contains" />
-            <assert_stdout>
-                <has_line line="Doing 1-way Venn Diagram" />
-                <has_line line="Total of 10 IDs" />
-                <has_line line="6 in Rhodopsins" />
-            </assert_stdout>
-        </test>
-        <test>
-            <param name="type_select" value="implicit"/>
-            <param name="sets_0|set" value="rhodopsin_proteins.fasta"/>
-            <param name="sets_0|lab" value="Rhodopsins"/>
-            <param name="sets_1|set" value="four_human_proteins.fasta"/>
-            <param name="sets_1|lab" value="Human"/>
-            <param name="sets_2|set" value="blastp_four_human_vs_rhodopsin.tabular"/>
-            <param name="sets_2|lab" value="Human vs Rhodopsin BLAST"/>
-            <output name="PDF" file="magic.pdf" ftype="pdf" compare="contains" />
-            <assert_stdout>
-                <has_line line="Doing 3-way Venn Diagram" />
-                <has_line line="Inferred total of 10 IDs" />
-                <has_line line="6 in Rhodopsins" />
-                <has_line line="4 in Human" />
-                <has_line line="1 in Human vs Rhodopsin BLAST" />
-            </assert_stdout>
-        </test>
-        <test expect_failure="true" expect_exit_code="1">
-            <param name="type_select" value="explicit"/>
-            <param name="main" value="venn_list.tabular" ftype="tabular"/>
-            <param name="main_lab" value="Some Proteins"/>
-            <param name="sets_0|set" value="rhodopsin_proteins.fasta"/>
-            <param name="sets_0|lab" value="Rhodopsins"/>
-            <param name="sets_1|set" value="four_human_proteins.fasta"/>
-            <param name="sets_1|lab" value="Human"/>
-            <param name="sets_2|set" value="blastp_four_human_vs_rhodopsin.tabular"/>
-            <param name="sets_2|lab" value="Human vs Rhodopsin BLAST"/>
-            <assert_stdout>
-                <has_line line="Doing 3-way Venn Diagram" />
-                <has_line line="Total of 10 IDs" />
-            </assert_stdout>
-            <assert_stderr>
-                <has_text_matching expression="Unexpected ID sp|Q9BS26|ERP44_HUMAN in fasta file *" />
-            </assert_stderr>
-        </test>
-    </tests>
-    <help>
-
-.. class:: infomark
-
-**TIP:** If your data is in tabular files, the identifier is assumed to be in column one.
-
-**What it does**
-
-Draws Venn Diagram for one, two or three sets (as a PDF file).
-
-You must supply one, two or three sets of identifiers -- corresponding
-to one, two or three circles on the Venn Diagram.
-
-In general you should also give the full list of all the identifiers
-explicitly. This is used to calculate the number of identifers outside
-the circles (and check the identifiers in the other files match up).
-The full list can be omitted by implicitly taking the union of the
-category sets. In this case, the count outside the categories (circles)
-will always be zero.
-
-The identifiers can be taken from the first column of a tabular file
-(e.g. query names in BLAST tabular output, or signal peptide predictions
-after filtering, etc), or from a sequence file (FASTA, FASTQ, SFF).
-
-For example, you may have a set of NGS reads (as a FASTA, FASTQ or SFF
-file), and the results of several different read mappings (e.g. to
-different references) as tabular files (filtered to have just the mapped
-reads). You could then show the different mappings (and their overlaps)
-as a Venn Diagram, and the outside count would be the unmapped reads.
-
-**Citations**
-
-The Venn Diagrams are drawn using Gordon Smyth's limma package from
-R/Bioconductor, http://www.bioconductor.org/
-
-The R library is called from Python via rpy, http://rpy.sourceforge.net/
-
-If you use this Galaxy tool in work leading to a scientific publication please
-cite:
-
-Peter J.A. Cock, Björn A. Grüning, Konrad Paszkiewicz and Leighton Pritchard (2013).
-Galaxy tools and workflows for sequence analysis with applications
-in molecular plant pathology. PeerJ 1:e167
-http://dx.doi.org/10.7717/peerj.167
-
-This tool uses Biopython to read and write SFF files, so you may also wish to
-cite the Biopython application note (and Galaxy too of course):
-
-Cock et al 2009. Biopython: freely available Python tools for computational
-molecular biology and bioinformatics. Bioinformatics 25(11) 1422-3.
-http://dx.doi.org/10.1093/bioinformatics/btp163 pmid:19304878.
-
-    </help>
-    <citations>
-        <citation type="doi">10.7717/peerj.167</citation>
-        <citation type="doi">10.1093/bioinformatics/15.5.356</citation>
-    </citations>
-</tool>
+<tool id="venn_list" name="Venn Diagram" version="0.0.10">
+    <description>from lists</description>
+    <requirements>
+        <requirement type="package" version="1.0.1">galaxy_sequence_utils</requirement>
+        <requirement type="python-module">rpy</requirement>
+        <requirement type="python-module">Bio</requirement>
+        <requirement type="package" version="1.0.3">rpy</requirement>
+        <requirement type="package" version="3.25.3">limma</requirement>
+        <requirement type="package" version="1.65">biopython</requirement>
+    </requirements>
+    <stdio>
+        <!-- Anything other than zero is an error -->
+        <exit_code range="1:" />
+        <exit_code range=":-1" />
+    </stdio>
+    <command interpreter="python">
+venn_list.py
+#if $universe.type_select=="implicit":
+  - -
+#else:
+  "$main" $main.ext
+#end if
+"$main_lab"
+#for $s in $sets:
+  "$s.set" $s.set.ext "$s.lab"
+#end for
+$PDF
+    </command>
+    <inputs>
+        <param name="main_lab" size="30" type="text" value="Venn Diagram" label="Plot title"/>
+        <conditional name="universe">
+            <param name="type_select" type="select" label="Implicit or explicit full ID list?">
+                <option value="explicit">Explicit</option>
+                <option value="implicit">Implicit (use union of sets below)</option>
+            </param>
+            <when value="explicit">
+                 <param name="main" type="data" format="tabular,fasta,fastq,sff" label="Full dataset (with all identifiers)" help="Tabular file (uses column one), FASTA, FASTQ or SFF file."/>
+            </when>
+            <when value="implicit"/>
+        </conditional>
+        <repeat name="sets" min="1" max="3" title="Sets">
+            <param name="set" type="data" format="tabular,fasta,fastq,sff" label="Members of set" help="Tabular file (uses column one), FASTA, FASTQ or SFF file."/>
+            <param name="lab" size="30" type="text" value="Group" label="Caption for set"/>
+        </repeat>
+    </inputs>
+    <outputs>
+        <data format="pdf" name="PDF" />
+    </outputs>
+    <tests>
+         <!-- Doesn't seem to work properly, manages to get two sets, both
+              with same FASTA file, but second with default "Group" label. -->
+        <test>
+            <param name="type_select" value="explicit"/>
+            <param name="main" value="venn_list.tabular" ftype="tabular"/>
+            <param name="main_lab" value="Some Proteins"/>
+            <param name="set" value="rhodopsin_proteins.fasta"/>
+            <param name="lab" value="Rhodopsins"/>
+            <output name="PDF" file="magic.pdf" ftype="pdf" compare="contains" />
+            <assert_stdout>
+                <has_line line="Doing 1-way Venn Diagram" />
+                <has_line line="Total of 10 IDs" />
+                <has_line line="6 in Rhodopsins" />
+            </assert_stdout>
+        </test>
+        <test>
+            <param name="type_select" value="implicit"/>
+            <param name="sets_0|set" value="rhodopsin_proteins.fasta"/>
+            <param name="sets_0|lab" value="Rhodopsins"/>
+            <param name="sets_1|set" value="four_human_proteins.fasta"/>
+            <param name="sets_1|lab" value="Human"/>
+            <param name="sets_2|set" value="blastp_four_human_vs_rhodopsin.tabular"/>
+            <param name="sets_2|lab" value="Human vs Rhodopsin BLAST"/>
+            <output name="PDF" file="magic.pdf" ftype="pdf" compare="contains" />
+            <assert_stdout>
+                <has_line line="Doing 3-way Venn Diagram" />
+                <has_line line="Inferred total of 10 IDs" />
+                <has_line line="6 in Rhodopsins" />
+                <has_line line="4 in Human" />
+                <has_line line="1 in Human vs Rhodopsin BLAST" />
+            </assert_stdout>
+        </test>
+        <test expect_failure="true" expect_exit_code="1">
+            <param name="type_select" value="explicit"/>
+            <param name="main" value="venn_list.tabular" ftype="tabular"/>
+            <param name="main_lab" value="Some Proteins"/>
+            <param name="sets_0|set" value="rhodopsin_proteins.fasta"/>
+            <param name="sets_0|lab" value="Rhodopsins"/>
+            <param name="sets_1|set" value="four_human_proteins.fasta"/>
+            <param name="sets_1|lab" value="Human"/>
+            <param name="sets_2|set" value="blastp_four_human_vs_rhodopsin.tabular"/>
+            <param name="sets_2|lab" value="Human vs Rhodopsin BLAST"/>
+            <assert_stdout>
+                <has_line line="Doing 3-way Venn Diagram" />
+                <has_line line="Total of 10 IDs" />
+            </assert_stdout>
+            <assert_stderr>
+                <has_text_matching expression="Unexpected ID sp|Q9BS26|ERP44_HUMAN in fasta file *" />
+            </assert_stderr>
+        </test>
+    </tests>
+    <help>
+
+.. class:: infomark
+
+**TIP:** If your data is in tabular files, the identifier is assumed to be in column one.
+
+**What it does**
+
+Draws Venn Diagram for one, two or three sets (as a PDF file).
+
+You must supply one, two or three sets of identifiers -- corresponding
+to one, two or three circles on the Venn Diagram.
+
+In general you should also give the full list of all the identifiers
+explicitly. This is used to calculate the number of identifers outside
+the circles (and check the identifiers in the other files match up).
+The full list can be omitted by implicitly taking the union of the
+category sets. In this case, the count outside the categories (circles)
+will always be zero.
+
+The identifiers can be taken from the first column of a tabular file
+(e.g. query names in BLAST tabular output, or signal peptide predictions
+after filtering, etc), or from a sequence file (FASTA, FASTQ, SFF).
+
+For example, you may have a set of NGS reads (as a FASTA, FASTQ or SFF
+file), and the results of several different read mappings (e.g. to
+different references) as tabular files (filtered to have just the mapped
+reads). You could then show the different mappings (and their overlaps)
+as a Venn Diagram, and the outside count would be the unmapped reads.
+
+**Citations**
+
+The Venn Diagrams are drawn using Gordon Smyth's limma package from
+R/Bioconductor, http://www.bioconductor.org/
+
+The R library is called from Python via rpy, http://rpy.sourceforge.net/
+
+If you use this Galaxy tool in work leading to a scientific publication please
+cite:
+
+Peter J.A. Cock, Björn A. Grüning, Konrad Paszkiewicz and Leighton Pritchard (2013).
+Galaxy tools and workflows for sequence analysis with applications
+in molecular plant pathology. PeerJ 1:e167
+http://dx.doi.org/10.7717/peerj.167
+
+This tool uses Biopython to read and write SFF files, so you may also wish to
+cite the Biopython application note (and Galaxy too of course):
+
+Cock et al 2009. Biopython: freely available Python tools for computational
+molecular biology and bioinformatics. Bioinformatics 25(11) 1422-3.
+http://dx.doi.org/10.1093/bioinformatics/btp163 pmid:19304878.
+
+    </help>
+    <citations>
+        <citation type="doi">10.7717/peerj.167</citation>
+        <citation type="doi">10.1093/bioinformatics/15.5.356</citation>
+    </citations>
+</tool>