Repository 'blast_reporting'
hg clone https://toolshed.g2.bx.psu.edu/repos/damion/blast_reporting

Changeset 0:7db7ecc78ad6 (2015-03-02)
Next changeset 1:812de0e282bd (2015-03-03)
Commit message:
Uploaded
added:
LICENSE.md
README.md
blast_reporting.py
blast_reporting.xml
blast_reporting_fields.tab
common.py
doc/blast_reporting.pdf
fasta_reference_dbs.tab
panel_layout.css
reference_bins.py
templates/__init__.py
templates/html_report.py
templates/html_report_footer.html
templates/html_report_header.html
templates/html_selectable_report.py
templates/html_selectable_report_tool_state.txt
test-data/blast_reporting_1.blastxml
test-data/blast_reporting_1a.tabular
test-data/blast_reporting_1b.tabular
test-data/blast_reporting_1c.tabular
test-data/blast_reporting_1c1.tabular
test-data/blastx_sample.xml
test-data/blastx_sample_converted.tabular
tool-data/blast_reporting_fields.loc.sample
tool-data/blast_reporting_templates.loc.sample
tool-data/fasta_reference_dbs.loc.sample
tool_conf.xml.sample
tool_data_table_conf.xml.sample
b
diff -r 000000000000 -r 7db7ecc78ad6 LICENSE.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/LICENSE.md Mon Mar 02 20:46:00 2015 -0500
b
b'@@ -0,0 +1,48 @@\n+Source Code License\n+\n+An Open Source Initiative (OSI) approved license\n+blast_reporting source code is licensed under the Academic Free License version 3.0.\n+\n+Licensed under the Academic Free License version 3.0\n+\n+1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following:\n+\n+a) to reproduce the Original Work in copies, either alone or as part of a collective work;\n+\n+b) to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work;\n+\n+c) to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor\'s reserved rights and remedies, in this Academic Free License;\n+\n+d) to perform the Original Work publicly; and\n+\n+e) to display the Original Work publicly.\n+\n+2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works.\n+\n+3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work.\n+\n+4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor\'s trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license.\n+\n+5) External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c).\n+\n+6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to infor'..b'e is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c).\n+\n+10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.\n+\n+11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License.\n+\n+12) Attorneys\' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys\' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.\n+\n+13) Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.\n+\n+14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n+\n+15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.\n+\n+16) Modification of This License. This License is Copyright \xc2\xa9 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process.\n'
b
diff -r 000000000000 -r 7db7ecc78ad6 README.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md Mon Mar 02 20:46:00 2015 -0500
b
@@ -0,0 +1,42 @@
+# blast_reporting
+NCBI BLAST+ searches can output in a range of formats, but in the past only the XML format included fields like sequence description. This tool converts the NCBI BLAST XML report into 12, 24, 26 or custom column tabular and HTML reports.  It is used as a command-line tool or via a Galaxy bioinformatics platform tool.
+
+The tool allows almost complete control over which fields are displayed and filtered, how columns are named, and how the HTML report on each query is sectioned.  Search result records can be filtered out based on values in numeric or textual fields.  Matches (by accession id) to a selection of reference databases can be shown, and this can include a description of the matched sequence.
+
+Currently this tool only takes as input the "Output format: BLAST XML" option of the NCBI Blast+ search tool, triggered by (for example)
+
+blastn -outfmt 5 -query "...."
+
+or via Galaxy by selecting the NCBI Blast+ search tool's option towards bottom of form ...
+
+## Documentation
+A fairly comprehensive user guide is available in the doc/ folder.
+
+## Installation
+The tool can be installed from https://toolshed.g2.bx.psu.edu/ .  It draws upon the XML reports generated by the NCBI Blast+ tools.
+
+The setup of Reference Bins and the Selectable HTML Report are optional as described below.
+
+### Using ''Reference Bins''
+ - A reference bin file is simply a text file having line records each containing an accession id and a description.  The accession id is cross-referenced with the accession id returned with each search hit.  However we have to tell the Blast reporting tool where these tables are.  Their names and paths are listed in the fasta_reference_dbs.loc.sample, which ends up in the Galaxy install's tool-data/fasta_reference_dbs.loc file.
+Example:
+
+```
+AADS00000000.1 Phanerochaete chrysosporium RP-78
+AAEW02000014.2 Desulfuromonas acetoxidans DSM 684
+AAEY01000007.0 Cryptococcus neoformans var. neoformans B-3501A
+AAFI01000166 Dictyostelium discoideum AX4
+AAFW02000169.3 Saccharomyces cerevisiae YJM789
+```
+
+Both the search result hit and the reference file accession ids are stripped of any fractional component before being compared. 
+
+### Using the ''Selectable HTML Report'':
+ - This is EXPERIMENTAL because it currently requires the "select subsets" galaxy tool with a bit of extra setup that might have to be redone as Galaxy evolves:
+ - In Galaxy install and run the "Select subsets" tool from https://toolshed.g2.bx.psu.edu/.
+ - Use your browser's "View frame source" option while mouse is over the "Select subsets" form.
+ - Scroll down to the <input type="hidden" name="tool_state" value="..."> and copy the numeric value string into a new text file.
+ - save the text file with the name "html_selectable_report_tool_state" to the tool's templates/ subfolder.  It should be alongside the html_selectable_report.py script which reads it.
+
+## Development notes
+ - A few changes are in the works: A galaxy form tool fix sheduled in the next month will enable setup of reference databases to be much easier.  One will only have to load each reference bin file into a Galaxy data library you can set up.
b
diff -r 000000000000 -r 7db7ecc78ad6 blast_reporting.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/blast_reporting.py Mon Mar 02 20:46:00 2015 -0500
[
b'@@ -0,0 +1,627 @@\n+#!/usr/bin/python\n+"""Convert a BLAST XML file to 12 column tabular output\n+\n+This tool can be used both via command line and via a local Galaxy install.  \n+Galaxy uses .loc files as indicated by the tool_data_table_conf.xml.sample.\n+The command line version uses .tab versions of the above files: \n+\tblast_reporting_fields.loc\n+\tfasta_reference_dbs.loc\n+So for command-line use, ensure the .tab files are updated to their .loc counterparts.\n+ \n+Takes three command line options, input BLAST XML filename, output tabular\n+BLAST filename, output format (std for standard 12 columns, or ext for the\n+extended 24 columns offered in the BLAST+ wrappers).\n+\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+Column NCBI name Description\n+------ --------- --------------------------------------------\n+     1 qseqid    Query Seq-id (ID of your sequence)\n+     2 sseqid    Subject Seq-id (ID of the database hit)\n+     3 pident    Percentage of identical matches\n+     4 length    Alignment length\n+     5 mismatch  Number of mismatches\n+     6 gapopen   Number of gap openings\n+     7 qstart    Start of alignment in query\n+     8 qend      End of alignment in query\n+     9 sstart    Start of alignment in subject (database hit)\n+    10 send      End of alignment in subject (database hit)\n+    11 evalue    Expectation value (E-value)\n+    12 bitscore  Bit score\n+====== ========= ============================================\n+\n+The additional columns offered in the Galaxy BLAST+ wrappers are:\n+\n+====== ============= ===========================================\n+Column NCBI name     Description\n+------ ------------- -------------------------------------------\n+    13 sallseqid     All subject Seq-id(s), separated by a \';\'\n+    14 score         Raw score\n+    15 nident        Number of identical matches\n+    16 positive      Number of positive-scoring matches\n+    17 gaps          Total number of gaps\n+    18 ppos          Percentage of positive-scoring matches\n+    19 qframe        Query frame\n+    20 sframe        Subject frame\n+    21 qseq          Aligned part of query sequence\n+    22 sseq          Aligned part of subject sequence\n+    23 qlen          Query sequence length\n+    24 slen          Subject sequence length\n+====== ============= ===========================================\n+\n+Very slight modifications were made to the "BLAST XML to tabular" tool that\n+ships with Galaxy to output two more column columns:\n+\n+====== ============= ===========================================\n+Column NCBI name     Description\n+------ ------------- -------------------------------------------\n+    25 pcov          Percentage coverage\n+    26 sallseqdescr  All subject Seq-descr(s), separated by a \',\'\n+====== ============= ===========================================\n+\n+Most of these fields are given explicitly in the XML file, others some like\n+the percentage identity and the number of gap openings must be calculated.\n+\n+In addition an option exists to select particular columns for the output \n+report.  Reference bin columns will be added if they have been included in\n+search.\n+\n+A command line version can be used.  Type blast_reporting.py -h for help.\n+\n+Be aware that the sequence in the extended tabular output or XML direct from\n+BLAST+ may or may not use XXXX masking on regions of low complexity. This\n+can throw the off the calculation of percentage identity and gap openings.\n+[In fact, both BLAST 2.2.24+ and 2.2.25+ have a subtle bug in this regard,\n+with these numbers changing depending on whether or not the low complexity\n+filter is used.]\n+\n+This script attempts to produce identical output to what BLAST+ would have done.\n+However, check this with "diff -b ..." since BLAST+ sometimes includes an extra\n+space character (probably a bug).\n+\n+python blast_reporting'..b'utfile.write(tagGroup.outputTabDelimited())\n+\t\t\t\t\t\t\t\t\n+\t\t\t\t\t\troot.clear() # Clears references from root to (now unused) children to keep iterated datastructure small ???\n+\n+\t\t\t\telem.clear() # I think root.clear() cover this case.\n+\n+\t\troot.clear() \n+\t\toutfile.close()\n+\n+\n+\t\t# Use fast Linux "sort" after filtering & file write\n+\t\tcommon.fileSort(out_tabular_file, tagGroup.columns)\n+\n+\t\t"""\n+\t\tThe "Selection file" option is meant for galaxy UI use in conjunction \n+\t\twith the "Select Subsets on data" tool.  If a selection_file is called \n+\t\tfor, then we need to extract its id as well.  For that we have to test \n+\t\tfor somewhat odd expression from xml-generated command line, the \n+\t\t[$selection_file:$selection_file.hid:$selection_file.dataset_id:$selection_file.id]\n+\t\tSelection list doesn\'t necessarily need the HTML selectable report template, \n+\t\tbut that template was designed to feed the galaxy "Select subsets" tool with its data.\n+\t\t"""\n+\t\t\n+\t\tif len(args) > 4 and args[4] != \'None:None:None:None\': \n+\t\t\tselection_file_data = args[4]\n+\t\t\t\n+\t\t\t#print (\'selection file data:\' + selection_file_data)\n+\t\t\tsel_file_fields = selection_file_data.split(\':\')\n+\t\t\tselection_file = sel_file_fields[0]\n+\t\t\t# From galaxy, incoming format is $selection_file:$selection_file.hid:$selection_file.dataset_id:$selection_file.id\n+\t\t\t# From command line, user won\'t have specified any of this, so ignore.\n+\t\t\tif len(sel_file_fields) > 3:\n+\t\t\t\toptions.dataset_selection_id = sel_file_fields[3]\n+\t\t\t\n+\t\t\telse:\n+\t\t\t\toptions.dataset_selection_id = 0\n+\t\t\t\t\n+\t\t\tcommon.fileSelections(out_tabular_file, selection_file, tagGroup, options)\n+\t\t\n+\t\t\n+\t\t"""\n+\t\tWe must have a template in order to write anything to above html output file.\n+\t\tAll report templates need to be listed in the module\'s tabular data "blast_reporting_templates" folder.\n+\t\t# There are two possible HTML Report template locations: \n+\t\t# 1) The stock reports included in the module in the "templates/" subfolder, e.g. html_report.py\n+\t\t# 2) User customized templates.  To set this up:\n+\t\t\t- add a custom template folder in a location of your choice.\n+\t\t\t- Copy this module\'s templates folder into it.  \n+\t\t\t- The new folder must be in python\'s sys.path, which is achieved by adding a .pth file to python\'s site-packages folder..  E.g. set up /usr/lib/python2.6/site-packages/galaxy-custom-modules.pth to contain "/usr/local/galaxy/shared/python2.6_galaxy_custom_modules" \n+\t\t, and place \'templates_custom/html_report.py\' in there.\n+\t\t"""\n+\t\tif len(args) > 3:\n+\t\t\tout_html_file = args[3] #Galaxy-generated\t\n+\t\t\t# args[5] = html_template, default from galaxy xml is \'templates.html_report\', but testing can receive \'None\' value\n+\t\t\tif len(args) > 5 and len(args[5].strip()) > 0 and not args[5].strip() == \'None\': \n+\t\t\t\t\t\n+\t\t\t\thtml_template = args[5] #User-selected\n+\t\t\t\tif not html_template.translate(None, "._-" ).isalnum():\n+\t\t\t\t\tcommon.stop_err("The HTML Report template name is not correct.  It should be a python class path like templates.html_report)! : " + html_template)\n+\t\t\t\t\n+\t\t\telse:\n+\t\t\t\thtml_template = \'templates.html_report\'\n+\t\t\t\n+\t\t\ttry:\n+\t\t\t\t# See http://stackoverflow.com/questions/769534/dynamic-loading-of-python-modules\n+\t\t\t\tHTMLReportModule = __import__(html_template, fromlist=[\'does not in fact matter what goes here!\'])\n+\t\t\t\t# Now create final tabular, html (or future: xml) data\n+\t\t\t\thtmlManager = HTMLReportModule.HTMLReport(tagGroup, options, query_stats)\t\n+\t\t\t\t# htmlManager might not be initialized if the caller couldn\'t provide all the data the particular template needed.\n+\t\t\t\thtmlManager.render(out_tabular_file, out_html_file)\n+\t\t\t\t\n+\t\t\texcept ImportError:\n+\t\t\t\tcommon.stop_err("Unable to locate HTML Report template! : " + html_template)\n+\t\t\n+\t\t\n+\t\tcommon.fileTabular(out_tabular_file, tagGroup, options)\n+\t\t\n+\t\tprint(\'Execution time (seconds): \' + str(int(time.time()-time_start)))\n+\t\t\n+     \n+if __name__ == \'__main__\':\n+\t# Command line access\n+    reportEngine = ReportEngine()\n+    reportEngine.__main__()\n'
b
diff -r 000000000000 -r 7db7ecc78ad6 blast_reporting.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/blast_reporting.xml Mon Mar 02 20:46:00 2015 -0500
[
b'@@ -0,0 +1,309 @@\n+<tool id="blast_reporting" name="BLAST Reporting" version="1.0.5">\n+\t<description>BLAST search results reporting tool</description>\n+\t<command interpreter="python"><![CDATA[\n+\tblast_reporting.py \n+\t$blastxml_file \n+\t$out_format \n+\t$tabular_file \n+\t$html_file \n+\t$selection_file:$selection_file.hid:$selection_file.dataset_id:$selection_file.id \n+\t$html_template\n+\t-f "\n+\t#for $my_repeat in $filter_num\n+\t\t$my_repeat.filter_column:\n+\t\t#for $my_repeat2 in $my_repeat.constraint\n+\t\t\t$my_repeat2.filter_comparison $my_repeat2.filter_value,\n+\t\t#end for\n+\t\t;\n+\t#end for \n+\t#for $my_repeat in $filter_text \n+\t\t$my_repeat.filter_column2:\n+\t\t#for $my_repeat2 in $my_repeat.constraint2 \n+\t\t\t$my_repeat2.filter_comparison2 $my_repeat2.filter_value2.replace(\',\',\'|\'),\n+\t\t#end for\n+\t\t;\n+\t#end for\n+\t"\n+\t#if len($bins)\n+\t\t-b "\n+\t\t#for $my_repeat in $bins\n+\t\t\t$my_repeat.bin_column:$my_repeat.group:$my_repeat.filter:$my_repeat.description;\n+\t\t#end for\n+\t\t"\n+\t#end if\n+\t#if $drop_redundant_hits\n+\t\t-r\n+\t#end if\n+\t#if $column_labels\n+\t\t-l "${column_labels}"\n+\t#end if\n+\t#if len($fields)\n+\t\t-c "\n+\t\t#for $my_repeat in $fields \n+\t\t\t$my_repeat.field:$my_repeat.group:$my_repeat.sort:$my_repeat.label;\n+\t\t#end for\n+\t\t"\n+\t#end if\n+\t#if not str($row_limit) == "None"\n+\t-n "${row_limit}"\n+\t#end if\n+\t###if $library_datasets\n+\t##\t-B "\n+\t##\t#for $i, $dataset in enumerate($library_datasets)\n+\t##\t\t#$dataset.get_file_name()\n+\t##\t\t$dataset.id\n+\t##\t#end for\n+\t##\t"\n+\t###end if\n+\t]]></command>\n+\n+<!-- target base="${GALAXY_DATA_MANAGER_DATA_PATH}">${dbkey}/seq/${path}</target -->\n+\n+\t<inputs>\n+\t\t<param name="blastxml_file" type="data" format="blastxml" label="BLAST results as XML"/> \n+\t\t\n+\t\t<repeat name="filter_num" title="Numeric Filter" min="0" max="4">\n+\t\t\t<!-- TRIED conditional here, but it does not allow for <repeat> children. -->\n+\n+\t\t\t<param name="filter_column" type="select" label="Col">\n+\t\t\t\t<options from_data_table="blast_reporting_fields">\n+\t\t\t\t\t<filter type="static_value" value="numeric" column="type" />\n+\t\t\t\t\t<filter type="sort_by" column="name"/>\n+\t\t\t\t</options>\n+\t\t\t</param>\n+\t\t\t\t\n+\t\t\t<repeat name="constraint" title="Constraint" min="1" max="3">\n+\t\t\t\t<param name="filter_comparison" type="select" label="Comparison">\n+\t\t\t\t\t<option value="gte">&gt;= </option>\n+\t\t\t\t\t<option value="gt">&gt;</option>\n+\t\t\t\t\t<option value="lt">&lt; </option>\n+\t\t\t\t\t<option value="lte">&lt;= </option>\n+\t\t\t\t\t<option value="==">equal to </option>\n+\t\t\t\t\t<option value="!=">not equal to </option>\n+\t\t\t\t</param>\n+\t\t\t\t\n+\t\t\t\t<param name="filter_value" type="text" value="" label="Value">\n+\t\t\t\t\t<validator type="regex" message="Please input a number">([0-9]+|[0-9]*\\.[0-9]+)</validator>\n+\t\t\t\t</param>\n+\t\t\t\t\n+\t\t\t</repeat>\n+\t\t</repeat>\n+\t\t\n+\t\t<repeat name="filter_text" title="Text Filter" min="0" max="3">\n+\t\t\t<param name="filter_column2" type="select" label="Column">\n+\t\t\t\t<options from_data_table="blast_reporting_fields">\n+\t\t\t\t\t<filter type="sort_by" column="name"/>\t\t\t\t\n+\t\t\t\t\t<filter type="static_value" value="text" column="type" />\n+\t\t\t\t</options>\n+\t\t\t</param>\n+\t\t\t<repeat name="constraint2" title="Constraint" min="1" max="6">\n+\t\t\t\t<param name="filter_comparison2" type="select" label="Comparison">\n+\t\t\t\t    <option value="includes">has text</option>\n+\t\t\t\t    <option value="excludes">excludes text</option>\n+\t\t\t\t</param>\n+\t\t\t\t<param name="filter_value2" type="text" size="25" label="Phrase(s), comma separated" value=""/>\n+\t\t\t</repeat>\n+\t\t</repeat>\n+\n+\t\t<param name="drop_redundant_hits" type="boolean" checked="true" label="Throw out redundant hits" help="Keep only the best hit when query matches multiple locales in a subject sequence." /> \n+\n+\t\t<param name="row_limit" type="integer" label="Row limit (per query)" help="Limit each query\'s results to this many rows. 0=unlimited." value="0" /> \n+\n+\t\t<param name="out_format" type="select" label="Basic Report Field Output" help="Use the field selectors below to add or customize fields that end up in the output HTML or tabular report.  By default res'..b'orting_1.blastxml"/>\n+\t\t\t<output name="tabular_file" file="blast_reporting_1c.tabular"/>\n+\t\t\t<output name="selection_file" file="blast_reporting_1c1.tabular"/>\n+\t\t\t\t\t\t\n+\t\t\t<param name="out_format" value="ext+"/>\n+\t\t\t<param name="column_labels" value="" />\n+\t\t\t<param name="drop_redundant_hits" value="True"/>\n+\n+\t\t\t<param name="filter_num_0|filter_column" value="pident"/>\n+\t\t\t<param name="filter_num_0|constraint_0|filter_comparison" value="gte"/>\n+\t\t\t<param name="filter_num_0|constraint_0|filter_value" value="97"/>\n+\n+\t\t\t<param name="fields_0|field" value="pident"/>\n+\t\t\t<param name="fields_0|group" value="column"/>\n+\t\t\t<param name="fields_0|sort" value="asc"/>\n+\t\t\t\t\t\t\t\n+\t\t\t<param name="column_labels" value="label"/>\n+\t\t\t\n+\t\t</test>\n+\n+\t</tests>\n+\n+\t<help><![CDATA[\n+\t\t\n+.. class:: infomark\n+\n+**What it does**\n+\n+NCBI BLAST+ searches can output in a range of formats, but in the past only \n+the XML format included fields like sequence description.\n+This tool converts the BLAST XML report into 12, 24, 26 or custom column tabular\n+ and HTML reports.  This tool is loosely based on the \'\'BLAST XML to tabular\'\' tool\n+ available in main toolshed.  For the default 12 and 24 column reports, it should\n+produce the same output although whitespace differences may exist.\n+\n+====== ============= ============================================\n+Column NCBI name     Description\n+====== ============= ============================================\n+     1 qseqid        Query Seq-id (ID of your sequence)\n+     2 sseqid        Subject Seq-id (ID of the database hit)\n+     3 pident        Percentage of identical matches\n+     4 length        Alignment length\n+     5 mismatch      Number of mismatches\n+     6 gapopen       Number of gap openings\n+     7 qstart        Start of alignment in query\n+     8 qend          End of alignment in query\n+     9 sstart        Start of alignment in subject (database hit)\n+    10 send          End of alignment in subject (database hit)\n+    11 evalue        Expectation value (E-value)\n+    12 bitscore      Bit score\n+    .                 \n+    13 sallseqid     All subject Seq-id(s), separated by a \';\'\n+    14 score         Raw score\n+    15 nident        Number of identical matches\n+    16 positive      Number of positive-scoring matches\n+    17 gaps          Total number of gaps\n+    18 ppos          Percentage of positive-scoring matches\n+    19 qframe        Query frame\n+    20 sframe        Subject frame\n+    21 qseq          Aligned part of query sequence\n+    22 sseq          Aligned part of subject sequence\n+    23 qlen          Query sequence length\n+    24 slen          Subject sequence length\n+    .                 \n+    25 pcov          Percentage coverage\n+    26 sallseqdescr  All subject Seq-descr(s), separated by a \',\'\n+====== ============= ============================================\n+\n+An option also exists to select particular columns for the output \n+report, and to cross-reference each result with one or more reference bins.l\n+A command line version can be used.  Type blast_reporting.py -h for help.\n+\n+**python blast_reporting.py in_file out_file out_format [options]**\n+\n+.. class:: warningmark\n+\n+As noted in the original BLAST XML to tabular tool, \'\'Be aware that the XML file (and thus the conversion) and the tabular output direct from BLAST+ may differ in the presence of XXXX masking on regions low complexity (columns 21 and 22), and thus also calculated figures like the percentage identity (column 3) and gap openings.\'\'\n+\n+**References**\n+\n+If using this tool for publishing results, you may need to cite its origin in the BLAST XML to tabular tool:\n+\n+Peter J.A. Cock, Bj\xc3\xb6rn A. Gr\xc3\xbcning, Konrad Paszkiewicz and Leighton Pritchard (2013).\n+Galaxy tools and workflows for sequence analysis with applications\n+in molecular plant pathology. PeerJ 1:e167\n+http://dx.doi.org/10.7717/peerj.167\n+\n+    ]]></help>\n+    <citations>\n+      <citation type="doi">10.7717/peerj.167</citation>\n+    </citations>\n+</tool>\n'
b
diff -r 000000000000 -r 7db7ecc78ad6 blast_reporting_fields.tab
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/blast_reporting_fields.tab Mon Mar 02 20:46:00 2015 -0500
b
@@ -0,0 +1,34 @@
+#value type subtype sort filter default min max choose short_name name
+# Remember to edit tool_data_table_conf.xml for column spec!
+length numeric int 1 1 1 Length Alignment length
+qstart numeric int 1 1 1 Q. Start Alignment start in query
+qend numeric int 1 1 1 Q. End Alignment end in query
+sstart numeric int 1 1 1 S. Start Alignment start in subject
+send numeric int 1 1 1 S. End Alignment end in subject
+qseq text atgc 0 1 1 Q. Alignment Aligned part of query sequence
+sseq text atgc 0 1 1 S. Alignment Aligned part of subject sequence
+mseq text atgc 0 1 1 Alignment Alignment, matched part
+#
+bitscore numeric int 1 1 1 Bit Score Bit score
+evalue numeric float 1 1 1 E-value Expectation value
+pcov numeric int 1 1 1 % Coverage % coverage
+gapopen numeric int 1 1 1 Gaps-openings # of gap openings
+gaps numeric int 1 1 1 Gaps Total number of gaps
+mismatch numeric int 1 1 1 Mismatches # of mismatches
+nident numeric int 1 1 1 Ident. Matches # of identical matches
+positive numeric int 1 1 1 Pos. Matches # of positive-scoring matches
+pident numeric float 1 1 97 90 100 1 % Identical % of identical matches
+ppos numeric float 1 1 1 % Positive % of positive-scoring matches
+score numeric int 1 1 1 Raw Score Raw Score
+#
+qseqid text int 1 1 1 Query Id Query sequence id
+qframe numeric int 1 1 1 Query Frame Query frame
+qlen numeric int 1 1 1 Query Length Query sequence length
+#
+accessionid text 1 1 1 Accession Subject accession id
+sframe numeric int 1 1 1 Subject Frame Subject frame
+sallseqdescr text 0 1 1 Subject Descriptions Subject sequence desc(s) (all)
+sseqdescr text 1 1 1 Subject Description Subject sequence desc. (first)
+sseqid text int 1 1 1 Subject Id Subject sequence id
+sallseqid text 1 1 1 Subject Ids Subject sequence ids (all)
+slen numeric int 1 1 1 Subject Length Subject sequence length
b
diff -r 000000000000 -r 7db7ecc78ad6 common.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/common.py Mon Mar 02 20:46:00 2015 -0500
[
b'@@ -0,0 +1,523 @@\n+import os.path\n+import sys\n+import re\n+import optparse\n+import subprocess\n+from shutil import move\n+import csv\n+\n+re_default_query_id = re.compile("^Query_\\d+$")\n+\t#assert re_default_query_id.match("Query_101")\n+\t#assert not re_default_query_id.match("Query_101a")\n+\t#assert not re_default_query_id.match("MyQuery_101")\n+re_default_subject_id = re.compile("^(Subject_|gnl\\|BL_ORD_ID\\|)\\d+$") #requires some kind of numeric id\n+\t#assert self.re_default_subject_id.match("gnl|BL_ORD_ID|221")\n+\t#assert re_default_subject_id.match("Subject_1")\n+\t#assert not re_default_subject_id.match("Subject_")\n+\t#assert not re_default_subject_id.match("Subject_12a")\n+\t#assert not re_default_subject_id.match("TheSubject_1")  \n+\t# Spot sequence ids that have accession ids in them\n+re_default_ncbi_id = re.compile("^gi\\|\\d+\\|[a-z]+\\|[a-zA-Z0-9_]+(\\.\\d+)?\\|")\n+re_default_ref_id = re.compile("^ref\\|[a-zA-Z0-9_]+\\|[a-zA-Z0-9_]+(\\.\\d+)?\\|")\n+\n+\n+def stop_err( msg ):\n+    sys.stderr.write("%s\\n" % msg)\n+    sys.exit(1)\n+\n+class MyParser(optparse.OptionParser):\n+\t"""\n+\t From http://stackoverflow.com/questions/1857346/python-optparse-how-to-include-additional-info-in-usage-output\n+\t Provides a better class for displaying formatted help info in epilog() portion of optParse; allows for carriage returns.\n+\t"""\n+\tdef format_epilog(self, formatter):\n+\t\treturn self.epilog\n+\n+\n+\n+## *********************************** FieldFilter ****************************\n+class FieldFilter(object):\n+\t\n+\tdef __init__(self, tagGroup, options):\t\n+\t\t""" Creates dicitionary of fields that are to be filtered, and array of comparators and their values.\n+\t\tNumeric filters have a single numeric value\n+\t\tEach text filter is a string of phrases separated by "|"\n+\n+\t\t e.g. filters = "pident: > 97,score: > 37,sallseqdescr includes what | have|you"\n+\t\t\n+\t\t @param filters string\te.g. "[ [field name]: [comparator] [value],[[comparator] [value],]* ]* \n+\t\t @result .dict dictionary contains field name keys and arrays of [comparator, filterValue]\n+\t\t\n+\t\t"""\n+\t\tself.dict = {}\n+\t\tself.comparators = {\n+\t\t\t\'==\': lambda x,y: float(x) == float(y), \n+\t\t\t\'!=\': lambda x,y: float(x) != float(y), \n+\t\t\t\'gt\': lambda x,y: float(x) > float(y), \n+\t\t\t\'gte\': lambda x,y: float(x) >= float(y), \n+\t\t\t\'lt\': lambda x,y: float(x) < float(y), \n+\t\t\t\'lte\': lambda x,y: float(x) <= float(y),\n+\t\t\t\'includes\': self.includesPhrase, \n+\t\t\t\'excludes\': self.excludesPhrase\n+\t\t}\n+\t\tself.matches = {}\n+\t\tself.drop_redundant_hits = options.drop_redundant_hits\n+\t\t\n+\n+\t\t\n+\t\tif options.filters != None:\n+\t\t\tcleaned_filters = []\n+\t\t\tfor colPtr, filterParam in enumerate(options.filters.strip().strip(\';\').split(\';\')):\n+\t\t\t\tfilterSpec = filterParam.strip().split(":")\n+\t\t\t\tfilterField = filterSpec[0].strip()\n+\t\t\t\tif len(filterField) > 0:\n+\t\t\t\t\tif filterField in self.dict:\n+\t\t\t\t\t\tstop_err("Filter field listed twice: \\"" + filterField + "\\". Please move constraints up to first use of field!")\n+\t\t\t\t\tfield_name = cleanField(tagGroup.columns_in, filterField, \'Invalid field for filtering eh\')\n+\t\t\t\t\tif len(filterSpec) > 1: #we have start of filter field defn. "[field]:[crit]+,"\n+\t\t\t\t\t\t\t\n+\t\t\t\t\t\tself.dict[field_name] = [] #new entry for filter field\n+\t\t\t\t\t\n+\t\t\t\t\t\tfor filterParam in filterSpec[1].strip().strip(\',\').split(\',\'):\n+\t\t\t\t\t\t\tfilterSpec2 = filterParam.strip().split(\' \')\n+\t\t\t\t\t\t\tcomparator = filterSpec2[0]\n+\t\t\t\t\t\t\tif not comparator in self.comparators:\n+\t\t\t\t\t\t\t\tstop_err("Invalid comparator for field filter: \\"" + comparator + "\\"")\n+\t\t\t\t\t\t\tif len(filterSpec2) < 2:\n+\t\t\t\t\t\t\t\tstop_err("Missing value for field comparator: \\"" + comparator + "\\"")\n+\t\t\t\t\t\n+\t\t\t\t\t\t\t#For text search, values are trimmed array of phrases \n+\t\t\t\t\t\t\tif comparator in [\'includes\',\'excludes\']:\n+\t\t\t\t\t\t\t\tfilterValue = list(map(str.strip, \' \'.join(filterSpec2[1:]).split(\'|\')))\n+\t\t\t\t\t\t\t\tfilterValue = filter(None, filterValue)\n+\t\t\t\t\t\t\telse:\t\n+\t\t\t\t\t\t\t\tfilterValue = filterSpec2[1] \n+\t\t\t\t\t\t\n+\t\t\t\t\t\t\tself.dict[field_name].append([comparator, filterValue])\n+\n+\t\t\t\t\t\tcleaned_fil'..b't gets mixed into sort there.)\n+\tNOTE: RUN THIS AFTER fileHTML() BECAUSE IT MAY TRIM FIELDS THAT HTML REPORT NEEDS\n+\n+\t@param in_file string\tFull file path\n+\t@param tagGroup\tobject Includes prelim_columns, final_columns\n+\t@param options object Includes label_flag and row_limit\n+\n+\t"""\n+\tfp_in = open(in_file, "rb")\n+\tfp_out = open(in_file + \'.tmp\', \'wb\')\n+\n+\ttry:\n+\n+\t\treader = csv.reader(fp_in, delimiter="\\t")\n+\t\twriter = csv.writer(fp_out, delimiter="\\t")\n+\n+\t\t# WRITE TABULAR HEADER\n+\t\tif options.column_labels: # options.column_labels in [\'name\',\'field\']:\n+\t\t\tif options.column_labels == \'label\':\n+\t\t\t\ttabHeader = [field[\'label\'] for field in tagGroup.columns]\n+\t\t\telse:\n+\t\t\t\t# Tabular data header: strip leading underscores off of any labels...\n+\t\t\t\ttabHeader = [field[\'field\'].lstrip(\'_\') for field in tagGroup.columns]\n+\n+\t\t\twriter.writerow(tabHeader)\n+\n+\t\tfor row in reader:\n+\n+\t\t\trowdata=[]\n+\t\t\tfor (idx, field) in enumerate(tagGroup.columns): # Exclude hidden columns here?\n+\t\t\t\trowdata.append(row[idx])\n+\t\t\twriter.writerow(rowdata)\n+\n+\t\tmove(in_file + \'.tmp\', in_file) # Overwrites in_file\n+\t\n+\texcept IOError as e:\n+\t\tprint \'Operation failed: %s\' % e.strerror\n+\n+\tfp_in.close()\n+\tfp_out.close()\n+\n+\n+\n+def fileSelections (in_file, selection_file, tagGroup, options):\n+\t""" Produces selection report format.  \n+\tFor selection file we need: qseqid, qseq, sseqid, sseq, and #\n+\n+\t@param in_file string\tFull file path\n+\t@param tagGroup\tobject Includes prelim_columns, final_columns\n+\t@param options object Includes label_flag and row_limit\n+\n+\t"""\n+\tfp_in = open(in_file, "rb")\n+\t\n+\tif selection_file != \'None\':\n+\t\tfp_out = open(selection_file, \'w\')\n+\n+\t\t\n+\t\ttry:\n+\n+\t\t\treader = csv.reader(fp_in, delimiter="\\t")\n+\t\t\twriter = csv.writer(fp_out, delimiter="\\t")\n+\n+\t\t\tfor (idx, field) in enumerate(tagGroup.columns): \n+\t\t\t\tfieldname = field[\'field\']\n+\t\t\t\tif fieldname == \'qseqid\': qseqid_col = idx\n+\t\t\t\telif fieldname == \'_qseq\': \tqseq_col = idx\n+\t\t\t\telif fieldname == \'sseqid\': sseqid_col = idx\n+\t\t\t\telif fieldname == \'_sseq\': \tsseq_col = idx\n+\t#\t\t\telse: stop_err("You : " + field)\n+\n+\t\t\tselectrow_count = 0\n+\t\t\tgrouping = -1\n+\t\t\told_section = \'\'\n+\t\t\tfor row in reader:\n+\n+\t\t\t\tselectrow_count +=1\n+\t\t\t\tif row[qseqid_col] != old_section:\n+\t\t\t\t\told_section = row[qseqid_col]\n+\t\t\t\t\tgrouping +=1\n+\t\t\t\t\twriter.writerow([row[qseqid_col], row[qseq_col], grouping, selectrow_count])\n+\t\t\t\t\tselectrow_count +=1\n+\n+\t\t\t\twriter.writerow([row[sseqid_col], row[sseq_col], grouping, selectrow_count])\n+\n+\t\t\n+\t\texcept IOError as e:\n+\t\t\tprint \'Operation failed: %s\' % e.strerror\n+\n+\t\tfp_in.close()\n+\t\tfp_out.close()\n+\n+def testSuite(test_ids, tests, output_dir):\n+\t\n+\tif test_ids == \'all\':\n+\t\ttest_ids = sorted(tests.keys())\n+\telse:\n+\t\ttest_ids = test_ids.split(\',\')\n+\t\n+\tfor test_id in test_ids:\n+\t\tif test_id in tests:\n+\t\t\ttest = tests[test_id]\n+\t\t\ttest[\'base_dir\'] = os.path.dirname(__file__)\n+\t\t\t# Each output file has to be prefixed with the output folder \n+\t\t\ttest[\'tmp_output\'] = (\' \' + test[\'outputs\']).replace(\' \',\' \' + output_dir)\n+\t\t\t# Note: output_dir output files don\'t get cleaned up after each test.  Should they?!\n+\t\t\tparams = \'%(base_dir)s/blast_reporting.py %(base_dir)s/test-data/%(input)s%(tmp_output)s %(options)s\' % test\n+\t\t\tprint("Testing" + test_id + \': \' + params)\n+\t\t\tos.system(params) \n+\t\t\tfor file in test[\'outputs\'].split(\' \'):\n+\t\t\t\t#print(os.system(\'diff --suppress-common-lines ./test-data/%s %s%s\' % (file, output_dir, file)))\n+\t\t\t\tf1 = open(test[\'base_dir\'] + \'/test-data/\' + file)\n+\t\t\t\tf2 = open(output_dir + file)\n+\t\t\t\timport difflib #n=[number of context lines\n+\t\t\t\tdiff = difflib.context_diff(f1.readlines(), f2.readlines(), lineterm=\'\',n=0)\n+\t\t\t\t# One Galaxy issue: it doesn\'t convert entities when user downloads file. BUT IT DOES when generating directly to command line?\n+\t\t\t\tprint \'\\nCompare \' + file\n+\t\t\t\tprint \'\\n\'.join(list(diff))\t\n+\t\t\t\n+\t\telse:\n+\t\t\tstop_err("\\nExpecting one or more test ids from " + str(sorted(tests.keys())))\n+\n+\tstop_err("\\nTest finished.")\n'
b
diff -r 000000000000 -r 7db7ecc78ad6 doc/blast_reporting.pdf
b
Binary file doc/blast_reporting.pdf has changed
b
diff -r 000000000000 -r 7db7ecc78ad6 fasta_reference_dbs.tab
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/fasta_reference_dbs.tab Mon Mar 02 20:46:00 2015 -0500
b
@@ -0,0 +1,9 @@
+#value key type active name path
+# Add list of reference database file names here, (remove .csv suffix) and applicable columns 
+# Reference databases need to be together in the ... /usr/local/galaxy/shared/bccdc_tools/tool-data/blast_report/bins/ folder
+# NOTE: These are necessary (i.e. must be uncommented) if reference bins are used.
+16S_euzby 16S 1 Euzby /usr/local/galaxy/shared/ngs_data/
+16S_ncbi 16S 1 16S Microbial (NCBI) /usr/local/galaxy/shared/ngs_data/
+16S_rdp 16S 1 16S RDP /usr/local/galaxy/shared/ngs_data/
+CPN60 CPN60 1 CPN60 Chaperonin /usr/local/galaxy/shared/ngs_data/
+hisA_burkholderia hisA 1 hisA Burkholderia /usr/local/galaxy/shared/ngs_data/
b
diff -r 000000000000 -r 7db7ecc78ad6 panel_layout.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/panel_layout.css Mon Mar 02 20:46:00 2015 -0500
[
@@ -0,0 +1,29 @@
+
+/* panel_layout.css
+ To pretty up the display of this reporting tool add the following lines to your galaxy's panel_layout.css file 
+ Galaxyproject.org installations normally have this file located in cp /usr/lib/galaxy-server/static/june_2007_style/blue/panel_layout.css 
+*/
+
+div[id*="bccdcBLASTreporting"] form > div.form-row > label {width:180px;float:left}
+div[id*="bccdcBLASTreporting"]  form > div > div.form-row > div.form-row-input {display:inline-block;width:auto}
+
+div[id*="bccdcBLASTreporting"]  .repeat-group-item {border:none;margin:0}
+
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group * {vertical-align:top}
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group {border:1px solid silver;border-radius:10px;background-color:whitesmoke;margin:5px 10px 0 10px}
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .form-title-row {display:none}
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .repeat-group-item {clear:left}
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .form-row {border-top:1px solid silver}
+
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .repeat-group-item > .form-row > label {display:none}
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .repeat-group-item > .form-title-row {display:inline-block}
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .repeat-group-item > .form-row {display:inline-block}
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .repeat-group-item > .repeat-group {display:inline-block}
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .repeat-group-item > .repeat-group .form-title-row {display:none}
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .repeat-group-item > .repeat-group > .repeat-group-item {width:auto}
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .repeat-group-item > .repeat-group > .repeat-group-item > .form-row {display:inline-block;width:auto}
+
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .repeat-group-item > .form-row > input.btn {float:left}
+div[id*="bccdcBLASTreporting"]  form > div > .repeat-group > .repeat-group-item > .form-row > input.btn[name$=_remove] {width:70px;height:25px; display:inline-block}
+div[id*="bccdcBLASTreporting"]  .toolParamHelp {display:inline-block; padding-left:15px; clear:none !important;padding-top:4px}
+
b
diff -r 000000000000 -r 7db7ecc78ad6 reference_bins.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/reference_bins.py Mon Mar 02 20:46:00 2015 -0500
[
@@ -0,0 +1,148 @@
+import os.path
+import common
+
+class ReferenceBins:
+
+ def __init__(self, db_spec_path = None):
+ """
+   @param db_spec_path string path to fasta databases specification file.  This file has format:
+  #value id type active name path
+  16S_euzby 16S 1 Euzby /usr/local/galaxy/shared/ngs_data/
+  ...
+ """
+ self.reference_bins = []
+
+ if db_spec_path == None: # Default to the command-line lookup table in code's folder: 
+ db_spec_path = os.path.join(os.path.dirname(__file__), 'fasta_reference_dbs.tab') 
+ self.fieldSpec = common.FieldSpec(db_spec_path)
+
+ def __main__(self): pass
+
+ # Could double check to see if it exists?
+ def build_bins(self, bins, columns):
+
+ if bins == None: 
+ self.reference_bins = []
+ return False
+
+ for myfield in bins.strip().strip(';').split(';'):
+ field_spec = myfield.strip().split(':')
+ field_name = field_spec[0].strip()
+
+ if field_name != '':
+ if not field_name.replace('_','').isalnum():
+ common.stop_err("Invalid bin name: " + field_name + ':' + myfield)
+
+ if len(field_spec) < 2: field_spec.append('column') # default grouping = column
+ if len(field_spec) < 3: field_spec.append('') # default filtering = none
+ if len(field_spec) < 4: field_spec.append('') # default no description
+
+ grouping = field_spec[1].strip()
+ if not grouping in ['table', 'column', 'hidden']:
+ common.stop_err("Invalid bin layout: " + grouping)
+
+ bin_filter = field_spec[2].strip()
+ if not bin_filter in ['', 'include', 'exclude']:
+ common.stop_err("Invalid bin sort: " + bin_filter)
+
+ newbin = self.buildBin(field_name, bin_filter)
+ self.reference_bins.append(newbin)
+
+ field = { # any time we have a bin we want sort descending
+ 'field': field_name,
+ 'group': grouping,
+ 'sort': 'desc',
+ 'label': newbin.name,
+ 'type': 'bin'
+ } 
+ columns.append(field)
+ if (field_spec[3] == 'true'): # description field requested
+ field = {
+ 'field': field_name + '_desc',
+ 'group': 'column',
+ 'sort': '', # Allow other sorts????
+ 'label': newbin.name + ' Description',
+ 'type': 'text'
+ } 
+ columns.append(field)
+
+
+ def buildBin(self, bin_folder_name, bin_filter):
+ """ 
+  Create a lookup table consisting of a dictionary entry for each accession id held in dictionary's file.
+  @param bin_folder_name string name of requested db, e.g 16S_ncbi 
+  @param bin_filter string '' or 'include' or 'exclude'
+
+ """
+ bin = ReferenceBin(self.fieldSpec, bin_folder_name, bin_filter)
+
+ try:
+ with open(bin.file_path) as file_in:
+ for line in file_in: # Should always contains succession id
+ #FUTURE: Preprocess so accession ID ready to go.
+ keyValue = line.rstrip().split("\t",1)
+  # keep only first term minus integer portion of id
+ accGeneralId = keyValue[0].split('.')[0]
+ if len(keyValue) >1: description = keyValue[1]
+ else: description = ''
+ bin.lookup[accGeneralId] = description
+
+ file_in.close()
+
+ except IOError:
+    stop_err("Reference bin could not be found or opened: " + self.path + bin_folder_name + '/accession_ids.tab')
+
+ return bin
+
+ def setStatus(self, record):
+
+ if len(self.reference_bins) == 0: return #no bins
+
+ # Use of "extended slices" http://docs.python.org/2.3/whatsnew/section-slices.html
+ # Example sallseqid is 'gi|194753780|ref|XR_046072.1|;gi|195119578|ref|XR_047594.1|;gi|195154052|ref|XR_047967.1|'
+  # Example accs is ['XR_046072.1', 'XR_047594.1', 'XR_047967.1']
+ # Original code was "[1::2][1::2]" (select every 2nd item, then every 2nd item of that)
+ accs = record.sallseqid.split('|')
+
+ if common.re_default_ncbi_id.match(record.sseqid):
+ accs = accs[3::4] #Select every 4th item starting offset 4
+
+ elif common.re_default_ref_id.match(record.sseqid):
+ accs = accs[1::2]
+
+
+ # Check each accession # against each bin.  
+ for ptr, bin in enumerate(self.reference_bins):
+ setattr(record, bin.field, '') #Using '','1' not FALSE/TRUE because of tab delim output
+ setattr(record, bin.field + '_desc', '')
+ for acc in accs:
+ accGeneralId = acc.split('.')[0]
+ if accGeneralId in bin.lookup:
+ if bin.exclude: return False
+ setattr(record, bin.field, str(ptr+1))
+ # Include any bin notes for this item
+ setattr(record, bin.field + '_desc', bin.lookup[accGeneralId])
+ break # This result has been binned to this bin so break.
+
+
+
+
+ def __str__(self):
+ return "name: %s    dict: %s" % (self.name, str(self.lookup))
+
+class ReferenceBin: 
+ def __init__(self, fieldSpec, bin_folder_name, bin_filter):
+ self.lookup = {}
+ self.folder = bin_folder_name
+ self.name = fieldSpec.getAttribute(bin_folder_name, 'name')
+ self.field = bin_folder_name
+ self.path = fieldSpec.getAttribute(bin_folder_name, 'path')
+ self.exclude = bin_filter
+ #absolute path to reference bins folder: /usr/local/galaxy/shared/ngs_data/
+ self.file_path = os.path.join(self.path + self.folder + '/accession_ids.tab')
+
+if __name__ == '__main__':
+
+        binManager = ReferenceBins()
+        binManager.__main__()
+
b
diff -r 000000000000 -r 7db7ecc78ad6 templates/html_report.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/html_report.py Mon Mar 02 20:46:00 2015 -0500
[
b'@@ -0,0 +1,329 @@\n+import os.path\n+import time\n+import csv\n+import collections\n+import re\n+\n+HTML_REPORT_HEADER_FILE = \'html_report_header.html\'\n+\n+class HTMLReport(object):\n+\t\n+\t""" This receives and sets up the general meta-data fields available to the html rendering engine \n+\n+\t"""\n+\tdef __init__(self, tagGroup, options, query_stats = []):\n+\n+\t\tself.columns = tagGroup.columns\n+\t\tself.display_columns = [field for field in self.columns if field[\'group\']==\'column\']\n+\t\tself.row_limit = options.row_limit\n+\t\tself.section_bins = {}\n+\t\tself.todo = collections.deque([]) # stack of things to do\n+\t\tself.query_stats = query_stats\n+\t\tself.empty_queries = [query[\'id\'] for query in query_stats if query[\'filtered_rows\'] == 0]\n+\t\tself.initialized = False\n+\t\tself.errorNotice = \'\'\n+\t\t\n+\t\t# These items are available for display in html generation via dictionary string replacement: [string ... %(filters)s ...] % self.lookup\n+\t\tself.lookup = {\n+\t\t\t\'depth\': 0,\n+\t\t\t\'filters\': \'Filters: \' + options.filters_HTML if len(options.filters_HTML) else \'\',\n+\t\t\t\'timestamp\': time.strftime(\'%Y/%m/%d\'),\n+\t\t\t\'visible_limit\': 20,\n+\t\t\t\'column_count\': str(len([field for field in self.columns if field[\'group\']==\'column\'])),\n+\t\t\t\'table_rows\':0,\n+\t\t\t\'select_row\':0,\n+\t\t\t\'row_limit\': self.row_limit,\n+\t\t\t\'label\':\'\',\n+\t\t\t\'value\':\'\',\n+\t\t\t\'link\':\'\',\n+\t\t\t\'cssClass\':\'\',\n+\t\t\t\'table_header\': self._tableHeader(),\n+\t\t\t\'section_bins\':\'\',\n+\t\t\t\'section_counter\':1\n+\t\t}\n+\t\t\n+\t\tself.initialized = True\n+\t\t\n+\t\t#else:\n+\t\t# add error notice for non-initialized template:\n+\t\t#\tself.errorNotice = \'<div style="width:400px;margin:auto"><h3>This HTML Report could not be initialized ...</h3></div>\'\n+\n+\n+\t"""\n+\t_processTagStack()\n+\tIn the production of html, start tags and template bits are added to the outgoing html when designated section columns of data change value.  the self.todo stack keeps track of all the tag closings that have to occur when a section or table section comes to an end (and new one begins or end of document occurs).\n+ \n+\tThis dynamically executes any functions listed in stack that are greater than given tag depth.\n+\tGenerally the functions return html closing content.\n+\t\n+\t@param depth integer >= 0\n+\t@uses self.todo stack of [depth, function_name] items\t\n+\t"""\n+\tdef _processTagStack(self, depth = 0):\n+\t\thtml = \'\'\n+\t\twhile len(self.todo) and self.todo[0][0] >= depth: \n+\t\t\thtml += getattr(self, self.todo.popleft()[1] )()\n+\t\treturn html \n+\n+\n+\n+\t############################### HTML REPORT RENDERING ############################## \n+\t""" render() produces the html.  Takes in tabular data + metainformation about that file, and iterates through rows.  This approach depends on detecting changes in stated report section columns and table section columns, and triggers appropriate section start and end, and table / table section start and end tags.\n+\n+\t@param in_file string\tFull file path\n+\t@param out_html_file string\tFull output html data file path to write to.\n+\t"""\n+\tdef render (self, in_file, out_html_file):\n+\n+\t\ttry:\n+\n+\t\t\tfp_in = open(in_file, "rb")\t\n+\t\t\tfp_out = open(out_html_file, \'w\')\n+\t\t\t\n+\t\t\tfp_out.write( self._header(HTML_REPORT_HEADER_FILE) )\n+\t\t\t\t\n+\t\t\tif self.initialized:\n+\t\t\t\t\n+\t\t\t\tfp_out.write( self._bodyStart() )\n+\t\t\t\tself.todo.appendleft([0,\'_bodyEnd\'])\n+\n+\t\t\n+\t\t\t\treader = csv.reader(fp_in, delimiter="\\t")\n+\n+\t\t\t\tfor row in reader:\n+\n+\t\t\t\t\thtml = \'\'\n+\t\t\t\t\tself.rowdata = []\n+\t\t\t\t\trow_bins = []\n+\t\t\t\t\tsection_reset = False\n+\t\t\t\t\t\n+\t\t\t\t\tfor (idx, field) in enumerate(self.columns):\n+\n+\t\t\t\t\t\tvalue = field[\'value\'] = row[idx]\n+\t\t\t\t\t\tdepth = idx + 1\n+\n+\t\t\t\t\t\t# If a bin is mentioned on this row, its put into self.selection_bins.\n+\t\t\t\t\t\tif field[\'type\'] == \'bin\' and value != \'\': \n+\t\t\t\t\t\t\trow_bins.append(value)\n+\t\t\t\t\t\t\tif not value in self.section_bins:\n+\t\t\t\t\t\t\t\tself.section_bins[value] = field[\'label\']\n+\n+\t\t\t\t\t\tgrouping = field[\'group\']\n+\t\t\t\t\t\t# Section or table grouping here: \n+\t\t\t\t\t\tif grouping == \'section\' or grouping == \'table\':\t\n+\n+\t\t\t\t\t\t\t# Check to see if a new section '..b'############################## HTML REPORT PART TEMPLATES ############################## \n+\tdef _header(self, filename):\n+\n+\t\twith open(os.path.join(os.path.dirname(__file__), filename), "r") as fphtml:\n+\t\t\tdata = fphtml.read()\n+\t\t\n+\t\treturn data\n+\t\t\n+\t\t\n+\tdef _bodyStart(self):\n+\t\t# The form enables the creation of a dataset from selected entries.  It passes selections (based on a certain column\'s value) to the "Select tabular rows" tool, which then creates a dataset from the selected rows. \n+\t\thtml = """\n+\t\t"""\n+\t\tif len(self.empty_queries):\n+\t\t\tqnames = \'\'\n+\t\t\tfor name in self.empty_queries:\tqnames += \'<li>\' + name + \'</li>\\n\'\n+\t\t\thtml += """\n+\t\t\t<div class="headerMessage">The following queries yielded 0 results (check filters): \n+\t\t\t\t<ul>\n+\t\t\t\t%s\n+\t\t\t\t</ul>\n+\t\t\t</div>""" % qnames\n+\n+\t\treturn html % self.lookup\n+\n+\t# Repeated for each grouped section table display\n+\tdef _sectionStart(self):\n+\t\tself.lookup[\'select_row\'] +=1\n+\t\treturn """\n+\t\t<div class="section section_depth%(section_depth)s">\n+\t\t\t<div class="section_title">%(label)s: %(value)s</div>\n+\t\t""" % self.lookup \n+\n+\n+\n+\tdef _sectionFormStart (self):\n+\t\t# This sets up the selection form #../../../tool_runner/index\n+\t\treturn ""\n+\n+\tdef _tableStart (self):\n+\n+\t\treturn """\n+\t\t\t<table class="report">\n+\t\t\t\t%(table_header)s\n+\t\t"""  % self.lookup\n+\n+\n+\tdef _tableHeader(self):\n+\n+\t\tcolTags = \'\'\t\t# Style numeric fields\n+\t\tthTags = \'\'\n+\n+\t\tfor field in self.columns: \n+\t\t\tif field[\'group\'] == \'column\': \n+\t\t\t\tcolTags += (\'<col />\' if field[\'type\'] == \'text\' else \'<col class="numeric" />\')\n+\t\t\t\tthTags += \'<th>\' + field[\'label\'] + \'</th>\'\n+\n+\t\treturn """\n+\t\t\t\t<colgroup>\n+\t\t\t\t\t%s\n+\t\t\t\t</colgroup>\n+\t\t\t\t<thead class="top">\n+\t\t\t\t\t<tr>%s</tr>\n+\t\t\t\t</thead>""" % (colTags, thTags)\n+\n+\tdef _tbodyHeader (self):\n+\t\tif self.lookup[\'value\'] == \'\': self.lookup[\'value\'] = \'(no match)\'\n+\t\treturn """\t\n+\t\t\t\t<thead class="inside">\n+\t\t\t\t\t<tr>\n+\t\t\t\t\t\t<th colspan="%(column_count)s">%(label)s: %(value)s</th>\n+\t\t\t\t\t</tr>\n+\t\t\t\t</thead>""" % self.lookup\n+\n+\tdef _tbodyStart (self):\n+\t\treturn """\n+\t\t\t\t<tbody>""" % self.lookup\n+\n+\n+\tdef _tableRow(self):\n+\t\tself.lookup[\'select_row\'] +=1\n+\n+\t\ttdTags = \'\'\n+\t\tfor (col, field) in enumerate(self.display_columns):\n+\t\t\tvalue =  self.rowdata[col]\n+\t\t\tself.lookup[\'value\'] = value\n+\t\t\tself.lookup[\'cssClass\'] = \' class="numeric"\' if field[\'type\'] == \'numeric\' else \'\'\n+\t\t\taccessionID = re.search(r\'[a-z]+[0-9]+(.[0-9]+)*\' ,value, re.I)\n+\t\t\tif (accessionID) :\n+\t\t\t\tself.lookup[\'link\'] = \'<a href="https://google.ca/#q=%s+gene" target="search">%s</a>\' % (accessionID.group(), value)\n+\t\t\telse:\n+\t\t\t\tself.lookup[\'link\'] = value\n+\t\t\t# First column optionally gets bin indicator as well as row checkbox selector \n+\t\t\tif (col == 0):\n+\t\t\t\ttdTags += \'<td%(cssClass)s>%(link)s<span class="super">%(row_bins)s</span></td>\' % self.lookup\n+\t\t\telse:\n+\t\t\t\ttdTags += \'<td%(cssClass)s>%(value)s</td>\' % self.lookup\n+\n+\t\treturn """\\n\\t\\t\\t<tr>%s</tr>""" % tdTags\n+\n+\tdef _tbodyEnd (self):\n+\t\treturn """\n+\t\t\t\t</tbody>"""\n+\n+\tdef _tableEnd (self):\n+\t\tif len(self.section_bins):\n+\t\t\tbins = []\n+\t\t\tfor key in sorted(self.section_bins):\n+\t\t\t\tbins.append( \'<span class="super">(%s)</span>%s\' % (key, self.section_bins[key]) )\n+\t\t\tself.lookup[\'section_bins\'] = \'Bins: \' + \', \'.join(bins)\n+\t\telse:\n+\t\t\tself.lookup[\'section_bins\'] = \'\'\n+\n+\t\treturn """\n+\t\t\t\t<tfoot>\n+\t\t\t\t\t<tr>\n+\t\t\t\t\t\t<td colspan="%(column_count)s">\n+\t\t\t\t\t\t\t<div class="footerCenter">\n+\t\t\t\t\t\t\t\t%(filters)s. \n+\t\t\t\t\t\t\t</div>\n+\t\t\t\t\t\t\t<div class="footerLeft">\n+\t\t\t\t\t\t\t\t<span class="rowViewer0"></span> %(table_rows)s results. \n+\t\t\t\t\t\t\t\t<span class="rowViewer1 nonprintable"></span>\n+\t\t\t\t\t\t\t\t%(section_bins)s\n+\t\t\t\t\t\t\t</div> \n+\t\t\t\t\t\t\t<div class="footerRight">\n+\t\t\t\t\t\t\t\tReport produced on %(timestamp)s\n+\t\t\t\t\t\t\t</div>\n+\n+\t\t\t\t\t\t</td>\n+\t\t\t\t\t</tr>\n+\t\t\t\t</tfoot>\n+\t\t\t</table>""" % self.lookup\n+\n+\tdef _sectionFormEnd (self):\n+\t\treturn """\n+\t\t\t\n+\t\t""" \n+\n+\tdef _sectionEnd (self):\n+\t\treturn """\n+\t\t</div>"""\n+\n+\n+\tdef _bodyEnd (self):\n+\n+\t\treturn """\\n\\t</body>\\n</html>"""\n+\n'
b
diff -r 000000000000 -r 7db7ecc78ad6 templates/html_report_header.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/html_report_header.html Mon Mar 02 20:46:00 2015 -0500
[
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
+ <meta name="generator" content="Galaxy %s tool output - see http://g2.trac.bx.psu.edu/" /> 
+         <title>Galaxy Blast Search Reporting</title> 
+
+ <style>
+ body {
+ font-size:0.75em; font-family:arial 
+ }
+ table, tr {
+ width: 100%;
+ }
+ table {
+ border-collapse: collapse;
+ border: 1px solid black;
+ }
+ tbody tr:first-child td {
+ border-top:3px solid black;
+ }
+ thead.top {
+ background-color: lightgrey;
+ }
+ thead.inside {
+ background-color: lightblue;
+ text-align:left
+ }
+ thead th {padding:3px;vertical-align:bottom}
+ thead > tr > th .sectionCheckbox {
+ position:absolute;
+ left:12px;
+ }
+ tfoot td {border-top: 1px solid black; text-align:center}
+ td.numeric {
+ text-align:right;
+ padding-left:15px;
+ white-space: nowrap}
+ td:first-child {
+ white-space: nowrap
+ }
+ td {    vertical-align:top;
+ border-left: 1px solid black;
+ border-right: 1px solid black;
+ border-bottom: 1px dashed grey;
+ padding:3px;
+ }
+ .section {
+ page-break-after: always;
+ margin-top:5px;
+ margin-bottom:5px;
+ }
+ .section .section_title {
+ margin-bottom:5px;
+ }
+
+ .section:last-child {
+ page-break-after: avoid; !important;
+ }
+
+ tbody:first-child {
+ page-break-before: avoid;
+ }
+
+ .section_depth1 > .section_title {font-size:1.3rem; color: blue;}
+ .section_depth2 > .section_title {font-size:.9rem; color: blue;}
+ .section_depth3 > .section_title {font-size:.8rem; color: blue;}
+
+ .headerMessage {font-size: 1rem; font-weight:bold; border:1px solid black; padding:10px}
+ .headerMessage ul {font-size: .9rem; font-weight:normal}
+
+ .sanitize_all_html_problem {display:none}
+ div.footerLeft {float:left;padding-right:20px}
+ div.footerRight {float:right;padding-left:20px}
+ div.footerCenter {display:inline-block}
+
+ span.rowViewer1 {color:blue; cursor:pointer}
+
+ span.super {
+ color: navy;
+ font-weight:bold;
+ font-size: 90%;
+ vertical-align: top;
+ }
+
+ @media print
+ {
+ .nonprintable {display:none}
+ }
+ </style>
+
+ <!-- Note, no external javascript required -->
+ <script>
+
+ window.onload = function () {
+ visible_rows = 20;
+
+ var tables = document.getElementsByTagName('TABLE');
+ for (var ptr = 0; ptr < tables.length; ptr ++) {
+ viewTable(tables[ptr], false);
+ }
+
+ function viewTable(table, showFlag) {
+ var row_count = 0;
+ var tbodies = table.getElementsByTagName('TBODY'); // So no thead/tfoot tr's.
+ for (var ptr1 = 0; ptr1 < tbodies.length; ptr1 ++ ) {
+ trs = tbodies[ptr1].getElementsByTagName('TR');
+ for (var ptr2 = 0; ptr2 < trs.length; ptr2 ++ ) {
+ row_count ++;
+ // TR visibility cut off after visible_rows by default
+ trs[ptr2].style.display = (row_count <= visible_rows || showFlag) ? '' : 'none';
+ }
+ }
+ initTableFooter(table, row_count, showFlag);
+
+ var theaders = table.getElementsByTagName('THEAD'); 
+ var inputToggle = theaders[0].getElementsByTagName('INPUT')[0];
+ if (inputToggle) {
+ inputToggle.checked = false;
+ inputToggle.onchange = function() {toggleInputs(inputToggle, table)};
+ }
+ }
+
+ function initTableFooter(table, row_count, showFlag) {
+ // rowViewer1 and rowViewer2 spans provide option for viewing overflow rows
+ var tfoots = table.getElementsByTagName('TFOOT');
+ var rowViewers = tfoots[0].getElementsByTagName('SPAN');
+ if (row_count > visible_rows) {
+ rowViewers[0].innerHTML = visible_rows + " of";
+ if (showFlag) {
+ rowViewers[0].style.display = 'none';
+ rowViewers[1].innerHTML = 'View first 20';
+ rowViewers[1].onclick = function() {viewTable(table, false)}
+ }
+ else {
+ rowViewers[0].style.display = '';
+ rowViewers[1].innerHTML = 'View All';
+ rowViewers[1].onclick = function() {viewTable(table, true)}
+ }
+ }
+ }
+ }
+ </script>
+ </head> 
+ <body>
+
+ <div style="float:right" id="buttonPrint" class="nonprintable">
+ <button onclick="window.print()">Print</button>
+ </div>
+
+ <blockquote class="sanitize_all_html_problem" class="nonprintable">
+
+ ***********************************************************
+ <p><b>Your Galaxy installation needs to be adjusted<br/>
+ to work with this plugin because HTML styles and<br/>
+ javascript are currently being omitted ("sanitized").</b></p>
+
+ <p><b>Galaxy administrator: set sanitize_all_html=False in universe_wsgi.ini</b></p>
+ ***********************************************************
+
+ </blockquote>
+
b
diff -r 000000000000 -r 7db7ecc78ad6 templates/html_selectable_report.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/html_selectable_report.py Mon Mar 02 20:46:00 2015 -0500
[
b'@@ -0,0 +1,399 @@\n+import os.path\n+import time\n+import csv\n+import collections\n+import re\n+import common\n+\n+HTML_REPORT_HEADER_FILE = \'html_report_header.html\'\n+\n+class HTMLReport(object):\n+\t\n+\t""" This receives and sets up the general meta-data fields available to the html rendering engine \n+\n+\t"""\n+\tdef __init__(self, tagGroup, options, query_stats = []):\n+\n+\t\tself.columns = tagGroup.columns\n+\t\tself.display_columns = [field for field in self.columns if field[\'group\']==\'column\']\n+\t\tself.row_limit = options.row_limit\n+\t\tself.section_bins = {}\n+\t\tself.todo = collections.deque([]) # stack of things to do\n+\t\tself.query_stats = query_stats\n+\t\tself.empty_queries = [query[\'id\'] for query in query_stats if query[\'filtered_rows\'] == 0]\n+\t\tself.initialized = False\n+\n+\t\t# These items are available for display in html generation via dictionary string replacement: [string ... %(filters)s ...] % self.lookup\n+\t\tself.lookup = {\n+\t\t\t\'depth\': 0,\n+\t\t\t\'filters\': \'Filters: \' + options.filters_HTML if len(options.filters_HTML) else \'\',\n+\t\t\t\'timestamp\': time.strftime(\'%Y/%m/%d\'),\n+\t\t\t\'visible_limit\': 20,\n+\t\t\t\'column_count\': str(len([field for field in self.columns if field[\'group\']==\'column\'])),\n+\t\t\t\'table_rows\':0,\n+\t\t\t\'select_row\':0,\n+\t\t\t\'row_limit\': self.row_limit,\n+\t\t\t\'label\':\'\',\n+\t\t\t\'value\':\'\',\n+\t\t\t\'link\':\'\',\n+\t\t\t\'cssClass\':\'\',\n+\t\t\t\'table_header\': self._tableHeader(),\n+\t\t\t\'section_bins\':\'\',\n+\t\t\t\'section_counter\':1\n+\t\t}\n+\t\t\n+\t\tif hasattr(options,\'dataset_selection_id\'):\n+\t\t\tself.lookup[\'dataset_selection_id\'] = options.dataset_selection_id\n+\t\t\tself.initialized = True\n+\t\t\n+\t\telse:\n+\t\t\tself.lookup[\'dataset_selection_id\'] = 0\n+\t\t\tself.errorNotice = \'<div style="width:400px;margin:auto"><h3>This Selectable HTML Report needs the "Basic Report Field Output" to include the qseq and sseq sequence fields (aligned part of query sequence and subject sequence).  Add these fields or try a selection that has more than 12 columns.</h3></div>\'\n+\n+\t"""\t\t\n+\t_processTagStack()\n+\tIn the production of html, start tags and template bits are added to the outgoing html when \n+\tdesignated section columns of data change value.  the self.todo stack keeps track of all the \n+\ttag closings that have to occur when a section or table section comes to an end (and new one \n+\tbegins or end of document occurs).\n+\n+\tThis dynamically executes any functions listed in stack that are greater than given tag depth.\n+\tGenerally the functions return html closing content.\n+\t\n+\t@param depth integer >= 0\n+\t@uses self.todo stack of [depth, function_name] items\t\n+\t"""\n+\tdef _processTagStack(self, depth = 0):\n+\t\thtml = \'\'\n+\t\twhile len(self.todo) and self.todo[0][0] >= depth: \n+\t\t\thtml += getattr(self, self.todo.popleft()[1] )()\n+\t\treturn html \n+\n+\n+\n+\t############################### HTML REPORT RENDERING ############################## \n+\t""" render() produces the html.  Takes in tabular data + metainformation about that file,\n+\t and iterates through rows.  This approach depends on detecting changes in stated report \n+\tsection columns and table section columns, and triggers appropriate section start and end, \n+\tand table / table section start and end tags.\n+\n+\t@param in_file string\tFull file path\n+\t@param out_html_file string\tFull output html data file path to write to.\n+\t"""\n+\tdef render (self, in_file, out_html_file):\n+\n+\t\ttry:\n+\t\t\t\n+\t\t\tfp_in = open(in_file, "rb")\n+\t\t\tfp_out = open(out_html_file, \'w\')\n+\n+\t\t\tfp_out.write( self._header(HTML_REPORT_HEADER_FILE) )\n+\t\t\t\t\n+\t\t\tif self.initialized:\n+\n+\t\t\t\tfp_out.write( self._bodyStart() )\n+\t\t\t\tself.todo.appendleft([0,\'_bodyEnd\'])\n+\t\t\t\t\n+\t\t\t\treader = csv.reader(fp_in, delimiter="\\t")\n+\n+\t\t\t\tfor row in reader:\n+\n+\t\t\t\t\thtml = \'\'\n+\t\t\t\t\tself.rowdata = []\n+\t\t\t\t\trow_bins = []\n+\t\t\t\t\tsection_reset = False\n+\t\t\t\t\t\n+\t\t\t\t\tfor (idx, field) in enumerate(self.columns):\n+\n+\t\t\t\t\t\tvalue = field[\'value\'] = row[idx]\n+\t\t\t\t\t\tdepth = idx + 1\n+\n+\t\t\t\t\t\t# If a bin is mentioned on this row, its put into self.selection_bins.\n+\t\t\t\t\t\tif field[\'type\'] == \'bin\' and value != \'\': \n+\t\t\t'..b'y\n+\tdef _sectionStart(self):\n+\t\tself.lookup[\'select_row\'] +=1\n+\t\treturn """\n+\t\t\t<div class="section section_depth%(section_depth)s">\n+\t\t\t\t<div class="section_title">%(label)s: %(value)s</div>\n+\t\t""" % self.lookup \n+\n+\n+\n+\tdef _sectionFormStart (self):\n+\t\t# This sets up the selection form with the minimal necessary parameters  # \n+\t\treturn """\n+\t\t\t\t\t<input type="checkbox" name="select" value="%(select_row)s" id="secId_%(select_row)s_start" checked="checked" style="display:none">\n+\t\t\t\t\t<input type="submit" class="btn btn-primary nonprintable" name="runtool_btn" value="Submit" onclick="formCheck()">\n+\t\t\t""" % self.lookup \n+\n+\n+\tdef _tableStart (self):\n+\n+\t\treturn """\n+\t\t\t<div class="checkUncheckAllPlaceholder"></div>\n+\t\t\t<table class="report" id="secId_%(select_row)s">\n+\t\t\t\t%(table_header)s\n+\t\t"""  % self.lookup\n+\n+\n+\tdef _tableHeader(self):\n+\n+\t\tcolTags = \'\'\n+\t\tthTags = \'\'\n+\t\tfirstColumnFlag = True\n+\t\t# Style numeric fields\n+\t\tfor field in self.columns: \n+\t\t\tif field[\'group\'] == \'column\': \n+\t\t\t\tcolTags += (\'<col />\' if field[\'type\'] == \'text\' else \'<col class="numeric" />\')\n+\t\t\t\tif firstColumnFlag == True:\n+\t\t\t\t\tthTags += \'\'\'<th>\n+\t\t\t\t\t\t<input type="checkbox" class="sectionCheckbox nonprintable" value="1"/>\n+\t\t\t\t\t\t\'\'\' + field[\'label\'] + \'</th>\'\n+\t\t\t\t\tfirstColumnFlag = False\n+\t\t\t\telse:\n+\t\t\t\t\tthTags += \'<th>\' + field[\'label\'] + \'</th>\'\n+\n+\t\treturn """\n+\t\t\t\t<colgroup>\n+\t\t\t\t\t%s\n+\t\t\t\t</colgroup>\n+\t\t\t\t<thead class="top">\n+\t\t\t\t\t<tr>%s</tr>\n+\t\t\t\t</thead>""" % (colTags, thTags)\n+\n+\tdef _tbodyHeader (self):\n+\t\tif self.lookup[\'value\'] == \'\': self.lookup[\'value\'] = \'(no match)\'\n+\t\treturn """\t\n+\t\t\t\t<thead class="inside">\n+\t\t\t\t\t<tr>\n+\t\t\t\t\t\t<th colspan="%(column_count)s">%(label)s: %(value)s</th>\n+\t\t\t\t\t</tr>\n+\t\t\t\t</thead>""" % self.lookup\n+\n+\tdef _tbodyStart (self):\n+\t\treturn """\n+\t\t\t\t<tbody>""" % self.lookup\n+\n+\n+\tdef _tableRow(self):\n+\t\tself.lookup[\'select_row\'] +=1\n+\n+\t\ttdTags = \'\'\n+\t\tfor (col, field) in enumerate(self.display_columns):\n+\t\t\tvalue =  self.rowdata[col]\n+\t\t\tself.lookup[\'value\'] = value\n+\t\t\tself.lookup[\'cssClass\'] = \' class="numeric"\' if field[\'type\'] == \'numeric\' else \'\'\n+\t\t\t#See http://www.ncbi.nlm.nih.gov/books/NBK21091/table/ch18.T.refseq_accession_numbers_and_mole/?report=objectonly\n+\t\t\t#See http://www.ncbi.nlm.nih.gov/Sequin/acc.html\n+\t\t\taccessionID = re.search(r\'[a-z]+[_]?[0-9]+(.[0-9]+)*\' ,value, re.I)\n+\t\t\tif (accessionID) :\n+\t\t\t\tself.lookup[\'link\'] = \'<a href="https://google.com/#q=%s+gene" target="search">%s</a>\' % (accessionID.group(), value)\n+\t\t\telse:\n+\t\t\t\tself.lookup[\'link\'] = value\n+\t\t\t# First column optionally gets bin indicator as well as row checkbox selector \n+\t\t\tif (col == 0):\n+\t\t\t\ttdTags += \'<td%(cssClass)s><input type="checkbox" name="select" value="%(select_row)s" />%(link)s<span class="super">%(row_bins)s</span></td>\' % self.lookup\n+\t\t\telse:\n+\t\t\t\ttdTags += \'<td%(cssClass)s>%(value)s</td>\' % self.lookup\n+\n+\t\treturn """\\n\\t\\t\\t<tr>%s</tr>""" % tdTags\n+\n+\n+\tdef _tbodyEnd (self):\n+\t\treturn """\n+\t\t\t\t</tbody>"""\n+\n+\tdef _tableEnd (self):\n+\t\tif len(self.section_bins):\n+\t\t\tbins = []\n+\t\t\tfor key in sorted(self.section_bins):\n+\t\t\t\tbins.append( \'<span class="super">(%s)</span>%s\' % (key, self.section_bins[key]) )\n+\t\t\tself.lookup[\'section_bins\'] = \'Bins: \' + \', \'.join(bins)\n+\t\telse:\n+\t\t\tself.lookup[\'section_bins\'] = \'\'\n+\n+\t\treturn """\n+\t\t\t\t<tfoot>\n+\t\t\t\t\t<tr>\n+\t\t\t\t\t\t<td colspan="%(column_count)s">\n+\t\t\t\t\t\t\t<div class="footerCenter">\n+\t\t\t\t\t\t\t\t%(filters)s. \n+\t\t\t\t\t\t\t</div>\n+\t\t\t\t\t\t\t<div class="footerLeft">\n+\t\t\t\t\t\t\t\t<span class="rowViewer0"></span> %(table_rows)s results. \n+\t\t\t\t\t\t\t\t<span class="rowViewer1 nonprintable"></span>\n+\t\t\t\t\t\t\t\t%(section_bins)s\n+\t\t\t\t\t\t\t</div> \n+\t\t\t\t\t\t\t<div class="footerRight">\n+\t\t\t\t\t\t\t\tReport produced on %(timestamp)s\n+\t\t\t\t\t\t\t</div>\n+\n+\t\t\t\t\t\t</td>\n+\t\t\t\t\t</tr>\n+\t\t\t\t</tfoot>\n+\t\t\t</table>""" % self.lookup\n+\n+\tdef _sectionFormEnd (self):\n+\t\treturn """\n+\t\t\t\n+\t\t""" \n+\n+\tdef _sectionEnd (self):\n+\t\treturn """\n+\t\n+\t\t</div>"""\n+\n+\n+\tdef _bodyEnd (self):\n+\n+\t\treturn """\n+\t\t\t</form>\\n\\t</body>\\n</html>"""\n+\n+\n'
b
diff -r 000000000000 -r 7db7ecc78ad6 templates/html_selectable_report_tool_state.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/html_selectable_report_tool_state.txt Mon Mar 02 20:46:00 2015 -0500
b
@@ -0,0 +1,1 @@
+386532663864313432623131656236333965653234346133623231333561303836643139623531663a37623232363936653730373537343232336132303232333433303331333932323263323032323566356637323635373237353665356637323635366436313730356636613666363235663639363435663566323233613230366537353663366332633230323236393665363336633566363537383633366332323361323032323563323233313563323232323263323032323733363536633635363337343232336132303232366537353663366332323263323032323566356637303631363736353566356632323361323033303764
b
diff -r 000000000000 -r 7db7ecc78ad6 test-data/blast_reporting_1.blastxml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blast_reporting_1.blastxml Mon Mar 02 20:46:00 2015 -0500
b
b'@@ -0,0 +1,3375 @@\n+<?xml version="1.0"?>\n+<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_BlastOutput.dtd">\n+<BlastOutput>\n+  <BlastOutput_program>blastn</BlastOutput_program>\n+  <BlastOutput_version>BLASTN 2.2.29+</BlastOutput_version>\n+  <BlastOutput_reference>Zheng Zhang, Scott Schwartz, Lukas Wagner, and Webb Miller (2000), &quot;A greedy algorithm for aligning DNA sequences&quot;, J Comput Biol 2000; 7(1-2):203-14.</BlastOutput_reference>\n+  <BlastOutput_db>/projects2/ref_databases/NCBI/BLAST/LATEST/nt</BlastOutput_db>\n+  <BlastOutput_query-ID>Query_1</BlastOutput_query-ID>\n+  <BlastOutput_query-def>Assembly_67_BCC9_consensus_sequence_primers_removed</BlastOutput_query-def>\n+  <BlastOutput_query-len>558</BlastOutput_query-len>\n+  <BlastOutput_param>\n+    <Parameters>\n+      <Parameters_expect>0.001</Parameters_expect>\n+      <Parameters_sc-match>1</Parameters_sc-match>\n+      <Parameters_sc-mismatch>-2</Parameters_sc-mismatch>\n+      <Parameters_gap-open>0</Parameters_gap-open>\n+      <Parameters_gap-extend>0</Parameters_gap-extend>\n+      <Parameters_filter>L;m;</Parameters_filter>\n+    </Parameters>\n+  </BlastOutput_param>\n+<BlastOutput_iterations>\n+<Iteration>\n+  <Iteration_iter-num>1</Iteration_iter-num>\n+  <Iteration_query-ID>Query_1</Iteration_query-ID>\n+  <Iteration_query-def>Assembly_67_BCC9_consensus_sequence_primers_removed</Iteration_query-def>\n+  <Iteration_query-len>558</Iteration_query-len>\n+<Iteration_hits>\n+<Hit>\n+  <Hit_num>1</Hit_num>\n+  <Hit_id>gi|158343837|gb|EU057669.1|</Hit_id>\n+  <Hit_def>Burkholderia stabilis strain FCF41 histidinol-phosphate aminotransferase (hisC) gene, partial cds; imidazole glycerol phosphate dehydratase (hisB), multiple antibiotic resistance-related protein (marC), imidazole glycerol phosphate synthase glutamine amidotransferase subunit (hisH), phosphoribosylformimino-5-aminoimidazole carboxamide ribotide isomerase (hisA), imidazole glycerol phosphate synthase subunit (hisF), phosphoribosyl-AMP cyclohydrolase (hisI), and phosphoribosyl-ATP pyrophosphohydrolase (hisE) genes, complete cds; and membrane protein gene, partial cds</Hit_def>\n+  <Hit_accession>EU057669</Hit_accession>\n+  <Hit_len>4804</Hit_len>\n+  <Hit_hsps>\n+    <Hsp>\n+      <Hsp_num>1</Hsp_num>\n+      <Hsp_bit-score>774.866</Hsp_bit-score>\n+      <Hsp_score>419</Hsp_score>\n+      <Hsp_evalue>0</Hsp_evalue>\n+      <Hsp_query-from>22</Hsp_query-from>\n+      <Hsp_query-to>472</Hsp_query-to>\n+      <Hsp_hit-from>2730</Hsp_hit-from>\n+      <Hsp_hit-to>2289</Hsp_hit-to>\n+      <Hsp_query-frame>1</Hsp_query-frame>\n+      <Hsp_hit-frame>-1</Hsp_hit-frame>\n+      <Hsp_identity>442</Hsp_identity>\n+      <Hsp_positive>442</Hsp_positive>\n+      <Hsp_gaps>9</Hsp_gaps>\n+      <Hsp_align-len>451</Hsp_align-len>\n+      <Hsp_qseq>TGCAGCATCCCGTCGCGGCCGATGTCCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCGNTTCAGGTCGACCAGATGGAGCCGCCNGGGCGCCCNGAGATCGACCCACCTTTGCGGGGCCATCGGCCCGCCGGGTCCT</Hsp_qseq>\n+      <Hsp_hseq>TGCAGCATCCCGTCGCGGCCGATGTCCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCG-TTCAGGTCGACCAGATGGAGCCGCC-GGGCGCC--GAGATCGACCCAC-TT-GCGGG-CCATCG-CC-GCCGGGTCCT</Hsp_hseq>\n+      <Hsp_midline>||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||'..b'CGTTCGCCGGCAGCATCATCGTCGGGCTGGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTCACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGACTACGGCGTCGAATCGATCGTCTACACGGACATCGGCCGCGACGGGATGCTGCA</Hsp_hseq>\n+      <Hsp_midline>|||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||| |||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||||| || ||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||| ||||| ||||  ||||||||||| ||||||   |||| |||||||||||| || |||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||||| ||||| |||||||||||||||||||| ||||||||||||||||||||||||||</Hsp_midline>\n+    </Hsp>\n+  </Hit_hsps>\n+</Hit>\n+<Hit>\n+  <Hit_num>19</Hit_num>\n+  <Hit_id>gi|158343727|gb|EU057657.1|</Hit_id>\n+  <Hit_def>Burkholderia ambifaria strain LMG19467 histidinol-phosphate aminotransferase (hisC) gene, partial cds; imidazole glycerol phosphate dehydratase (hisB), multiple antibiotic resistance-related protein (marC), imidazole glycerol phosphate synthase glutamine amidotransferase subunit (hisH), phosphoribosylformimino-5-aminoimidazole carboxamide ribotide isomerase (hisA), imidazole glycerol phosphate synthase subunit (hisF), phosphoribosyl-AMP cyclohydrolase (hisI), and phosphoribosyl-ATP pyrophosphohydrolase (hisE) genes, complete cds; and membrane protein gene, partial cds</Hit_def>\n+  <Hit_accession>EU057657</Hit_accession>\n+  <Hit_len>4807</Hit_len>\n+  <Hit_hsps>\n+    <Hsp>\n+      <Hsp_num>1</Hsp_num>\n+      <Hsp_bit-score>689.921</Hsp_bit-score>\n+      <Hsp_score>373</Hsp_score>\n+      <Hsp_evalue>0</Hsp_evalue>\n+      <Hsp_query-from>103</Hsp_query-from>\n+      <Hsp_query-to>544</Hsp_query-to>\n+      <Hsp_hit-from>2289</Hsp_hit-from>\n+      <Hsp_hit-to>2730</Hsp_hit-to>\n+      <Hsp_query-frame>1</Hsp_query-frame>\n+      <Hsp_hit-frame>1</Hsp_hit-frame>\n+      <Hsp_identity>419</Hsp_identity>\n+      <Hsp_positive>419</Hsp_positive>\n+      <Hsp_gaps>0</Hsp_gaps>\n+      <Hsp_align-len>442</Hsp_align-len>\n+      <Hsp_qseq>AGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCGTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA</Hsp_qseq>\n+      <Hsp_hseq>AGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTGCATCTGGTCGACCTGAACGGCGCATTCGCCGGCAAGCCGAAGAACCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGACGAAATCCCCGTACAGCTCGGCGGCGGCATCCGCAGCCTCGAGACGGTCGAGAAGTATCTCGACGCCGGCCTGTCCTACGTGATCATCGGCACGGCGGCCGTGAAGGACCCGGGCTTCCTGCGGGATGCGTGCACCGCGTTCGCGGGCAACATCATCGTCGGCCTCGATGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACGGGCCATGAAGTGATCGATCTCGCGCTGAAGTTCGAGGACTACGGCGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA</Hsp_hseq>\n+      <Hsp_midline>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||| |||||||||||||||||||| |||||||||||||||||||||||||||||||||||||| |||||||| || ||||||||||||||||| ||||||||||||||| ||||||||||||||||||| |||||||| |||||||||||||||||||||||||||||||| |||||||| ||||| || |||||||| ||||||  |||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||| ||||| ||||||||||||||||||| |||||||||||| ||||| |||||||||||||||||||||||||||||||||||||||||||||||</Hsp_midline>\n+    </Hsp>\n+  </Hit_hsps>\n+</Hit>\n+</Iteration_hits>\n+  <Iteration_stat>\n+    <Statistics>\n+      <Statistics_db-num>20069287</Statistics_db-num>\n+      <Statistics_db-len>50671056400</Statistics_db-len>\n+      <Statistics_hsp-len>33</Statistics_hsp-len>\n+      <Statistics_eff-space>26454639292441</Statistics_eff-space>\n+      <Statistics_kappa>0.46</Statistics_kappa>\n+      <Statistics_lambda>1.28</Statistics_lambda>\n+      <Statistics_entropy>0.85</Statistics_entropy>\n+    </Statistics>\n+  </Iteration_stat>\n+</Iteration>\n+</BlastOutput_iterations>\n+</BlastOutput>\n+\n'
b
diff -r 000000000000 -r 7db7ecc78ad6 test-data/blast_reporting_1a.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blast_reporting_1a.tabular Mon Mar 02 20:46:00 2015 -0500
b
b'@@ -0,0 +1,81 @@\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|158343987|gb|EU057686.1|\t99.77\t442\t1\t0\t103\t544\t2289\t2730\t0.0\t811\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|158343677|gb|EU057652.1|\t99.55\t442\t2\t0\t103\t544\t2285\t2726\t0.0\t806\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|158343667|gb|EU057651.1|\t99.55\t442\t2\t0\t103\t544\t2289\t2730\t0.0\t806\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|189332915|dbj|AP009385.1|\t99.55\t442\t2\t0\t103\t544\t3160621\t3160180\t0.0\t806\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|160340609|gb|CP000868.1|\t99.55\t442\t2\t0\t103\t544\t364152\t364593\t0.0\t806\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|28971668|dbj|AB091436.1|\t99.55\t442\t2\t0\t103\t544\t5598\t6039\t0.0\t806\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|290792748|gb|GU178771.1|\t99.32\t442\t3\t0\t103\t544\t4\t445\t0.0\t800\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|158343637|gb|EU057648.1|\t99.32\t442\t3\t0\t103\t544\t2289\t2730\t0.0\t800\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|290792750|gb|GU178772.1|\t99.28\t415\t3\t0\t130\t544\t1\t415\t0.0\t750\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|290082961|gb|GU086399.1|\t99.28\t414\t3\t0\t131\t544\t1\t414\t0.0\t749\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|294196006|gb|GU183892.1|\t99.75\t397\t1\t0\t130\t526\t1\t397\t0.0\t728\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|294196003|gb|GU183891.1|\t99.50\t400\t2\t0\t145\t544\t1\t400\t0.0\t728\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|290792752|gb|GU178773.1|\t99.75\t394\t1\t0\t151\t544\t1\t394\t0.0\t723\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|158343697|gb|EU057654.1|\t95.93\t442\t18\t0\t103\t544\t2316\t2757\t0.0\t717\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|158343687|gb|EU057653.1|\t95.93\t442\t18\t0\t103\t544\t2316\t2757\t0.0\t717\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|158343747|gb|EU057659.1|\t95.02\t442\t22\t0\t103\t544\t2289\t2730\t0.0\t695\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|115280044|gb|CP000440.1|\t95.02\t442\t22\t0\t103\t544\t391926\t392367\t0.0\t695\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|77965403|gb|CP000151.1|\t95.02\t442\t22\t0\t103\t544\t394319\t394760\t0.0\t695\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|158343727|gb|EU057657.1|\t94.80\t442\t23\t0\t103\t544\t2289\t2730\t0.0\t689\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|77965403|gb|CP000151.1|\t98.19\t442\t8\t0\t8\t449\t394760\t394319\t0.0\t773\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|158343807|gb|EU057666.1|\t97.74\t442\t10\t0\t8\t449\t2740\t2299\t0.0\t761\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|293627936|gb|GU068979.1|\t97.29\t442\t12\t0\t8\t449\t445\t4\t0.0\t750\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|158343947|gb|EU057682.1|\t97.29\t442\t12\t0\t8\t449\t2729\t2288\t0.0\t750\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|158343937|gb|EU057680.1|\t97.29\t442\t12\t0\t8\t449\t2729\t2288\t0.0\t750\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|158343597|gb|EU057644.1|\t97.06\t442\t13\t0\t8\t449\t2730\t2289\t0.0\t745\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|402246008|gb|CP003774.1|\t97.04\t439\t13\t0\t8\t446\t3371014\t3371452\t0.0\t739\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|293627938|gb|GU068980.1|\t96.83\t442\t14\t0\t8\t449\t445\t4\t0.0\t739\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|158343777|gb|EU057663.1|\t96.83\t442\t14\t0\t8\t449\t2734\t2293\t0.0\t739\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|158343627|gb|EU057647.1|\t96.83\t442\t14\t0\t8\t449\t2734\t2293\t0.0\t739\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|290767135|gb|GU187008.1|\t98.32\t416\t7\t0\t21\t436\t416\t1\t0.0\t730\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|158343837|gb|EU057669.1|\t96.38\t442\t16\t0\t8\t449\t2730\t2289\t0.0\t728\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|158343647|gb|EU057649.1|\t96.38\t442\t16\t0\t8\t449\t2730\t2289\t0.0\t728\r\n+Assembly_67_BCC6_consensus_sequence_primers_removed\tgi|169814598|gb|CP000958.1|\t96.38\t442\t16\t0'..b'BCC8_consensus_sequence_primers_removed\tgi|158343927|gb|EU057679.1|\t99.10\t442\t4\t0\t130\t571\t2287\t2728\t0.0\t795\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|158343897|gb|EU057675.1|\t99.10\t442\t4\t0\t130\t571\t2287\t2728\t0.0\t795\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|158343857|gb|EU057671.1|\t99.10\t442\t4\t0\t130\t571\t2287\t2728\t0.0\t795\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|158343757|gb|EU057661.1|\t99.10\t442\t4\t0\t130\t571\t2287\t2728\t0.0\t795\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|158343617|gb|EU057646.1|\t99.10\t442\t4\t0\t130\t571\t2287\t2728\t0.0\t795\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|290565698|gb|GU170810.1|\t98.87\t442\t5\t0\t130\t571\t4\t445\t0.0\t789\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|158343877|gb|EU057673.1|\t98.87\t442\t5\t0\t130\t571\t2286\t2727\t0.0\t789\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|190714214|emb|AM747720.1|\t98.87\t442\t5\t0\t130\t571\t348935\t349376\t0.0\t789\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|169814598|gb|CP000958.1|\t98.87\t442\t5\t0\t130\t571\t447650\t448091\t0.0\t789\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|158343967|gb|EU057684.1|\t98.64\t442\t6\t0\t130\t571\t2287\t2728\t0.0\t784\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|158343917|gb|EU057678.1|\t97.51\t442\t11\t0\t130\t571\t2287\t2728\t0.0\t756\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|158343907|gb|EU057677.1|\t97.51\t442\t11\t0\t130\t571\t2287\t2728\t0.0\t756\r\n+Assembly_67_BCC8_consensus_sequence_primers_removed\tgi|158343887|gb|EU057674.1|\t97.51\t442\t11\t0\t130\t571\t2287\t2728\t0.0\t756\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343837|gb|EU057669.1|\t98.00\t451\t0\t8\t22\t472\t2730\t2289\t0.0\t774\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343647|gb|EU057649.1|\t98.00\t451\t0\t8\t22\t472\t2730\t2289\t0.0\t774\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|294195954|gb|GU183875.1|\t99.50\t403\t0\t2\t22\t424\t401\t1\t0.0\t732\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343597|gb|EU057644.1|\t95.57\t451\t11\t8\t22\t472\t2730\t2289\t0.0\t713\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|293627938|gb|GU068980.1|\t95.34\t451\t12\t8\t22\t472\t445\t4\t0.0\t708\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|293627936|gb|GU068979.1|\t95.34\t451\t12\t8\t22\t472\t445\t4\t0.0\t708\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343777|gb|EU057663.1|\t95.34\t451\t12\t8\t22\t472\t2734\t2293\t0.0\t708\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343627|gb|EU057647.1|\t95.34\t451\t12\t8\t22\t472\t2734\t2293\t0.0\t708\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|77965403|gb|CP000151.1|\t95.34\t451\t12\t8\t22\t472\t394760\t394319\t0.0\t708\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343947|gb|EU057682.1|\t95.12\t451\t13\t7\t22\t472\t2729\t2288\t0.0\t702\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343937|gb|EU057680.1|\t95.12\t451\t13\t7\t22\t472\t2729\t2288\t0.0\t702\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343807|gb|EU057666.1|\t95.12\t451\t13\t7\t22\t472\t2740\t2299\t0.0\t702\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|294196000|gb|GU183890.1|\t98.98\t393\t0\t3\t48\t440\t389\t1\t0.0\t701\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|402246008|gb|CP003774.1|\t94.64\t448\t15\t8\t22\t469\t3371014\t3371452\t0.0\t686\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|290767135|gb|GU187008.1|\t96.22\t423\t9\t6\t35\t457\t416\t1\t0.0\t686\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343927|gb|EU057679.1|\t94.01\t451\t18\t8\t22\t472\t2728\t2287\t0.0\t675\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343897|gb|EU057675.1|\t94.01\t451\t18\t8\t22\t472\t2728\t2287\t0.0\t675\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343757|gb|EU057661.1|\t94.01\t451\t18\t8\t22\t472\t2728\t2287\t0.0\t675\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343617|gb|EU057646.1|\t94.01\t451\t18\t8\t22\t472\t2728\t2287\t0.0\t675\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|290767133|gb|GU187007.1|\t96.78\t404\t9\t3\t35\t438\t400\t1\t0.0\t671\n'
b
diff -r 000000000000 -r 7db7ecc78ad6 test-data/blast_reporting_1b.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blast_reporting_1b.tabular Mon Mar 02 20:46:00 2015 -0500
b
@@ -0,0 +1,51 @@
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|158343987|gb|EU057686.1| 99.77 442 1 0 103 544 2289 2730 0.0 811
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|158343677|gb|EU057652.1| 99.55 442 2 0 103 544 2285 2726 0.0 806
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|158343667|gb|EU057651.1| 99.55 442 2 0 103 544 2289 2730 0.0 806
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|189332915|dbj|AP009385.1| 99.55 442 2 0 103 544 3160621 3160180 0.0 806
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|160340609|gb|CP000868.1| 99.55 442 2 0 103 544 364152 364593 0.0 806
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|28971668|dbj|AB091436.1| 99.55 442 2 0 103 544 5598 6039 0.0 806
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|290792748|gb|GU178771.1| 99.32 442 3 0 103 544 4 445 0.0 800
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|158343637|gb|EU057648.1| 99.32 442 3 0 103 544 2289 2730 0.0 800
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|290792750|gb|GU178772.1| 99.28 415 3 0 130 544 1 415 0.0 750
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|290082961|gb|GU086399.1| 99.28 414 3 0 131 544 1 414 0.0 749
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|294196006|gb|GU183892.1| 99.75 397 1 0 130 526 1 397 0.0 728
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|294196003|gb|GU183891.1| 99.50 400 2 0 145 544 1 400 0.0 728
+Assembly_67_BCC2_consensus_sequence_primers_removed gi|290792752|gb|GU178773.1| 99.75 394 1 0 151 544 1 394 0.0 723
+Assembly_67_BCC6_consensus_sequence_primers_removed gi|77965403|gb|CP000151.1| 98.19 442 8 0 8 449 394760 394319 0.0 773
+Assembly_67_BCC6_consensus_sequence_primers_removed gi|158343807|gb|EU057666.1| 97.74 442 10 0 8 449 2740 2299 0.0 761
+Assembly_67_BCC6_consensus_sequence_primers_removed gi|293627936|gb|GU068979.1| 97.29 442 12 0 8 449 445 4 0.0 750
+Assembly_67_BCC6_consensus_sequence_primers_removed gi|158343947|gb|EU057682.1| 97.29 442 12 0 8 449 2729 2288 0.0 750
+Assembly_67_BCC6_consensus_sequence_primers_removed gi|158343937|gb|EU057680.1| 97.29 442 12 0 8 449 2729 2288 0.0 750
+Assembly_67_BCC6_consensus_sequence_primers_removed gi|158343597|gb|EU057644.1| 97.06 442 13 0 8 449 2730 2289 0.0 745
+Assembly_67_BCC6_consensus_sequence_primers_removed gi|402246008|gb|CP003774.1| 97.04 439 13 0 8 446 3371014 3371452 0.0 739
+Assembly_67_BCC6_consensus_sequence_primers_removed gi|290767135|gb|GU187008.1| 98.32 416 7 0 21 436 416 1 0.0 730
+Assembly_67_BCC6_consensus_sequence_primers_removed gi|290767131|gb|GU187006.1| 98.08 416 8 0 21 436 416 1 0.0 725
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343827|gb|EU057668.1| 99.77 442 1 0 130 571 2287 2728 0.0 811
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|290565700|gb|GU170811.1| 99.55 442 2 0 130 571 4 445 0.0 806
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343957|gb|EU057683.1| 99.55 442 2 0 130 571 2287 2728 0.0 806
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343867|gb|EU057672.1| 99.55 442 2 0 130 571 2287 2728 0.0 806
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343767|gb|EU057662.1| 99.55 442 2 0 130 571 2287 2728 0.0 806
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|290565702|gb|GU170812.1| 99.32 442 3 0 130 571 4 445 0.0 800
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343977|gb|EU057685.1| 99.32 442 3 0 130 571 2287 2728 0.0 800
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343847|gb|EU057670.1| 99.32 442 3 0 130 571 2287 2728 0.0 800
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343817|gb|EU057667.1| 99.32 442 3 0 130 571 2287 2728 0.0 800
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343787|gb|EU057664.1| 99.32 442 3 0 130 571 2287 2728 0.0 800
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|116646113|gb|CP000458.1| 99.32 442 3 0 130 571 479644 480085 0.0 800
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|105891751|gb|CP000378.1| 99.32 442 3 0 130 571 2947001 2946560 0.0 800
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343927|gb|EU057679.1| 99.10 442 4 0 130 571 2287 2728 0.0 795
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343897|gb|EU057675.1| 99.10 442 4 0 130 571 2287 2728 0.0 795
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343857|gb|EU057671.1| 99.10 442 4 0 130 571 2287 2728 0.0 795
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343757|gb|EU057661.1| 99.10 442 4 0 130 571 2287 2728 0.0 795
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343617|gb|EU057646.1| 99.10 442 4 0 130 571 2287 2728 0.0 795
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|290565698|gb|GU170810.1| 98.87 442 5 0 130 571 4 445 0.0 789
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343877|gb|EU057673.1| 98.87 442 5 0 130 571 2286 2727 0.0 789
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|190714214|emb|AM747720.1| 98.87 442 5 0 130 571 348935 349376 0.0 789
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|169814598|gb|CP000958.1| 98.87 442 5 0 130 571 447650 448091 0.0 789
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343967|gb|EU057684.1| 98.64 442 6 0 130 571 2287 2728 0.0 784
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343917|gb|EU057678.1| 97.51 442 11 0 130 571 2287 2728 0.0 756
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343907|gb|EU057677.1| 97.51 442 11 0 130 571 2287 2728 0.0 756
+Assembly_67_BCC8_consensus_sequence_primers_removed gi|158343887|gb|EU057674.1| 97.51 442 11 0 130 571 2287 2728 0.0 756
+Assembly_67_BCC9_consensus_sequence_primers_removed gi|158343837|gb|EU057669.1| 98.00 451 0 8 22 472 2730 2289 0.0 774
+Assembly_67_BCC9_consensus_sequence_primers_removed gi|158343647|gb|EU057649.1| 98.00 451 0 8 22 472 2730 2289 0.0 774
+Assembly_67_BCC9_consensus_sequence_primers_removed gi|294195954|gb|GU183875.1| 99.50 403 0 2 22 424 401 1 0.0 732
+Assembly_67_BCC9_consensus_sequence_primers_removed gi|294196000|gb|GU183890.1| 98.98 393 0 3 48 440 389 1 0.0 701
b
diff -r 000000000000 -r 7db7ecc78ad6 test-data/blast_reporting_1c.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blast_reporting_1c.tabular Mon Mar 02 20:46:00 2015 -0500
b
b'@@ -0,0 +1,52 @@\n+Query Id\tSubject Id\t% Identical\tLength\tMismatches\tGaps-openings\tQ. Start\tQ. End\tS. Start\tS. End\tE-value\tBit Score\tSubject Ids\tRaw Score\tIdent. Matches\tPos. Matches\tGaps\t% Positive\tQuery Frame\tSubject Frame\tQ. Alignment\tS. Alignment\tQuery Length\tSubject Length\t% Coverage\tSubject Descriptions\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|290792750|gb|GU178772.1|\t99.28\t415\t3\t0\t130\t544\t1\t415\t0.0\t750\tgi|290792750|gb|GU178772.1|\t406\t412\t412\t0\t99.28\t1\t1\tGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCGTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\tGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCATTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCCTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGACCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t719\t415\t57.72\tBurkholderia multivorans strain FCF 11 proFAR isomerase (hisA) gene, partial cds\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|290082961|gb|GU086399.1|\t99.28\t414\t3\t0\t131\t544\t1\t414\t0.0\t749\tgi|290082961|gb|GU086399.1|\t405\t411\t411\t0\t99.28\t1\t1\tGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCGTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\tGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCATTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCCTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGACCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t719\t414\t57.58\tBurkholderia multivorans strain FCF6 HisA (hisA) gene, partial cds\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|290792748|gb|GU178771.1|\t99.32\t442\t3\t0\t103\t544\t4\t445\t0.0\t800\tgi|290792748|gb|GU178771.1|\t433\t439\t439\t0\t99.32\t1\t1\tAGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCGTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\tAGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTTGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCCTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAAGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t719\t448\t61.47\tBurkholderia multivorans strain FCF 10 proFAR isomerase (hisA) gene, partial cds\r\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tgi|158343637|gb|EU057648.1|\t99.32\t442\t3\t0\t103\t544\t2289\t2730\t0.0\t800\tgi|158343637|gb|EU057648.1|\t433\t439\t439\t0\t99.32\t1\t1\tAGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCG'..b'), imidazole glycerol phosphate synthase subunit (hisF), phosphoribosyl-AMP cyclohydrolase (hisI), and phosphoribosyl-ATP pyrophosphohydrolase (hisE) genes, complete cds; and membrane protein gene, partial cds\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|158343647|gb|EU057649.1|\t98.00\t451\t0\t8\t22\t472\t2730\t2289\t0.0\t774\tgi|158343647|gb|EU057649.1|\t419\t442\t442\t9\t98.00\t1\t-1\tTGCAGCATCCCGTCGCGGCCGATGTCCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCGNTTCAGGTCGACCAGATGGAGCCGCCNGGGCGCCCNGAGATCGACCCACCTTTGCGGGGCCATCGGCCCGCCGGGTCCT\tTGCAGCATCCCGTCGCGGCCGATGTCCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCG-TTCAGGTCGACCAGATGGAGCCGCC-GGGCGCC--GAGATCGACCCAC-TT-GCGGG-CCATCG-CC-GCCGGGTCCT\t558\t4766\t80.82\tBurkholderia stabilis strain LMG14294 histidinol-phosphate aminotransferase (hisC) gene, partial cds; imidazole glycerol phosphate dehydratase (hisB), multiple antibiotic resistance-related protein (marC), imidazole glycerol phosphate synthase glutamine amidotransferase subunit (hisH), phosphoribosylformimino-5-aminoimidazole carboxamide ribotide isomerase (hisA), imidazole glycerol phosphate synthase subunit (hisF), phosphoribosyl-AMP cyclohydrolase (hisI), and phosphoribosyl-ATP pyrophosphohydrolase (hisE) genes, complete cds; and membrane protein gene, partial cds\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|294196000|gb|GU183890.1|\t98.98\t393\t0\t3\t48\t440\t389\t1\t0.0\t701\tgi|294196000|gb|GU183890.1|\t379\t389\t389\t4\t98.98\t1\t-1\tCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCGNTTCAGGTCGACCAGATGGAGCCGCCNGGGCGCCCNGAGATCGACCC\tCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCG-TTCAGGTCGACCAGATGGAGCCGCC-GGGCGCC--GAGATCGACCC\t558\t389\t70.43\tBurkholderia stabilis strain LMG 18870 ProFAR isomerase (hisA) gene, partial cds\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tgi|294195954|gb|GU183875.1|\t99.50\t403\t0\t2\t22\t424\t401\t1\t0.0\t732\tgi|294195954|gb|GU183875.1|\t396\t401\t401\t2\t99.50\t1\t-1\tTGCAGCATCCCGTCGCGGCCGATGTCCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCGNTTCAGGTCGACCAGATGGAGCCGCCNGGGC\tTGCAGCATCCCGTCGCGGCCGATGTCCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCG-TTCAGGTCGACCAGATGGAGCCGCC-GGGC\t558\t401\t72.22\tBurkholderia stabilis strain FCF40 ProFAR isomerase (hisA) gene, partial cds\n'
b
diff -r 000000000000 -r 7db7ecc78ad6 test-data/blast_reporting_1c1.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blast_reporting_1c1.tabular Mon Mar 02 20:46:00 2015 -0500
b
b'@@ -0,0 +1,55 @@\n+Assembly_67_BCC2_consensus_sequence_primers_removed\tGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCGTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t0\t1\r\n+gi|290792750|gb|GU178772.1|\tGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCATTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCCTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGACCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t0\t2\r\n+gi|290082961|gb|GU086399.1|\tGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCATTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCCTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGACCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t0\t3\r\n+gi|290792748|gb|GU178771.1|\tAGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTTGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCCTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAAGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t0\t4\r\n+gi|158343637|gb|EU057648.1|\tAGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCATTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGACCCGGGCTTTCTGCGCGACGCATGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t0\t5\r\n+gi|294196003|gb|GU183891.1|\tCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCATGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCCGCA\t0\t6\r\n+gi|158343677|gb|EU057652.1|\tAGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTTGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCCTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t0\t7\r\n+gi|158343667|gb|EU057651.1|\tAGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCCGTGAAGGATCCGGGCTTTCTGCGCGACGCCTGCACGGCGTTCCAGGGCAACATCATCGTCGGCCTCGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAAGTGATCGATCTCGCGCAGAAGTTCGAGGATTACGGTGTCGAATCGATCGTCTACACGGACATCGGCCGCGACGGGATGCTGCA\t0\t8\r\n+gi|189332915|dbj|AP009385.1|\tAGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTGCATCTCGTCGACCTGAACGGCGCGTTCGCCGGCAAGCCGAAGAATCTCGATGCGATCGAAGCGATCCTCGACGAAGTCGGCGATGAAATCCCGGTGCAGCTCGGCGGCGGCATTCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCGGGCCTGTCGTACGTGATCATCGGCACGGCGGCC'..b'GTGAAGAACCCGGGCTTCCTGCAGGACGCGTGCACCGCGTTTTCCGGCAGCATCATCGTCGGGCTGGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAGGTGATCGATCTCGCGAAGAAGTTCGAGGACTACGGCGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t2\t47\r\n+gi|158343867|gb|EU057672.1|\tAGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTCCATCTCGTCGACCTGAACGGCGCATTCGCCGGCAAGCCGAAGAATCTCGAGGCGATCGAAGCGATCCTCGACGAAGTCGGCGACGAAATTCCCGTCCAGCTCGGCGGCGGCATCCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCCGGCCTGTCCTACGTGATCATCGGCACCGCCGCCGTGAAGAACCCGGGCTTCCTGCAGGACGCGTGCACCGCGTTTTCCGGCAGCATCATCGTCGGGCTGGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAGGTGATCGATCTCGCGAAGAAGTTCGAGGACTACGGCGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t2\t48\r\n+gi|158343767|gb|EU057662.1|\tAGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTCCATCTCGTCGACCTGAACGGCGCATTCGCCGGCAAGCCGAAGAATCTCGAGGCGATCGAAGCGATCCTCGACGAAGTCGGCGACGAAATTCCCGTCCAGCTCGGCGGCGGCATCCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCCGGCCTGTCCTACGTGATCATCGGCACCGCCGCCGTGAAGAACCCGGGCTTCCTGCAGGACGCGTGCACCGCGTTTTCCGGCAGCATCATCGTCGGGCTGGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAGGTGATCGATCTCGCGAAGAAGTTCGAGGACTACGGCGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t2\t49\r\n+gi|158343827|gb|EU057668.1|\tAGGACCCGGCGGCGATGGCCCGCAAGTGGGTCGATCTCGGCGCCCGGCGGCTCCATCTCGTCGACCTGAACGGCGCATTCGCCGGCAAGCCGAAGAATCTCGAGGCGATCGAAGCGATCCTCGACGAAGTCGGCGACGAAATTCCCGTCCAGCTCGGCGGCGGCATCCGCAGCCTCGAGACGATCGAGAAGTATCTCGACGCCGGCCTGTCCTACGTGATCATCGGCACGGCGGCCGTGAAGAACCCGGGCTTCCTGCAGGACGCGTGCACCGCGTTTTCCGGCAGCATCATCGTCGGGCTGGACGCGAAGGACGGCAAGGTCGCGACCGACGGCTGGAGCAAGCTGACCGGCCACGAGGTGATCGATCTCGCGAAGAAGTTCGAGGACTACGGTGTCGAATCGATCGTCTACACCGACATCGGCCGCGACGGGATGCTGCA\t2\t50\r\n+Assembly_67_BCC9_consensus_sequence_primers_removed\tTGCAGCATCCCGTCGCGGCCGATGTCCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCGNTTCAGGTCGACCAGATGGAGCCGCCNGGGCGCCCNGAGATCGACCCACCTTTGCGGGGCCATCGGCCCGCCGGGTCCT\t3\t51\r\n+gi|158343837|gb|EU057669.1|\tTGCAGCATCCCGTCGCGGCCGATGTCCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCG-TTCAGGTCGACCAGATGGAGCCGCC-GGGCGCC--GAGATCGACCCAC-TT-GCGGG-CCATCG-CC-GCCGGGTCCT\t3\t52\r\n+gi|158343647|gb|EU057649.1|\tTGCAGCATCCCGTCGCGGCCGATGTCCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCG-TTCAGGTCGACCAGATGGAGCCGCC-GGGCGCC--GAGATCGACCCAC-TT-GCGGG-CCATCG-CC-GCCGGGTCCT\t3\t53\r\n+gi|294196000|gb|GU183890.1|\tCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCG-TTCAGGTCGACCAGATGGAGCCGCC-GGGCGCC--GAGATCGACCC\t3\t54\r\n+gi|294195954|gb|GU183875.1|\tTGCAGCATCCCGTCGCGGCCGATGTCCGTATAGACGATCGATTCGACGCCGTAGTCCTCGAACTTCTTCGCGAGATCGATCACTTCGTGGCCCGTCAGCTTGCTCCAGCCGTCGGTCGCGACCTTGCCGTCCTTCGCGTCCAGCCCGACGATGATGCTGCCCGCGAACGCGGTGCACGCGTCCTGCAGGAAGCCCGGATCCTTCACGGCCGCCGTGCCGATAATCACGTAGGACAGGCCCGCGTCGAGGTACTTCTCGATCGTCTCGAGGCTGCGGATGCCGCCGCCGAGCTGCACGGGGATTTCATCGCCGACTTCGTCGAGGATCGCCTCGATCGCCTCGAGATTCCTCGGCTTGCCGGCGAATGCGCCG-TTCAGGTCGACCAGATGGAGCCGCC-GGGC\t3\t55\n'
b
diff -r 000000000000 -r 7db7ecc78ad6 test-data/blastx_sample.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastx_sample.xml Mon Mar 02 20:46:00 2015 -0500
[
b'@@ -0,0 +1,758 @@\n+<?xml version="1.0"?>\n+<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "NCBI_BlastOutput.dtd">\n+<BlastOutput>\n+  <BlastOutput_program>blastx</BlastOutput_program>\n+  <BlastOutput_version>BLASTX 2.2.24+</BlastOutput_version>\n+  <BlastOutput_reference>Stephen F. Altschul, Thomas L. Madden, Alejandro A. Sch&amp;auml;ffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), &quot;Gapped BLAST and PSI-BLAST: a new generation of protein database search programs&quot;, Nucleic Acids Res. 25:3389-3402.</BlastOutput_reference>\n+  <BlastOutput_db>/share/BlastDB/nr</BlastOutput_db>\n+  <BlastOutput_query-ID>Query_1</BlastOutput_query-ID>\n+  <BlastOutput_query-def>phage_suis</BlastOutput_query-def>\n+  <BlastOutput_query-len>1890</BlastOutput_query-len>\n+  <BlastOutput_param>\n+    <Parameters>\n+      <Parameters_matrix>BLOSUM62</Parameters_matrix>\n+      <Parameters_expect>0.001</Parameters_expect>\n+      <Parameters_gap-open>11</Parameters_gap-open>\n+      <Parameters_gap-extend>1</Parameters_gap-extend>\n+      <Parameters_filter>L;</Parameters_filter>\n+    </Parameters>\n+  </BlastOutput_param>\n+  <BlastOutput_iterations>\n+    <Iteration>\n+      <Iteration_iter-num>1</Iteration_iter-num>\n+      <Iteration_query-ID>Query_1</Iteration_query-ID>\n+      <Iteration_query-def>phage_suis</Iteration_query-def>\n+      <Iteration_query-len>1890</Iteration_query-len>\n+      <Iteration_hits>\n+        <Hit>\n+          <Hit_num>1</Hit_num>\n+          <Hit_id>gi|119953746|ref|YP_950551.1|</Hit_id>\n+          <Hit_def>tail tape measure protein [Streptococcus phage SMP] &gt;gi|118430558|gb|ABK91882.1| tail tape measure protein [Streptococcus phage SMP]</Hit_def>\n+          <Hit_accession>YP_950551</Hit_accession>\n+          <Hit_len>659</Hit_len>\n+          <Hit_hsps>\n+            <Hsp>\n+              <Hsp_num>1</Hsp_num>\n+              <Hsp_bit-score>988.407949172964</Hsp_bit-score>\n+              <Hsp_score>2554</Hsp_score>\n+              <Hsp_evalue>0</Hsp_evalue>\n+              <Hsp_query-from>336</Hsp_query-from>\n+              <Hsp_query-to>1889</Hsp_query-to>\n+              <Hsp_hit-from>25</Hsp_hit-from>\n+              <Hsp_hit-to>542</Hsp_hit-to>\n+              <Hsp_query-frame>3</Hsp_query-frame>\n+              <Hsp_hit-frame>0</Hsp_hit-frame>\n+              <Hsp_identity>518</Hsp_identity>\n+              <Hsp_positive>518</Hsp_positive>\n+              <Hsp_gaps>0</Hsp_gaps>\n+              <Hsp_align-len>518</Hsp_align-len>\n+              <Hsp_qseq>NWFHLLNSGGSALSVMFAKLVGIIAGISAPIWXXXXXXXXXXXXXXXXYNTNEEFRTKVQAAWEAIKSAISTAVEAVVSFVMDLWGQMVAWWNENQELIRQTAETVWNAIRTVVETVMTALIPIVQTAWDLILAVVTTVLNVIKTVVDTGLKVVLGIIKAVMQMINGDWSGAWETLKGVAGTIWEGIKSLVQVAIDGLVQIFQTGLAFLKSIWDTVWGTIMAVVGPIWDWIKTTVSNAITAVWEIIQNIMTSIQTTWDTVWNAISTVASNIWTAISTTVMSVLTTIWGYIQTYLELIKTVWSAAWEIIKAVFAAILLTIVGLVTGNFDLIKQAISNAWEIIKTKTSEIWNAITTFLSGIWEGIKTAASTAWEWIKTTISNVMTTIKSNIETAWNNIKTSISNALNNIKSAAENAWNNIKSAISTAIENIKSTVSNGWNNLVSTVTNAGPRIVSAVRTGFDNAVNAARNFISNAISVGGDLINGFVEGVKGAAGRLIDAVGGAVSGAIDWAKGLLGIKS</Hsp_qseq>\n+              <Hsp_hseq>NWFHLLNSGGSALSVMFAKLVGIIAGISAPIWAVIGVIAALVAGFVLLYNTNEEFRTKVQAAWEAIKSAISTAVEAVVSFVMDLWGQMVAWWNENQELIRQTAETVWNAIRTVVETVMTALIPIVQTAWDLILAVVTTVLNVIKTVVDTGLKVVLGIIKAVMQMINGDWSGAWETLKGVAGTIWEGIKSLVQVAIDGLVQIFQTGLAFLKSIWDTVWGTIMAVVGPIWDWIKTTVSNAITAVWEIIQNIMTSIQTTWDTVWNAISTVASNIWTAISTTVMSVLTTIWGYIQTYLELIKTVWSAAWEIIKAVFAAILLTIVGLVTGNFDLIKQAISNAWEIIKTKTSEIWNAITTFLSGIWEGIKTAASTAWEWIKTTISNVMTTIKSNIETAWNNIKTSISNALNNIKSAAENAWNNIKSAISTAIENIKSTVSNGWNNLVSTVTNAGPRIVSAVRTGFDNAVNAARNFISNAISVGGDLINGFVEGVKGAAGRLIDAVGGAVSGAIDWAKGLLGIKS</Hsp_hseq>\n+              <Hsp_midline>NWFHLLNSGGSALSVMFAKLVGIIAGISAPIWAVIGVIAALVAGFVLLYNTNEEFRTKVQAAWEAIKSAISTAVEAVVSFVMDLWGQMVAWWNENQELIRQTAETVWNAIRTVVETVMTALIPIVQTAWDLILAVVTTVLNVIKTVVDTGLKVVLGIIKAVMQMINGDWSGAWETLKGVAGTIWEGIKSLVQVAIDGLVQIFQTGLAFLKSIWDTVWGTIMAVVGPIWDWIKTTVSNAITAVWEIIQNIMTSIQTTWDTVWNAISTVASNIWTAISTTVMSVLTTIWGYIQTYLELIKTVWSAAWEIIKAVFAAILLTIVGLVTGNFDLIKQAISNAWEIIKTKTSEIWNAITTFLSGIWEGIKT'..b'\n+              <Hsp_qseq>AIRTVVETVMTALIPIVQTAWDLILAVVTTVLNVIKTVVDTGLKVVLGIIKAVMQMINGDWSGAWETLKGVAGTIWEGIKSLVQVA------IDGLVQIFQTGLAFLKSIWDTVWGTIMAVVGPIWDWIKTTVSNAITAVWEIIQNIMTSIQTTWDTVWNAISTVASNIWTAISTTVMSVLTTIWGYIQTYLELIKTVWSAAWEIIKAVFAAILLTIVGLVTGNFDLIKQAISNAWEIIKTKTSEIWNAITTFLSGIWEGIKTAASTAWEWIKTTISNVMTTIKSNIETAWNNIKTSISNALNNIKSAAENAWNNIKSAISTAIENIKSTVSNGWNNLVSTVTNAGPRIVSAVRTGFDNAVNAARNFISNAISVGGDLINGFVEGVKGAAGRLIDAVGGAVSGAIDW-AKG</Hsp_qseq>\n+              <Hsp_hseq>AMAEVGGVLAEALAPVLELLAQLLQAVANWFSN-LPGPIQTFIVIMGGLITVVGLLLPGLLA-----LQAAAVAMGTTIGGLVVAAAPIVGTVLGIIAVITLLVVWIQELWQNNEGFRTAVI-EIWNAIYAFISVIIQEISTFIMTIWGTLTTWWTENQALIQAAVETVWNAISTVIQTVMSLIGPYLEAAWANIQLIITTAWEIIKTVVETAITVVLGIIKAIMQAITGDWSGAWETIKGVLQRVWQAIQQIVTTILSAIGQFISNTWNGIKNTFSNILSAISGIVSSIWNTIKSVISSVISSIVSFVSSGWSGIQQTISSILSGISSTVSSVWNGIKNSISNA----INGAKNVVSSAINAIKNLFNFKISWPHIPLPHF--SVSGSANPLDWLKGGLPKISIAWYAKG</Hsp_hseq>\n+              <Hsp_midline>A+  V   +  AL P+++    L+ AV     N +   + T + ++ G+I  V  ++ G  +     L+  A  +   I  LV  A      + G++ +    + +++ +W    G   AV+  IW+ I   +S  I  +   I  I  ++ T W      I      +W AIST + +V++ I  Y++     I+ + + AWEIIK V    +  ++G++      I    S AWE IK     +W AI   ++ I   I    S  W  IK T SN+++ I   + + WN IK+ IS+ +++I S   + W+ I+  IS+ +  I STVS+ WN + ++++NA    ++  +    +A+NA +N  +  IS     +  F   V G+A  L    GG    +I W AKG</Hsp_midline>\n+            </Hsp>\n+            <Hsp>\n+              <Hsp_num>3</Hsp_num>\n+              <Hsp_bit-score>121.708903358919</Hsp_bit-score>\n+              <Hsp_score>304</Hsp_score>\n+              <Hsp_evalue>2.99798279087674e-25</Hsp_evalue>\n+              <Hsp_query-from>543</Hsp_query-from>\n+              <Hsp_query-to>1673</Hsp_query-to>\n+              <Hsp_hit-from>637</Hsp_hit-from>\n+              <Hsp_hit-to>1004</Hsp_hit-to>\n+              <Hsp_query-frame>3</Hsp_query-frame>\n+              <Hsp_hit-frame>0</Hsp_hit-frame>\n+              <Hsp_identity>89</Hsp_identity>\n+              <Hsp_positive>168</Hsp_positive>\n+              <Hsp_gaps>29</Hsp_gaps>\n+              <Hsp_align-len>387</Hsp_align-len>\n+              <Hsp_qseq>ISTAVEAVVSFVMDLWGQMVAWWNENQELIRQTAETVWNAIRTVVETVMTALIPIVQTAWDLILAVVTTVLNVIKTVVDTGLKVVLGIIKAVMQMINGDWSGAWETLKGVAGTIWEGIKSLVQVAIDGLVQIFQTGLAFLKSIWDTVWGTIMAVVGPIWDWIKTTVSNAITAVWEIIQNIMTSIQTTWDTVWNAISTVASNIWTAISTTVMSVLTTIWGYIQTYLELIKTVWSAAWEIIKAVFAAILLTIVGLVTGNFDLIKQAISNAWEIIKTKTSEIWNAITTFLSG--IWEGIK------TAASTAWEWIKTTISNVMTT--IKSNIETAWNNIKTSISNALNNIKSAAENAWNNIKSAISTAIENIKSTVSNGWNNLVSTVTN</Hsp_qseq>\n+              <Hsp_hseq>IIAVITLLVVWIQELW--------QNNEGFRTAVIEIWNAIYAFISVIIQEISTFIMTIWGTLTTWWTENQALIQAAVETVWNAISTVIQTVMSLIGPYLEAAWANIQLIITTAWEIIKTVVETAITVVLGIIKAIMQAITGDWSGAWETIKGVLQRVWQAIQQIVTTILSAIGQFISNTWNGIKNTFSNILSAISGIVSSIWNTIKSVISSVISSIVSFV-----------SSGWSGIQQTISSILSGISSTVSSVWNGIKNSISNAINGAKNVVSSAINAIKNLFNFKISWPHIPLPHFSVSGSANPLDWLKGGLPKISIAWYAKGGILTKPTAFGMNEKQLMVGGEAGKEAVLPLTKQNLAAIGEGIASTMGTGGNFINVSITD</Hsp_hseq>\n+              <Hsp_midline>I   +  +V ++ +LW        +N E  R     +WNAI   +  ++  +   + T W  +    T    +I+  V+T    +  +I+ VM +I      AW  ++ +  T WE IK++V+ AI  ++ I +  +  +   W   W TI  V+  +W  I+  V+  ++A+ + I N    I+ T+  + +AIS + S+IW  I + + SV+++I  ++           S+ W  I+   ++IL  I   V+  ++ IK +ISNA    K   S   NAI    +    W  I       + ++   +W+K  +  +      K  I T       +    +   ++  E      K  ++   E I ST+  G N +  ++T+</Hsp_midline>\n+            </Hsp>\n+          </Hit_hsps>\n+        </Hit>\n+      </Iteration_hits>\n+      <Iteration_stat>\n+        <Statistics>\n+          <Statistics_db-num>12310662</Statistics_db-num>\n+          <Statistics_db-len>-87459526</Statistics_db-len>\n+          <Statistics_hsp-len>0</Statistics_hsp-len>\n+          <Statistics_eff-space>1174893963300</Statistics_eff-space>\n+          <Statistics_kappa>0.041</Statistics_kappa>\n+          <Statistics_lambda>0.267</Statistics_lambda>\n+          <Statistics_entropy>0.14</Statistics_entropy>\n+        </Statistics>\n+      </Iteration_stat>\n+    </Iteration>\n+  </BlastOutput_iterations>\n+</BlastOutput>\n'
b
diff -r 000000000000 -r 7db7ecc78ad6 test-data/blastx_sample_converted.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastx_sample_converted.tabular Mon Mar 02 20:46:00 2015 -0500
b
@@ -0,0 +1,33 @@
+phage_suis gi|119953746|ref|YP_950551.1| 100.00 518 0 0 336 1889 25 542 0.0 988
+phage_suis gi|289551554|ref|YP_003472458.1| 32.95 516 280 6 342 1889 657 1106 6e-66 256
+phage_suis gi|223044325|ref|ZP_03614360.1| 30.22 546 327 7 393 1889 655 1193 1e-64 252
+phage_suis gi|223044325|ref|ZP_03614360.1| 19.88 508 328 9 384 1796 844 1309 6e-28 130
+phage_suis gi|268611153|ref|ZP_06144880.1| 28.64 639 371 11 78 1847 440 1042 1e-60 239
+phage_suis gi|268611153|ref|ZP_06144880.1| 23.36 441 286 7 543 1856 547 938 4e-31 141
+phage_suis gi|268611153|ref|ZP_06144880.1| 25.27 459 266 11 522 1844 722 1121 8e-31 140
+phage_suis gi|268611153|ref|ZP_06144880.1| 24.63 406 267 8 501 1694 770 1144 3e-23 115
+phage_suis gi|268611153|ref|ZP_06144880.1| 27.80 241 145 3 492 1148 811 1044 6e-16 90.9
+phage_suis gi|268611153|ref|ZP_06144880.1| 19.76 253 168 6 1158 1883 547 775 3e-04 52.0
+phage_suis gi|268610688|ref|ZP_06144415.1| 28.95 639 369 11 78 1847 440 1042 3e-59 234
+phage_suis gi|268610688|ref|ZP_06144415.1| 24.64 491 316 9 501 1856 770 1245 4e-39 167
+phage_suis gi|268610688|ref|ZP_06144415.1| 23.79 517 319 9 492 1832 811 1322 3e-37 161
+phage_suis gi|268610688|ref|ZP_06144415.1| 21.91 493 322 11 510 1859 905 1377 1e-25 123
+phage_suis gi|268610688|ref|ZP_06144415.1| 20.55 292 197 5 486 1343 1138 1400 4e-10 71.6
+phage_suis gi|268610688|ref|ZP_06144415.1| 21.41 341 225 10 894 1883 467 775 8e-05 53.9
+phage_suis gi|153811333|ref|ZP_01964001.1| 28.34 621 364 16 108 1847 493 1073 8e-55 219
+phage_suis gi|153811333|ref|ZP_01964001.1| 29.67 428 250 9 519 1760 709 1099 2e-47 195
+phage_suis gi|153811333|ref|ZP_01964001.1| 29.41 391 226 7 498 1640 746 1096 1e-39 169
+phage_suis gi|153811333|ref|ZP_01964001.1| 26.49 268 174 3 492 1256 854 1111 3e-24 118
+phage_suis gi|153811333|ref|ZP_01964001.1| 27.12 306 198 4 510 1385 816 1110 1e-23 116
+phage_suis gi|262113750|emb|CAR95417.1| 38.46 286 169 1 384 1241 540 818 2e-54 218
+phage_suis gi|262113750|emb|CAR95417.1| 29.68 411 271 7 657 1871 460 858 3e-40 171
+phage_suis gi|77411259|ref|ZP_00787609.1| 37.19 285 172 1 387 1241 628 905 2e-53 215
+phage_suis gi|77411259|ref|ZP_00787609.1| 28.01 407 281 6 660 1871 548 945 1e-40 172
+phage_suis gi|77411259|ref|ZP_00787609.1| 22.82 355 207 7 978 1877 540 882 9e-14 83.6
+phage_suis gi|76786754|ref|YP_329383.1| 36.84 285 173 1 387 1241 628 905 8e-53 213
+phage_suis gi|76786754|ref|YP_329383.1| 27.27 407 284 6 660 1871 548 945 3e-38 164
+phage_suis gi|76786754|ref|YP_329383.1| 24.73 283 194 2 543 1391 637 900 3e-23 115
+phage_suis gi|76786754|ref|YP_329383.1| 22.91 323 204 6 978 1847 540 850 2e-13 82.4
+phage_suis gi|50914476|ref|YP_060448.1| 35.86 290 179 1 372 1241 623 905 4e-51 207
+phage_suis gi|50914476|ref|YP_060448.1| 27.01 411 280 7 660 1871 548 945 2e-35 155
+phage_suis gi|50914476|ref|YP_060448.1| 23.00 387 269 5 543 1673 637 1004 3e-25 121
b
diff -r 000000000000 -r 7db7ecc78ad6 tool-data/blast_reporting_fields.loc.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool-data/blast_reporting_fields.loc.sample Mon Mar 02 20:46:00 2015 -0500
b
@@ -0,0 +1,34 @@
+#value type subtype sort filter default min max choose short_name name
+# Remember to edit tool_data_table_conf.xml for column spec!
+length numeric int 1 1 1 Length Alignment length
+qstart numeric int 1 1 1 Q. Start Alignment start in query
+qend numeric int 1 1 1 Q. End Alignment end in query
+sstart numeric int 1 1 1 S. Start Alignment start in subject
+send numeric int 1 1 1 S. End Alignment end in subject
+qseq text atgc 0 1 1 Q. Alignment Aligned part of query sequence
+sseq text atgc 0 1 1 S. Alignment Aligned part of subject sequence
+mseq text atgc 0 1 1 Alignment Alignment, matched part
+#
+bitscore numeric int 1 1 1 Bit Score Bit score
+evalue numeric float 1 1 1 E-value Expectation value
+pcov numeric int 1 1 1 % Coverage % coverage
+gapopen numeric int 1 1 1 Gaps-openings # of gap openings
+gaps numeric int 1 1 1 Gaps Total number of gaps
+mismatch numeric int 1 1 1 Mismatches # of mismatches
+nident numeric int 1 1 1 Ident. Matches # of identical matches
+positive numeric int 1 1 1 Pos. Matches # of positive-scoring matches
+pident numeric float 1 1 97 90 100 1 % Identical % of identical matches
+ppos numeric float 1 1 1 % Positive % of positive-scoring matches
+score numeric int 1 1 1 Raw Score Raw Score
+#
+qseqid text int 1 1 1 Query Id Query sequence id
+qframe numeric int 1 1 1 Query Frame Query frame
+qlen numeric int 1 1 1 Query Length Query sequence length
+#
+accessionid text 1 1 1 Accession Subject accession id
+sframe numeric int 1 1 1 Subject Frame Subject frame
+sallseqdescr text 0 1 1 Subject Descriptions Subject sequence desc(s) (all)
+sseqdescr text 1 1 1 Subject Description Subject sequence desc. (first)
+sseqid text int 1 1 1 Subject Id Subject sequence id
+sallseqid text 1 1 1 Subject Ids Subject sequence ids (all)
+slen numeric int 1 1 1 Subject Length Subject sequence length
b
diff -r 000000000000 -r 7db7ecc78ad6 tool-data/blast_reporting_templates.loc.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool-data/blast_reporting_templates.loc.sample Mon Mar 02 20:46:00 2015 -0500
b
@@ -0,0 +1,7 @@
+#value  name    description
+# Add list of html templates here
+templates.html_report Standard HTML Report A report that can have sections and table sections
+templates.html_selectable_report Selectable HTML Report Like the Standard HTML Report, but also enables selecting items for inclusion in the FASTA Selections Tool.
+#
+# Add list of customized templates here.  The folder they are in needs to be mentioned in a .pth file (usually located in your python's site-packages folder).
+#templates_custom.html_report Customized report Customized report ...
b
diff -r 000000000000 -r 7db7ecc78ad6 tool-data/fasta_reference_dbs.loc.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool-data/fasta_reference_dbs.loc.sample Mon Mar 02 20:46:00 2015 -0500
b
@@ -0,0 +1,8 @@
+#value key type active name path
+# Add list of reference database file names here, (remove .csv suffix) and applicable columns 
+# Reference databases need to be together in the ... /usr/local/galaxy/shared/bccdc_tools/tool-data/blast_report/bins/ folder
+#16S_euzby 16S 1 Euzby /usr/local/galaxy/shared/ngs_data/
+#16S_ncbi 16S 1 16S Microbial (NCBI) /usr/local/galaxy/shared/ngs_data/
+#16S_rdp 16S 1 16S RDP /usr/local/galaxy/shared/ngs_data/
+#CPN60 CPN60 1 CPN60 Chaperonin /usr/local/galaxy/shared/ngs_data/
+#hisA_burkholderia hisA 1 hisA Burkholderia /usr/local/galaxy/shared/ngs_data/
b
diff -r 000000000000 -r 7db7ecc78ad6 tool_conf.xml.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_conf.xml.sample Mon Mar 02 20:46:00 2015 -0500
b
@@ -0,0 +1,6 @@
+<toolbox>
+    <section name="BCCDC Tools" id="bccdc_tools">
+        <label text="BLAST" id="bccdc_BLAST" />
+        <tool file="blast_reporting/blast_reporting.xml" />
+    </section>
+</toolbox>
b
diff -r 000000000000 -r 7db7ecc78ad6 tool_data_table_conf.xml.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_data_table_conf.xml.sample Mon Mar 02 20:46:00 2015 -0500
b
@@ -0,0 +1,16 @@
+<tables>
+    <!-- List of BLAST+ FIELDS and DATA used in /bccdc_tools/blast_reporting/ tool -->
+    <!-- columns>value, name, type, filter, sort, selected, default, min, max </columns -->
+    <table name="blast_reporting_fields" comment_char="#">
+        <columns>value, type, subtype, sort, filter, default, min, max, choose, short_name, name</columns>
+        <file path="blast_reporting_fields.loc" />
+    </table>
+    <table name="fasta_reference_dbs" comment_char="#">
+        <columns>value, key, type, active, name, path</columns>
+        <file path="fasta_reference_dbs.loc" />
+    </table>
+    <table name="blast_reporting_templates" comment_char="#">
+        <columns>value, name, description</columns>
+        <file path="blast_reporting_templates.loc" />
+    </table>
+</tables>