Repository 'ncbi_blast_plus'
hg clone https://testtoolshed.g2.bx.psu.edu/repos/devteam/ncbi_blast_plus

Changeset 10:e6337ef07e9a (2016-03-09)
Previous changeset 9:1039cd165d92 (2015-11-19) Next changeset 11:4c47abb4c993 (2016-03-09)
Commit message:
v0.1.08 can search against multiple locally installed databases
modified:
test-data/blastdb.loc
tools/ncbi_blast_plus/README.rst
tools/ncbi_blast_plus/blastxml_to_tabular.py
tools/ncbi_blast_plus/check_no_duplicates.py
tools/ncbi_blast_plus/ncbi_blastdbcmd_info.xml
tools/ncbi_blast_plus/ncbi_blastn_wrapper.xml
tools/ncbi_blast_plus/ncbi_macros.xml
added:
test-data/blastn_chimera_vs_rhodopsin_db.tabular
test-data/blastn_chimera_vs_three_human_and_rhodopsin_db.tabular
test-data/blastn_chimera_vs_three_human_db.tabular
test-data/rhodopsin_nucs.dbinfo.txt
test-data/rhodopsin_nucs.fasta.log.txt
test-data/rhodopsin_nucs.fasta.nhd
test-data/rhodopsin_nucs.fasta.nhi
test-data/rhodopsin_nucs.fasta.nhr
test-data/rhodopsin_nucs.fasta.nin
test-data/rhodopsin_nucs.fasta.nog
test-data/rhodopsin_nucs.fasta.nsd
test-data/rhodopsin_nucs.fasta.nsi
test-data/rhodopsin_nucs.fasta.nsq
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/blastdb.loc
--- a/test-data/blastdb.loc Thu Nov 19 06:15:32 2015 -0500
+++ b/test-data/blastdb.loc Wed Mar 09 06:02:38 2016 -0500
b
@@ -5,3 +5,4 @@
 # See the file tool-data/blastdb.loc.sample for more information.
 #
 three_human_mRNA Three Human mRNAs ${__HERE__}/three_human_mRNA.fasta
+rhodopsin_nucs Rhodopsin nucleotides ${__HERE__}/rhodopsin_nucs.fasta
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/blastn_chimera_vs_rhodopsin_db.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastn_chimera_vs_rhodopsin_db.tabular Wed Mar 09 06:02:38 2016 -0500
b
@@ -0,0 +1,8 @@
+chimera gi|57163782|ref|NM_001009242.1| 92.31 1014 78 0 8881 9894 34 1047 0.0 1441
+chimera gi|283855822|gb|GQ290312.1| 91.53 956 81 0 8881 9836 4 959 0.0 1317
+chimera gi|18148870|dbj|AB062417.1| 87.65 1012 123 2 8884 9894 37 1047 0.0 1175
+chimera gi|283855845|gb|GQ290303.1| 91.52 330 28 0 8881 9210 4 333 8e-130 455
+chimera gi|283855845|gb|GQ290303.1| 91.36 243 19 2 9542 9783 3127 3368 1e-92 331
+chimera gi|283855845|gb|GQ290303.1| 94.22 173 10 0 9208 9380 1410 1582 1e-72 265
+chimera gi|283855845|gb|GQ290303.1| 92.94 170 12 0 9375 9544 2854 3023 2e-67 248
+chimera gi|283855845|gb|GQ290303.1| 95.59 68 3 0 9781 9848 4222 4289 7e-26 110
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/blastn_chimera_vs_three_human_and_rhodopsin_db.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastn_chimera_vs_three_human_and_rhodopsin_db.tabular Wed Mar 09 06:02:38 2016 -0500
b
@@ -0,0 +1,11 @@
+chimera ENA|AB011145|AB011145.1 100.00 4560 0 0 1 4560 121 4680 0.0 8421
+chimera ENA|M10051|M10051.1 99.93 4331 3 0 4560 8890 60 4390 0.0 7982
+chimera ENA|BC112106|BC112106.1 100.00 1093 0 0 8881 9973 121 1213 0.0 2019
+chimera gi|57163782|ref|NM_001009242.1| 92.31 1014 78 0 8881 9894 34 1047 0.0 1441
+chimera gi|283855822|gb|GQ290312.1| 91.53 956 81 0 8881 9836 4 959 0.0 1317
+chimera gi|18148870|dbj|AB062417.1| 87.65 1012 123 2 8884 9894 37 1047 0.0 1175
+chimera gi|283855845|gb|GQ290303.1| 91.52 330 28 0 8881 9210 4 333 2e-129 455
+chimera gi|283855845|gb|GQ290303.1| 91.36 243 19 2 9542 9783 3127 3368 3e-92 331
+chimera gi|283855845|gb|GQ290303.1| 94.22 173 10 0 9208 9380 1410 1582 3e-72 265
+chimera gi|283855845|gb|GQ290303.1| 92.94 170 12 0 9375 9544 2854 3023 3e-67 248
+chimera gi|283855845|gb|GQ290303.1| 95.59 68 3 0 9781 9848 4222 4289 2e-25 110
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/blastn_chimera_vs_three_human_db.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastn_chimera_vs_three_human_db.tabular Wed Mar 09 06:02:38 2016 -0500
b
@@ -0,0 +1,3 @@
+chimera ENA|AB011145|AB011145.1 100.00 4560 0 0 1 4560 121 4680 0.0 8421
+chimera ENA|M10051|M10051.1 99.93 4331 3 0 4560 8890 60 4390 0.0 7982
+chimera ENA|BC112106|BC112106.1 100.00 1093 0 0 8881 9973 121 1213 0.0 2019
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/rhodopsin_nucs.dbinfo.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/rhodopsin_nucs.dbinfo.txt Wed Mar 09 06:02:38 2016 -0500
b
@@ -0,0 +1,7 @@
+Database: Rhodopsin nucleotides
+ 6 sequences; 10,296 total bases
+
+Date: Mar 8, 2016  4:58 PM Longest sequence: 4,301 bases
+
+Volumes:
+ /mnt/galaxy/repositories/galaxy_blast/test-data/rhodopsin_nucs.fasta
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/rhodopsin_nucs.fasta.log.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/rhodopsin_nucs.fasta.log.txt Wed Mar 09 06:02:38 2016 -0500
b
@@ -0,0 +1,5 @@
+New DB title:  Rhodopsin nucleotides
+Sequence type: Nucleotide
+Keep Linkouts: T
+Keep MBits: T
+Maximum file size: 1000000000B
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/rhodopsin_nucs.fasta.nhd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/rhodopsin_nucs.fasta.nhd Wed Mar 09 06:02:38 2016 -0500
b
@@ -0,0 +1,6 @@
+12397459091
+20759409394
+22689758313
+28815213262
+36620822910
+40074407105
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/rhodopsin_nucs.fasta.nhi
b
Binary file test-data/rhodopsin_nucs.fasta.nhi has changed
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/rhodopsin_nucs.fasta.nhr
b
Binary file test-data/rhodopsin_nucs.fasta.nhr has changed
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/rhodopsin_nucs.fasta.nin
b
Binary file test-data/rhodopsin_nucs.fasta.nin has changed
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/rhodopsin_nucs.fasta.nog
b
Binary file test-data/rhodopsin_nucs.fasta.nog has changed
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/rhodopsin_nucs.fasta.nsd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/rhodopsin_nucs.fasta.nsd Wed Mar 09 06:02:38 2016 -0500
b
@@ -0,0 +1,6 @@
+gnl|bl_ord_id|00
+gnl|bl_ord_id|11
+gnl|bl_ord_id|22
+gnl|bl_ord_id|33
+gnl|bl_ord_id|44
+gnl|bl_ord_id|55
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/rhodopsin_nucs.fasta.nsi
b
Binary file test-data/rhodopsin_nucs.fasta.nsi has changed
b
diff -r 1039cd165d92 -r e6337ef07e9a test-data/rhodopsin_nucs.fasta.nsq
b
Binary file test-data/rhodopsin_nucs.fasta.nsq has changed
b
diff -r 1039cd165d92 -r e6337ef07e9a tools/ncbi_blast_plus/README.rst
--- a/tools/ncbi_blast_plus/README.rst Thu Nov 19 06:15:32 2015 -0500
+++ b/tools/ncbi_blast_plus/README.rst Wed Mar 09 06:02:38 2016 -0500
b
@@ -1,14 +1,14 @@
 Galaxy wrappers for NCBI BLAST+ suite
 =====================================
 
-These wrappers are copyright 2010-2014 by Peter Cock (The James Hutton Institute,
+These wrappers are copyright 2010-2016 by Peter Cock (The James Hutton Institute,
 UK) and additional contributors including Edward Kirton, John Chilton,
 Nicola Soranzo, Jim Johnson, and Bjoern Gruening.
 
 See the licence text below.
 
-Currently tested with NCBI BLAST 2.2.30+ (i.e. version 2.2.30 of BLAST+),
-and does not work with the NCBI 'legacy' BLAST suite (e.g. ``blastall``).
+Currently tested with NCBI BLAST+ 2.2.31, and does not work with the NCBI
+'legacy' BLAST suite (e.g. ``blastall``).
 
 Note that these wrappers (and the associated datatypes) were originally
 distributed as part of the main Galaxy repository, but as of August 2012
@@ -227,6 +227,8 @@
           on the Tool Shed test framework, but that is not currently in use).
         - Fixed macro problem with version field in blastxml_to_tabular.xml
           (contribution from Bjoern Gruening and Daniel Blankenberg).
+v0.1.08 - Allow searching against multiple locally installed databases
+          (contribution from Gildas Le CorguillĂ© and Emma Prudent).
 ======= ======================================================================
 
 
b
diff -r 1039cd165d92 -r e6337ef07e9a tools/ncbi_blast_plus/blastxml_to_tabular.py
--- a/tools/ncbi_blast_plus/blastxml_to_tabular.py Thu Nov 19 06:15:32 2015 -0500
+++ b/tools/ncbi_blast_plus/blastxml_to_tabular.py Wed Mar 09 06:02:38 2016 -0500
[
b'@@ -8,7 +8,7 @@\n The 12 columns output are \'qseqid sseqid pident length mismatch gapopen qstart\n qend sstart send evalue bitscore\' or \'std\' at the BLAST+ command line, which\n mean:\n-   \n+\n ====== ========= ============================================\n Column NCBI name Description\n ------ --------- --------------------------------------------\n@@ -69,23 +69,20 @@\n     print "v0.1.04"\n     sys.exit(0)\n \n-if sys.version_info[:2] >= ( 2, 5 ):\n+if sys.version_info[:2] >= (2, 5):\n     try:\n         from xml.etree import cElementTree as ElementTree\n     except ImportError:\n         from xml.etree import ElementTree as ElementTree\n else:\n     from galaxy import eggs\n-    import pkg_resources; pkg_resources.require( "elementtree" )\n+    import pkg_resources\n+    pkg_resources.require("elementtree")\n     from elementtree import ElementTree\n \n-def stop_err( msg ):\n-    sys.stderr.write("%s\\n" % msg)\n-    sys.exit(1)\n-\n if len(sys.argv) == 4 and sys.argv[3] in ["std", "x22", "ext"]:\n-    #False positive if user really has a BLAST XML file called \'std\' or \'ext\'...\n-    stop_err("""ERROR: The script API has changed, sorry.\n+    # False positive if user really has a BLAST XML file called \'std\' or \'ext\'...\n+    sys.exit("""ERROR: The script API has changed, sorry.\n \n Instead of the old style:\n \n@@ -116,35 +113,35 @@\n colnames = \'qseqid,sseqid,pident,length,mismatch,gapopen,qstart,qend,sstart,send,evalue,bitscore,sallseqid,score,nident,positive,gaps,ppos,qframe,sframe,qseq,sseq,qlen,slen,salltitles\'.split(\',\')\n \n if len(args) < 1:\n-    stop_err("ERROR: No BLASTXML input files given; run with --help to see options.")\n+    sys.exit("ERROR: No BLASTXML input files given; run with --help to see options.")\n \n out_fmt = options.columns\n if out_fmt == "std":\n     extended = False\n     cols = None\n elif out_fmt == "x22":\n-    stop_err("Format argument x22 has been replaced with ext (extended 25 columns)")\n+    sys.exit("Format argument x22 has been replaced with ext (extended 25 columns)")\n elif out_fmt == "ext":\n     extended = True\n     cols = None\n else:\n-    cols = out_fmt.replace(" ", ",").split(",") #Allow space or comma separated\n-    #Remove any blank entries due to trailing comma,\n-    #or annoying "None" dummy value from Galaxy if no columns\n+    cols = out_fmt.replace(" ", ",").split(",")  # Allow space or comma separated\n+    # Remove any blank entries due to trailing comma,\n+    # or annoying "None" dummy value from Galaxy if no columns\n     cols = [c for c in cols if c and c != "None"]\n     extra = set(cols).difference(colnames)\n     if extra:\n-        stop_err("These are not recognised column names: %s" % ",".join(sorted(extra)))\n+        sys.exit("These are not recognised column names: %s" % ",".join(sorted(extra)))\n     del extra\n     assert set(colnames).issuperset(cols), cols\n     if not cols:\n-        stop_err("No columns selected!")\n-    extended = max(colnames.index(c) for c in cols) >= 12 #Do we need any higher columns?\n+        sys.exit("No columns selected!")\n+    extended = max(colnames.index(c) for c in cols) >= 12  # Do we need any higher columns?\n del out_fmt\n \n for in_file in args:\n     if not os.path.isfile(in_file):\n-        stop_err("Input BLAST XML file not found: %s" % in_file)\n+        sys.exit("Input BLAST XML file not found: %s" % in_file)\n \n \n re_default_query_id = re.compile("^Query_\\d+$")\n@@ -161,156 +158,157 @@\n def convert(blastxml_filename, output_handle):\n     blast_program = None\n     # get an iterable\n-    try: \n+    try:\n         context = ElementTree.iterparse(blastxml_filename, events=("start", "end"))\n-    except:\n-        stop_err("Invalid data format.")\n+    except Exception:\n+        sys.exit("Invalid data format.")\n     # turn it into an iterator\n     context = iter(context)\n     # get the root element\n     try:\n         event, root = context.next()\n-    except:\n-        stop_err( "Invalid data format." )\n+    except Exception:\n+        sys.exit("Invalid data format.")\n     for event, elem in cont'..b'                         hsp.findtext("Hsp_query-from"),  # qstart,\n+                              hsp.findtext("Hsp_query-to"),  # qend,\n+                              hsp.findtext("Hsp_hit-from"),  # sstart,\n+                              hsp.findtext("Hsp_hit-to"),  # send,\n+                              evalue,  # hsp.findtext("Hsp_evalue") in scientific notation\n+                              bitscore,  # hsp.findtext("Hsp_bit-score") rounded\n                               ]\n \n                     if extended:\n                         try:\n-                            sallseqid = ";".join(name.split(None,1)[0] for name in hit_def.split(" >"))\n-                            salltitles = "<>".join(name.split(None,1)[1] for name in hit_def.split(" >"))\n+                            sallseqid = ";".join(name.split(None, 1)[0] for name in hit_def.split(" >"))\n+                            salltitles = "<>".join(name.split(None, 1)[1] for name in hit_def.split(" >"))\n                         except IndexError as e:\n-                            stop_err("Problem splitting multuple hits?\\n%r\\n--> %s" % (hit_def, e))\n-                        #print hit_def, "-->", sallseqid\n+                            sys.exit("Problem splitting multuple hits?\\n%r\\n--> %s" % (hit_def, e))\n+                        # print hit_def, "-->", sallseqid\n                         positive = hsp.findtext("Hsp_positive")\n-                        ppos = "%0.2f" % (100*float(positive)/float(length))\n+                        ppos = "%0.2f" % (100 * float(positive) / float(length))\n                         qframe = hsp.findtext("Hsp_query-frame")\n                         sframe = hsp.findtext("Hsp_hit-frame")\n                         if blast_program == "blastp":\n-                            #Probably a bug in BLASTP that they use 0 or 1 depending on format\n-                            if qframe == "0": qframe = "1"\n-                            if sframe == "0": sframe = "1"\n+                            # Probably a bug in BLASTP that they use 0 or 1 depending on format\n+                            if qframe == "0":\n+                                qframe = "1"\n+                            if sframe == "0":\n+                                sframe = "1"\n                         slen = int(hit.findtext("Hit_len"))\n                         values.extend([sallseqid,\n-                                       hsp.findtext("Hsp_score"), #score,\n+                                       hsp.findtext("Hsp_score"),  # score,\n                                        nident,\n                                        positive,\n-                                       hsp.findtext("Hsp_gaps"), #gaps,\n+                                       hsp.findtext("Hsp_gaps"),  # gaps,\n                                        ppos,\n                                        qframe,\n                                        sframe,\n-                                       #NOTE - for blastp, XML shows original seq, tabular uses XXX masking\n+                                       # NOTE - for blastp, XML shows original seq, tabular uses XXX masking\n                                        q_seq,\n                                        h_seq,\n                                        str(qlen),\n@@ -318,9 +316,9 @@\n                                        salltitles,\n                                        ])\n                     if cols:\n-                        #Only a subset of the columns are needed\n+                        # Only a subset of the columns are needed\n                         values = [values[colnames.index(c)] for c in cols]\n-                    #print "\\t".join(values) \n+                    # print "\\t".join(values)\n                     output_handle.write("\\t".join(values) + "\\n")\n             # prevents ElementTree from growing large datastructure\n             root.clear()\n@@ -339,6 +337,5 @@\n if options.output:\n     outfile.close()\n else:\n-    #Using stdout\n+    # Using stdout\n     pass\n-\n'
b
diff -r 1039cd165d92 -r e6337ef07e9a tools/ncbi_blast_plus/check_no_duplicates.py
--- a/tools/ncbi_blast_plus/check_no_duplicates.py Thu Nov 19 06:15:32 2015 -0500
+++ b/tools/ncbi_blast_plus/check_no_duplicates.py Wed Mar 09 06:02:38 2016 -0500
[
@@ -16,30 +16,27 @@
     print("v0.0.22")
     sys.exit(0)
 
-def stop_err(msg, error=1):
-    sys.stderr.write("%s\n" % msg)
-    sys.exit(error)
-
-
 identifiers = set()
 files = 0
 for filename in sys.argv[1:]:
     if not os.path.isfile(filename):
-        stop_err("Missing FASTA file %r" % filename, 2)
+        sys.stderr.write("Missing FASTA file %r\n" % filename)
+        sys.exit(2)
     files += 1
     handle = open(filename)
     for line in handle:
         if line.startswith(">"):
-            #The split will also take care of the new line character,
-            #e.g. ">test\n" and ">test description here\n" both give "test"
+            # The split will also take care of the new line character,
+            # e.g. ">test\n" and ">test description here\n" both give "test"
             seq_id = line[1:].split(None, 1)[0]
             if seq_id in identifiers:
                 handle.close()
-                stop_err("Repeated identifiers, e.g. %r" % seq_id, 1)
+                sys.exit("Repeated identifiers, e.g. %r" % seq_id)
             identifiers.add(seq_id)
     handle.close()
 if not files:
-    stop_err("No FASTA files given to check for duplicates", 3)
+    sys.stderr.write("No FASTA files given to check for duplicates\n")
+    sys.exit(3)
 elif files == 1:
     print("%i sequences" % len(identifiers))
 else:
b
diff -r 1039cd165d92 -r e6337ef07e9a tools/ncbi_blast_plus/ncbi_blastdbcmd_info.xml
--- a/tools/ncbi_blast_plus/ncbi_blastdbcmd_info.xml Thu Nov 19 06:15:32 2015 -0500
+++ b/tools/ncbi_blast_plus/ncbi_blastdbcmd_info.xml Wed Mar 09 06:02:38 2016 -0500
b
@@ -25,6 +25,11 @@
             <param name="db_opts|database" value="three_human_mRNA" />
             <output name="info" file="three_human_mRNA.dbinfo.txt" ftype="txt" lines_diff="4" />
         </test>
+        <test>
+            <param name="db_opts|db_type" value="nucl" />
+            <param name="db_opts|database" value="rhodopsin_nucs" />
+            <output name="info" file="rhodopsin_nucs.dbinfo.txt" ftype="txt" lines_diff="4" />
+        </test>
     </tests>
     <help>
     
b
diff -r 1039cd165d92 -r e6337ef07e9a tools/ncbi_blast_plus/ncbi_blastn_wrapper.xml
--- a/tools/ncbi_blast_plus/ncbi_blastn_wrapper.xml Thu Nov 19 06:15:32 2015 -0500
+++ b/tools/ncbi_blast_plus/ncbi_blastn_wrapper.xml Wed Mar 09 06:02:38 2016 -0500
b
@@ -120,6 +120,28 @@
             <param name="max_hits" value="1" />
             <output name="output1" file="blastn_chimera_vs_three_human_max1.txt" ftype="txt" />
         </test>
+        <test>
+            <param name="query" value="chimera.fasta" ftype="fasta" />
+            <param name="db_opts_selector" value="db" />
+            <param name="database" value="three_human_mRNA" />
+            <param name="out_format" value="6" />
+            <output name="output1" file="blastn_chimera_vs_three_human_db.tabular" ftype="tabular" />
+        </test>
+        <test>
+            <param name="query" value="chimera.fasta" ftype="fasta" />
+            <param name="db_opts_selector" value="db" />
+            <param name="database" value="rhodopsin_nucs" />
+            <param name="out_format" value="6" />
+            <output name="output1" file="blastn_chimera_vs_rhodopsin_db.tabular" ftype="tabular" />
+        </test>
+        <!-- next test is passing in two blast databases -->
+        <test>
+            <param name="query" value="chimera.fasta" ftype="fasta" />
+            <param name="db_opts_selector" value="db" />
+            <param name="database" value="three_human_mRNA,rhodopsin_nucs" />
+            <param name="out_format" value="6" />
+            <output name="output1" file="blastn_chimera_vs_three_human_and_rhodopsin_db.tabular" ftype="tabular" />
+        </test>
     </tests>
     <help>
     
b
diff -r 1039cd165d92 -r e6337ef07e9a tools/ncbi_blast_plus/ncbi_macros.xml
--- a/tools/ncbi_blast_plus/ncbi_macros.xml Thu Nov 19 06:15:32 2015 -0500
+++ b/tools/ncbi_blast_plus/ncbi_macros.xml Wed Mar 09 06:02:38 2016 -0500
b
@@ -1,5 +1,5 @@
 <macros>
-    <token name="@WRAPPER_VERSION@">0.1.07</token>
+    <token name="@WRAPPER_VERSION@">0.1.08</token>
     <xml name="parallelism">
         <!-- If job splitting is enabled, break up the query file into parts -->
         <parallelism method="multi" split_inputs="query" split_mode="to_size" split_size="1000" merge_outputs="output1" />
@@ -184,7 +184,7 @@
               <option value="file">FASTA file from your history (see warning note below)</option>
             </param>
             <when value="db">
-                <param name="database" type="select" label="Nucleotide BLAST database">
+                <param name="database" type="select" multiple="true" label="Nucleotide BLAST database">
                     <options from_data_table="blastdb" />
                 </param>
                 <param name="histdb" type="hidden" value="" />
@@ -210,7 +210,7 @@
               <option value="file">FASTA file from your history (see warning note below)</option>
             </param>
             <when value="db">
-                <param name="database" type="select" label="Protein BLAST database">
+                <param name="database" type="select" multiple="true" label="Protein BLAST database">
                     <options from_data_table="blastdb_p" />
                 </param>
                 <param name="histdb" type="hidden" value="" />
@@ -255,12 +255,12 @@
               <option value="prot">Protein</option>
             </param>
             <when value="nucl">
-                <param name="database" type="select" label="Nucleotide BLAST database">
+                <param name="database" type="select" multiple="true" label="Nucleotide BLAST database">
                     <options from_data_table="blastdb" />
                 </param>
             </when>
             <when value="prot">
-                <param name="database" type="select" label="Protein BLAST database">
+                <param name="database" type="select" multiple="true" label="Protein BLAST database">
                     <options from_data_table="blastdb_p" />
                 </param>
             </when>
@@ -352,7 +352,7 @@
     <token name="@THREADS@">-num_threads "\${GALAXY_SLOTS:-8}"</token>
     <token name="@BLAST_DB_SUBJECT@">
 #if $db_opts.db_opts_selector == "db":
-  -db "${db_opts.database.fields.path}"
+  -db "${' '.join(str( $db_opts.database.fields.path ).split( ',' ))}"
 #elif $db_opts.db_opts_selector == "histdb":
   -db "${os.path.join($db_opts.histdb.extra_files_path,'blastdb')}"
 #else: