changeset 24:09740be2bc9c

Mothur - updates for Mothur version 1.24
author Jim Johnson <jj@umn.edu>
date Wed, 28 Mar 2012 15:45:03 -0500
parents efd36aa39261
children bfbaf823be4c
files mothur/README mothur/tool-data/mothur_aligndb.loc.sample mothur/tool-data/mothur_lookup.loc.sample mothur/tool-data/mothur_map.loc.sample mothur/tool-data/mothur_taxonomy.loc.sample mothur/tools/mothur/classify.tree.xml mothur/tools/mothur/fastq.info.xml mothur/tools/mothur/get.groups.xml mothur/tools/mothur/merge.groups.xml mothur/tools/mothur/mothur_wrapper.py mothur/tools/mothur/otu.association.xml mothur/tools/mothur/remove.groups.xml mothur/tools/mothur/sffinfo.xml mothur/tools/mothur/sort.seqs.xml mothur/tools/mothur/trim.flows.xml mothur/tools/mothur/trim.seqs.xml
diffstat 16 files changed, 401 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/mothur/README	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/README	Wed Mar 28 15:45:03 2012 -0500
@@ -2,8 +2,8 @@
 
 (The environment variable MOTHUR_MAX_PROCESSORS can be used to limit the number of cpu processors used be mothur commands)
 
-Install mothur v.1.22.0 on your galaxy system so galaxy can execute the mothur command
-  ( This version of wrappers is designed for Mothur version 1.22 - it may work on later versions )
+Install mothur v.1.24.1 on your galaxy system so galaxy can execute the mothur command
+  ( This version of wrappers is designed for Mothur version 1.24 - it may work on later versions )
   http://www.mothur.org/wiki/Download_mothur
   http://www.mothur.org/wiki/Installation
   ( This Galaxy Mothur wrapper will invoke Mothur in command line mode: http://www.mothur.org/wiki/Command_line_mode )
@@ -15,6 +15,14 @@
   Install in galaxy:  tool-data/shared/jars/TreeVector.jar
 
 Install reference data from silva and greengenes
+ RDP reference file (modified for mothur):
+  http://www.mothur.org/wiki/RDP_reference_files
+   - 16S rRNA reference (RDP): A collection of 9,662 bacterial and 384 archaeal 16S rRNA gene sequences with an improved taxonomy compared to version 6.
+     http://www.mothur.org/w/images/2/29/Trainset7_112011.rdp.zip
+   - 16S rRNA reference (PDS): The RDP reference with three sequences reversed and 119 mitochondrial 16S rRNA gene sequences added as members of the Rickettsiales
+     http://www.mothur.org/w/images/4/4a/Trainset7_112011.pds.zip
+   - 28S rRNA reference (RDP): A collection of 8506 reference 28S rRNA gene sequences from the Fungi that were curated by the Kuske lab
+     http://www.mothur.org/w/images/3/36/FungiLSU_train_v7.zip
  Silva reference:
   http://www.mothur.org/wiki/Silva_reference_files
   - Bacterial references (14,956 sequences)
@@ -79,11 +87,19 @@
     /project/db/galaxy/mothur/Silva.eukarya.zip
     /project/db/galaxy/mothur/Gg_ss_map.zip
     /project/db/galaxy/mothur/core_set_aligned.imputed.fasta
+    /project/db/galaxy/mothur/RDP/FungiLSU_train_1400bp_8506_mod.fasta
+    /project/db/galaxy/mothur/RDP/FungiLSU_train_1400bp_8506_mod.tax
+    /project/db/galaxy/mothur/RDP/trainset6_032010.rdp.fasta
+    /project/db/galaxy/mothur/RDP/trainset6_032010.rdp.tax
+    /project/db/galaxy/mothur/RDP/trainset7_112011.pds.fasta
+    /project/db/galaxy/mothur/RDP/trainset7_112011.pds.tax
+    /project/db/galaxy/mothur/RDP/trainset7_112011.rdp.fasta
+    /project/db/galaxy/mothur/RDP/trainset7_112011.rdp.tax
 
 
-Add tool-data:  (contains  pointers to silva and greengenes reference data)
+
+Add tool-data:  (contains  pointers to silva, greengenes, and RDP reference data)
   tool-data/mothur_aligndb.loc
-  tool-data/mothur_calulators.loc
   tool-data/mothur_map.loc
   tool-data/mothur_taxonomy.loc
   tool-data/shared/jars/TreeVector.jar
--- a/mothur/tool-data/mothur_aligndb.loc.sample	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tool-data/mothur_aligndb.loc.sample	Wed Mar 28 15:45:03 2012 -0500
@@ -6,11 +6,14 @@
 #
 #<dbname>	<file_base>
 #
-greengenes	/project/db/galaxy/mothur/core_set_aligned.imputed.fasta
-silva archaea	/project/db/galaxy/mothur/Silva.archaea/silva.archaea.fasta
-silva bacteria	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.fasta
-silva eukarya	/project/db/galaxy/mothur/silva.eukarya.fasta
-silva archaea nogap	/project/db/galaxy/mothur/Silva.archaea/nogap.archaea.fasta
-silva bacteria nogap	/project/db/galaxy/mothur/silva.bacteria/nogap.bacteria.fasta
-silva eukarya nogap	/project/db/galaxy/mothur/nogap.eukarya.fasta
-
+#greengenes	/project/db/galaxy/mothur/core_set_aligned.imputed.fasta
+#silva archaea	/project/db/galaxy/mothur/Silva.archaea/silva.archaea.fasta
+#silva bacteria	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.fasta
+#silva eukarya	/project/db/galaxy/mothur/silva.eukarya.fasta
+#silva archaea nogap	/project/db/galaxy/mothur/Silva.archaea/nogap.archaea.fasta
+#silva bacteria nogap	/project/db/galaxy/mothur/silva.bacteria/nogap.bacteria.fasta
+#silva eukarya nogap	/project/db/galaxy/mothur/nogap.eukarya.fasta
+#FungiLSU_train_1400bp_8506_mod.fasta	/project/db/galaxy/mothur/RDP/FungiLSU_train_1400bp_8506_mod.fasta
+#trainset6_032010.rdp.fasta	/project/db/galaxy/mothur/RDP/trainset6_032010.rdp.fasta
+#trainset7_112011.pds.fasta	/project/db/galaxy/mothur/RDP/trainset7_112011.pds.fasta
+#trainset7_112011.rdp.fasta	/project/db/galaxy/mothur/RDP/trainset7_112011.rdp.fasta
--- a/mothur/tool-data/mothur_lookup.loc.sample	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tool-data/mothur_lookup.loc.sample	Wed Mar 28 15:45:03 2012 -0500
@@ -6,8 +6,6 @@
 #
 #<name>	<file_base>
 #
-GS20	/project/db/galaxy/mothur/lookup/LookUp_GS20.pat
-GSFLX	/project/db/galaxy/mothur/lookup/LookUp_GSFLX.pat
-Titanium	/project/db/galaxy/mothur/lookup/LookUp_Titanium.pat
-
-
+#GS20	/project/db/galaxy/mothur/lookup/LookUp_GS20.pat
+#GSFLX	/project/db/galaxy/mothur/lookup/LookUp_GSFLX.pat
+#Titanium	/project/db/galaxy/mothur/lookup/LookUp_Titanium.pat
--- a/mothur/tool-data/mothur_map.loc.sample	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tool-data/mothur_map.loc.sample	Wed Mar 28 15:45:03 2012 -0500
@@ -6,5 +6,5 @@
 #
 #<name>	<file_base>
 #
-greengenes	/project/db/galaxy/mothur/gg.ss.map
-silva	/project/db/galaxy/mothur/silva.ss.map
+#greengenes	/project/db/galaxy/mothur/gg.ss.map
+#silva	/project/db/galaxy/mothur/silva.ss.map
--- a/mothur/tool-data/mothur_taxonomy.loc.sample	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tool-data/mothur_taxonomy.loc.sample	Wed Mar 28 15:45:03 2012 -0500
@@ -6,15 +6,19 @@
 #
 #<taxonomyname>	<file_base>
 #
-archaea.gg	/project/db/galaxy/mothur/Silva.archaea/silva.archaea.gg.tax
-archaea.silva	/project/db/galaxy/mothur/Silva.archaea/silva.archaea.silva.tax
-archaea.rdp	/project/db/galaxy/mothur/Silva.archaea/silva.archaea.rdp.tax
-archaea.ncbi	/project/db/galaxy/mothur/Silva.archaea/silva.archaea.ncbi.tax
-bacteria.gg	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.gg.tax
-bacteria.silva	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.silva.tax
-bacteria.ncbi	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.ncbi.tax
-bacteria.rdp	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.rdp.tax
-bacteria.rdp6	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.rdp6.tax
-eukarya.silva	/project/db/galaxy/mothur/silva.eukarya.silva.tax
-eukarya.ncbi	/project/db/galaxy/mothur/silva.eukarya.ncbi.tax
-
+#archaea.gg	/project/db/galaxy/mothur/Silva.archaea/silva.archaea.gg.tax
+#archaea.silva	/project/db/galaxy/mothur/Silva.archaea/silva.archaea.silva.tax
+#archaea.rdp	/project/db/galaxy/mothur/Silva.archaea/silva.archaea.rdp.tax
+#archaea.ncbi	/project/db/galaxy/mothur/Silva.archaea/silva.archaea.ncbi.tax
+#bacteria.gg	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.gg.tax
+#bacteria.silva	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.silva.tax
+#bacteria.ncbi	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.ncbi.tax
+#bacteria.rdp	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.rdp.tax
+#bacteria.rdp6	/project/db/galaxy/mothur/silva.bacteria/silva.bacteria.rdp6.tax
+#eukarya.silva	/project/db/galaxy/mothur/silva.eukarya.silva.tax
+#eukarya.ncbi	/project/db/galaxy/mothur/silva.eukarya.ncbi.tax
+#trainset6_032010.rdp.tax	/project/db/galaxy/mothur/RDP/trainset6_032010.rdp.tax
+#trainset7_112011.pds.tax	/project/db/galaxy/mothur/RDP/trainset7_112011.pds.tax
+#trainset7_112011.rdp.tax	/project/db/galaxy/mothur/RDP/trainset7_112011.rdp.tax
+#FungiLSU_train_1400bp_8506_mod.tax	/project/db/galaxy/mothur/RDP/FungiLSU_train_1400bp_8506_mod.tax
+#
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mothur/tools/mothur/classify.tree.xml	Wed Mar 28 15:45:03 2012 -0500
@@ -0,0 +1,70 @@
+<tool id="mothur_classify_tree" name="Classify.tree" version="1.24.0">
+ <description>Get a consensus taxonomy for each node on a tree</description>
+ <command interpreter="python">
+  mothur_wrapper.py 
+  --cmd='classify.tree'
+  --result='^mothur.\S+\.logfile$:'$logfile,'^\S+\.taxonomy\.tre$:'$out_tree,'^\S+\.taxonomy\.summary$:'$summary
+  --outputdir='$logfile.extra_files_path'
+  --taxonomy=$taxonomy
+  --tree=$tree
+  #if $name.__str__ != "None" and len($name.__str__) > 0:
+   --name='$name'
+  #end if
+  #if $group.__str__ != "None" and len($group.__str__) > 0:
+   --group=$group
+  #end if
+
+  --name=$names
+ </command>
+ <inputs>
+  <param name="taxonomy" type="data" format="taxonomy" optional="true" label="taxonomy - Taxonomy to screen"/>
+  <param name="tree" type="data" format="tre" label="tree - Sequences to filter"/>
+  <param name="name" type="data" format="names" optional="true" label="name - Sequences Name reference file"/>
+  <param name="group" type="data" format="group" optional="true" label="group - Sequences Group reference"/>
+  <param name="cutoff" type="integer" value="51" optional="true" label="cutoff - consensus confidence threshold" 
+         help="The default is 51, meaning 51%. Cutoff cannot be below 51">
+    <validator type="in_range" message="The percentage cutoff must be between 51 and 100" min="51" max="100"/>
+  </param>
+
+ </inputs>
+ <outputs>
+  <data format="html" name="logfile" label="${tool.name} on ${on_string}: logfile" />
+  <data format_source="tree" name="out_tree" label="${tool.name} on ${on_string}: taxonomy.tre" />
+  <data format_source="tabular" name="summary" label="${tool.name} on ${on_string}: taxonomy.summary" />
+ </outputs>
+ <requirements>
+  <requirement type="binary">mothur</requirement>
+ </requirements>
+ <tests>
+ </tests>
+ <help>
+**Mothur Overview**
+
+Mothur_, initiated by Dr. Patrick Schloss and his software development team
+in the Department of Microbiology and Immunology at The University of Michigan,
+provides bioinformatics for the microbial ecology community.
+
+.. _Mothur: http://www.mothur.org/wiki/Main_Page
+
+**Command Documenation**
+
+The classify.tree_ command is used to get a consensus taxonomy for each node on a tree.
+Input is a taxonomy_ and a tree_ with optional name_ or group_ reference.
+The output is a tree_ and a summary..
+
+  TreeNode	NumRep	Taxonomy
+  243	2	Bacteria(100);"Firmicutes"(100);"Clostridia"(100);Clostridiales(100);"Ruminococcaceae"(100);Faecalibacterium(100);
+  244	3	Bacteria(100);"Firmicutes"(100);"Clostridia"(100);Clostridiales(100);"Ruminococcaceae"(100);Faecalibacterium(100);
+  245	4	Bacteria(100);"Firmicutes"(100);"Clostridia"(100);Clostridiales(100);"Ruminococcaceae"(100);Faecalibacterium(100);
+  ...
+
+
+.. _taxonomy: http://www.mothur.org/wiki/Taxonomy_outline
+.. _tree: http://evolution.genetics.washington.edu/phylip/newicktree.html
+.. _name: http://www.mothur.org/wiki/Name_file
+.. _group: http://www.mothur.org/wiki/Group_file
+.. _classify.tree: http://www.mothur.org/wiki/Classify.tree
+
+
+ </help>
+</tool>
--- a/mothur/tools/mothur/fastq.info.xml	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tools/mothur/fastq.info.xml	Wed Mar 28 15:45:03 2012 -0500
@@ -1,4 +1,4 @@
-<tool id="mothur_fastq_info" name="Fastq.info" version="1.19.0">
+<tool id="mothur_fastq_info" name="Fastq.info" version="1.24.0">
  <description>Convert fastq to fasta and quality</description>
  <command interpreter="python">
   mothur_wrapper.py 
@@ -9,11 +9,17 @@
  </command>
  <inputs>
   <param name="fastq" type="data" format="fastq" label="fastq - Fastq Sequence file"/>
+  <param name="fasta" type="boolean" truevalue="" falsevalue="--fasta=false" checked="true" label="fasta - Add fasta to your history" />
+  <param name="qfile" type="boolean" truevalue="" falsevalue="--qfile=false" checked="true" label="qfile - Add qfile to your history" />
  </inputs>
  <outputs>
   <data format="html" name="logfile" label="${tool.name} on ${on_string}: logfile" />
-  <data format="fasta" name="out_fasta" label="${tool.name} on ${on_string}: fasta"/>
-  <data format="qual454" name="out_qfile" label="${tool.name} on ${on_string}: qual"/>
+  <data format="fasta" name="out_fasta" label="${tool.name} on ${on_string}: fasta">
+   <filter>fasta == True</filter>
+  </data>
+  <data format="qual454" name="out_qfile" label="${tool.name} on ${on_string}: qual">
+   <filter>qfile == True</filter>
+  </data>
  </outputs>
  <requirements>
   <requirement type="binary">mothur</requirement>
--- a/mothur/tools/mothur/get.groups.xml	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tools/mothur/get.groups.xml	Wed Mar 28 15:45:03 2012 -0500
@@ -1,4 +1,4 @@
-<tool id="mothur_get_groups" name="Get.groups" version="1.21.0">
+<tool id="mothur_get_groups" name="Get.groups" version="1.24.0">
  <description>Select groups</description>
  <command interpreter="python">
   mothur_wrapper.py 
@@ -38,6 +38,10 @@
    --taxonomy=$taxonomy_in
    #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1\\.pick\\.\2',$os.path.basename($taxonomy_in.__str__)) + ":'" + $taxonomy_out.__str__]
   #end if
+  #if $design_in.__str__ != "None" and len($design_in.__str__) > 0:
+   --design=$design_in
+   #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1.*\\.pick\\.\2',$os.path.basename($design_in.__str__)) + ":'" + $design_out.__str__]
+  #end if
   --result=#echo ','.join($results)
  </command>
  <inputs>
@@ -65,6 +69,8 @@
   <param name="list_in" type="data" format="list" optional="true" label="list - OTU List"/>
   <param name="shared_in" type="data" format="shared" optional="true" label="shared - OTU Shared"/>
   <param name="taxonomy_in" type="data" format="seq.taxonomy" optional="true" label="taxonomy - Taxonomy"/>
+  <param name="design_in" type="data" format="tabular" optional="true" label="design - assign groups to new grouping"
+         help="design has 2 columns: group(col 1) and grouping(col 2) (separated by a TAB character) use make.design"/>
  </inputs>
  <outputs>
   <data format="html" name="logfile" label="${tool.name} on ${on_string}: logfile" />
@@ -85,6 +91,9 @@
   <data format="seq.taxonomy" name="taxonomy_out" label="${tool.name} on ${on_string}: pick.taxonomy">
    <filter>taxonomy_in != None</filter>
   </data>
+  <data format="design" name="design_out" label="${tool.name} on ${on_string}: pick.design">
+   <filter>design_in != None</filter>
+  </data>
  </outputs>
  <requirements>
   <requirement type="binary">mothur</requirement>
--- a/mothur/tools/mothur/merge.groups.xml	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tools/mothur/merge.groups.xml	Wed Mar 28 15:45:03 2012 -0500
@@ -1,12 +1,19 @@
-<tool id="mothur_merge_groups" name="Merge.groups" version="1.20.0" >
+<tool id="mothur_merge_groups" name="Merge.groups" version="1.24.0" >
  <description>Merge groups in a shared file</description>
  <command interpreter="python">
   mothur_wrapper.py 
   --cmd='merge.groups'
   ## 98_sq_phylip_amazon.fn.merge.shared
-  --result='^mothur.\S+\.logfile$:'$logfile,'^\S+\.merge\.\S+$:'$shared
+  #set results = ["'^mothur.\S+\.logfile$:'" + $logfile.__str__]
   --outputdir='$logfile.extra_files_path'
-  --shared=$otu
+  #if $otu.__str__ != "None" and len($otu.__str__) > 0:
+   --shared=$otu
+   #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1.merge.\2',$os.path.basename($otu.__str__)) + ":'" + $merge_shared.__str__]
+  #end if
+  #if $group.__str__ != "None" and len($group.__str__) > 0:
+   --group=$group
+   #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1.merge.\2',$os.path.basename($group.__str__)) + ":'" + $merge_group.__str__]
+  #end if
   #if $design.source == 'hist':
    --design=$design_dataset
   #else:
@@ -18,9 +25,11 @@
   #if $label.__str__ != "None" and len($label.__str__) > 0:
    --label='$label'
   #end if
+  --result=#echo ','.join($results)
  </command>
  <inputs>
-  <param name="otu" type="data" format="shared" label="shared - OTU Shared Dataset"/>
+  <param name="otu" type="data" format="shared" optional="true" label="shared - OTU Shared Dataset"/>
+  <param name="group" type="data" format="groups" optional="true" label="group - Group Dataset"/>
   <param name="groups" type="select" optional="true" label="groups - Pick groups to include" multiple="true">
    <options from_dataset="otu">
     <column name="name" index="1"/>
@@ -77,7 +86,12 @@
  </configfiles>
  <outputs>
   <data format="html" name="logfile" label="${tool.name} on ${on_string}: logfile" />
-  <data format="shared" name="shared" label="${tool.name} on ${on_string}: merge.shared" />
+  <data format="shared" name="merged_shared" label="${tool.name} on ${on_string}: merge.shared" >
+    <filter>otu != None</filter>
+  </data>
+  <data format="groups" name="merged_group" label="${tool.name} on ${on_string}: merge.groups" >
+    <filter>groups != None</filter>
+  </data>
  </outputs>
  <requirements>
   <requirement type="binary">mothur</requirement>
--- a/mothur/tools/mothur/mothur_wrapper.py	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tools/mothur/mothur_wrapper.py	Wed Mar 28 15:45:03 2012 -0500
@@ -4,7 +4,7 @@
 http://www.mothur.org/
 
 Supports mothur version 
-mothur v.1.23.0
+mothur v.1.24.0
 
 Class encapsulating Mothur galaxy tool.
 Expect each invocation to include:
@@ -192,6 +192,7 @@
     cmd_dict['chop.seqs'] = dict({'required' : ['fasta','numbases'],  'optional' : ['countgaps','keep','short']})
     cmd_dict['classify.otu'] = dict({'required' : ['list','taxonomy'],'optional' : ['name','cutoff','label','group','probs','basis','reftaxonomy']})
     cmd_dict['classify.seqs'] = dict({'required' : ['fasta','reference','taxonomy'],'optional' : ['name','search','ksize','method','match','mismatch','gapopen','gapextend','numwanted','probs','save','processors']})
+    cmd_dict['classify.tree'] = dict({'required' : ['taxonomy','tree'],'optional' : ['name','group','cutoff']})
     #clear.memory ## not needed in galaxy framework
     cmd_dict['clearcut'] = dict({'required' : [['phylip','fasta']],'optional' : ['seed','norandom','shuffle','neighbor','expblen','expdist','ntrees','matrixout','kimura','jukes','protein','DNA']})
     cmd_dict['cluster'] = dict({'required' : [['phylip','column']] ,  'optional' : ['name','method','cutoff','hard','precision','sim','showabund','timing']})
@@ -209,10 +210,10 @@
     cmd_dict['deunique.tree'] = dict({'required' : ['tree','name'],  'optional' : []})
     cmd_dict['dist.seqs'] = dict({'required' : ['fasta'],  'optional' : ['calc','countends','output','cutoff','oldfasta','column','processors']})
     cmd_dict['dist.shared'] = dict({'required' : ['shared'], 'optional' : ['calc','label','groups','output','processors']})
-    cmd_dict['fastq.info'] = dict({'required' : ['fastq'], 'optional' : []})
+    cmd_dict['fastq.info'] = dict({'required' : ['fastq'], 'optional' : ['fasta','qfile']})
     cmd_dict['filter.seqs'] = dict({'required' : ['fasta'],  'optional' : ['vertical','trump','soft','hard','processors']})
     cmd_dict['get.group'] = dict({'required' : ['shared'], 'optional' : []})
-    cmd_dict['get.groups'] = dict({'required' : ['group'], 'optional' : ['groups','accnos','fasta','name','list','shared','taxonomy']})
+    cmd_dict['get.groups'] = dict({'required' : ['group'], 'optional' : ['groups','accnos','fasta','name','list','shared','taxonomy','design']})
     cmd_dict['get.lineage'] = dict({'required' : ['taxonomy','taxon'],'optional' : ['fasta','name','group','list','alignreport','dups']})
     cmd_dict['get.otulist'] = dict({'required' : ['list'], 'optional' : ['label','sort']})
     cmd_dict['get.oturep'] = dict({'required' : ['list',['phylip','column']], 'optional' : ['fasta','name','label','group','groups','sorted','precision','cutoff','large','weighted']})
@@ -234,10 +235,11 @@
     cmd_dict['make.shared'] = dict({'required' : ['list','group'],  'optional' : ['label','groups']})
     cmd_dict['mantel'] = dict({'required' : ['phylip','phylip2'] ,  'optional' : ['method','iters']})
     cmd_dict['merge.files'] = dict({'required' : ['input','output']})
-    cmd_dict['merge.groups'] = dict({'required' : ['shared','design'],  'optional' : ['groups', 'label']})
+    cmd_dict['merge.groups'] = dict({'required' : [['shared','group'],'design'],  'optional' : ['groups', 'label']})
     cmd_dict['metastats'] = dict({'required' : ['shared','design'],  'optional' : ['groups', 'label','iters','threshold','sets','processors']})
     cmd_dict['nmds'] = dict({'required' : ['phylip'], 'optional' : ['axes','mindim','maxdim','iters','maxiters','epsilon']})
     cmd_dict['normalize.shared'] = dict({'required' : [['shared','relabund']], 'optional' : ['label','method','norm','groups','makerelabund']})
+    cmd_dict['otu.association'] = dict({'required' : [['shared','relabund']], 'optional' : ['groups', 'label','method']})
     cmd_dict['otu.hierarchy'] = dict({'required' : ['list','label'], 'optional' : ['output']})
     cmd_dict['pairwise.seqs'] = dict({'required' : ['fasta'],  'optional' : ['align','calc','countends','output','cutoff','match','mismatch','gapopen','gapextend','processors']})
     cmd_dict['parse.list'] = dict({'required' : ['list','group'], 'optional' : ['label']})
@@ -249,24 +251,21 @@
     cmd_dict['pre.cluster'] = dict({'required' : ['fasta'],  'optional' : ['name','diffs','group','processors']})
     cmd_dict['rarefaction.shared'] = dict({'required' : ['shared'], 'optional' : ['calc','label','iters','groups','jumble']})
     cmd_dict['rarefaction.single'] = dict({'required' : [['list', 'sabund', 'rabund', 'shared']], 'optional' : ['calc','abund','iters','label','freq','processors']})
-    cmd_dict['remove.groups'] = dict({'required' : ['group'], 'optional' : ['groups','accnos','fasta','name','list','shared','taxonomy']})
+    cmd_dict['remove.groups'] = dict({'required' : ['group'], 'optional' : ['groups','accnos','fasta','name','list','shared','taxonomy','design']})
     cmd_dict['remove.lineage'] = dict({'required' : ['taxonomy','taxon'],'optional' : ['fasta','name','group','list','alignreport','dups']})
     cmd_dict['remove.otus'] = dict({'required' : ['group','list','label'], 'optional' : ['groups','accnos']})
     cmd_dict['remove.rare'] = dict({'required' : [['list','sabund','rabund','shared'],'nseqs'], 'optional' : ['group','groups','label','bygroup']})
     cmd_dict['remove.seqs'] = dict({'required' : ['accnos',['fasta','qfile','name','group','list','alignreport','taxonomy']], 'optional' : ['dups']})
     cmd_dict['reverse.seqs'] = dict({'required' : ['fasta']})
-    cmd_dict['screen.seqs'] = dict({'required' : ['fasta'],  'optional' : ['start','end','maxambig','maxhomop','minlength','maxlength','criteria','optimize','name','group','alignreport'''taxonomy','processors']})
+    cmd_dict['screen.seqs'] = dict({'required' : ['fasta'],  'optional' : ['start','end','maxambig','maxhomop','minlength','maxlength','criteria','optimize','name','group','alignreport','taxonomy','processors']})
     cmd_dict['sens.spec'] = dict({'required' : ['list',['column','phylip']] , 'optional' : ['label','cutoff','hard','precision']})
-
     cmd_dict['seq.error'] = dict({'required' : ['fasta','reference'] , 'optional' : ['name','qfile','report','ignorechimeras','threshold','processors']})
-
     cmd_dict['sffinfo'] = dict({'required' : [['sff','sfftxt']], 'optional' : ['fasta','qfile','trim','sfftxt','flow','accnos']})
-
     cmd_dict['shhh.flows'] = dict({'required' : [['flow','files']], 'optional' : ['lookup','maxiter','mindelta','cutoff','sigma','order','processors']})
     cmd_dict['shhh.seqs'] = dict({'required' : [['fasta','files']], 'optional' : ['group','sigma','processors']})
-
     cmd_dict['split.abund'] = dict({'required' : ['fasta',['name','list']], 'optional' : ['cutoff','group','groups','label','accnos']})
     cmd_dict['split.groups'] = dict({'required' : ['fasta','group'], 'optional' : ['name','groups']})
+    cmd_dict['sort.seqs'] = dict({'required' : [['fasta','qfile','name','group','flow','taxonomy']], 'optional' : ['accnos','large']})
     cmd_dict['sub.sample'] = dict({'required' : [['fasta','list','sabund','rabund','shared']], 'optional' : ['name','group','groups','label','size','persample']})
     cmd_dict['summary.qual'] = dict({'required' : ['qfile'], 'optional' : ['name']})
     cmd_dict['summary.seqs'] = dict({'required' : ['fasta'], 'optional' : ['name','processors']})
@@ -274,8 +273,8 @@
     cmd_dict['summary.single'] = dict({'required' : [['list','sabund','rabund','shared']], 'optional' : ['calc','abund','size','label','groupmode']})
     cmd_dict['summary.tax'] = dict({'required' : ['taxonomy'], 'optional' : ['name','group','reftaxonomy']})
     cmd_dict['tree.shared'] = dict({'required' : [['shared','phylip','column']], 'optional' : ['name','groups','calc','cutoff','precision','label']})
-    cmd_dict['trim.flows'] = dict({'required' : ['flow'],  'optional' : ['oligos','bdiffs','pdiffs','tdiffs','minflows','maxflows','fasta','signal','noise','maxhomop','order','processors']})
-    cmd_dict['trim.seqs'] = dict({'required' : ['fasta'],  'optional' : ['name','group','oligos','qfile','qaverage','qthreshold','qwindowaverage','qwindowsize','rollaverage','qstepsize','qtrim','flip','maxambig','maxhomop','minlength','maxlength','bdiffs','pdiffs','tdiffs','allfiles','keepfirst','removelast','processors']})
+    cmd_dict['trim.flows'] = dict({'required' : ['flow'],  'optional' : ['oligos','bdiffs','pdiffs','tdiffs','ldiffs','sdiffs','minflows','maxflows','fasta','signal','noise','maxhomop','order','processors']})
+    cmd_dict['trim.seqs'] = dict({'required' : ['fasta'],  'optional' : ['name','group','oligos','qfile','qaverage','qthreshold','qwindowaverage','qwindowsize','rollaverage','qstepsize','qtrim','flip','maxambig','maxhomop','minlength','maxlength','bdiffs','pdiffs','tdiffs','ldiffs','sdiffs','keepforward','allfiles','keepfirst','removelast','processors']})
     cmd_dict['unifrac.unweighted'] = dict({'required' : ['tree'], 'optional' : ['name','group','groups','iters','distance','random','root','processors']})
     cmd_dict['unifrac.weighted'] = dict({'required' : ['tree'], 'optional' : ['name','group','groups','iters','distance','random','root','processors']})
     cmd_dict['unique.seqs'] = dict({'required' : ['fasta'],  'optional' : ['name']})
@@ -337,9 +336,12 @@
     parser.add_option( '--oligos', dest='oligos', help='The oligos option takes a file that can contain the sequences of the forward and reverse primers and barcodes and their sample identifier.' )
     parser.add_option( '--bdiffs', dest='bdiffs', type="int", help='Number of barcode differences to allow' )
     parser.add_option( '--pdiffs', dest='pdiffs', type="int", help='Number of primer differences to allow' )
+    parser.add_option( '--ldiffs', dest='ldiffs', type="int", help='Number of linker sequence differences to allow' )
+    parser.add_option( '--sdiffs', dest='sdiffs', type="int", help='Number of spacer sequence differences to allow' )
     parser.add_option( '--tdiffs', dest='tdiffs', type="int", help='Total number of barcode and primer differences to allow' )
     parser.add_option( '--diffs', dest='diffs', type="int", help='Number of mismatched bases to allow between sequences in a group' )
     parser.add_option( '--allfiles', dest='allfiles', help='T - generate fasta and group for each barcode' )
+    parser.add_option( '--keepforward', dest='keepforward', help='T - keep primer' )
     parser.add_option( '--name', dest='name', help='A file containing a 2 column table: name, and comma separated list of represetatives' )
     parser.add_option( '--accnos', dest='accnos', help='A file containing a list of names' )
     parser.add_option( '--groups', dest='groups', help='pairwise group labels' )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mothur/tools/mothur/otu.association.xml	Wed Mar 28 15:45:03 2012 -0500
@@ -0,0 +1,75 @@
+<tool id="mothur_otu_association" name="Otu.association" version="1.24.0" force_history_refresh="True">
+ <description>Calculate the correlation coefficient for the otus</description>
+ <command interpreter="python">
+  mothur_wrapper.py 
+  --cmd='otu.association'
+  --result='^mothur.\S+\.logfile$:'$logfile,'^\S+\.norm\.shared$:'$shared
+  --outputdir='$logfile.extra_files_path'
+  --datasetid='$logfile.id' --new_file_path='$__new_file_path__'
+  --new_datasets='^\S+?\.otu.corr$:$tabular'
+  #if isinstance($otu.datatype, $__app__.datatypes_registry.get_datatype_by_extension('shared').__class__):
+   --shared=$otu
+  #elif isinstance($otu.datatype, $__app__.datatypes_registry.get_datatype_by_extension('relabund').__class__):
+   --relabund=$otu
+  #end if
+  #if $label.__str__ != "None" and len($label.__str__) > 0:
+   --label='$label'
+  #end if
+  #if $groups.__str__ != "None" and len($groups.__str__) > 0:
+   --groups=$groups
+  #end if
+  #if $method.__str__ != "None" and len($method.__str__) > 0:
+   --method=$method
+  #end if
+ </command>
+ <inputs>
+  <param name="otu" type="data" format="shared,relabund" label="shared,relabund - OTU Shared or Relabund file"/>
+  <param name="label" type="select" label="label - OTU Labels" multiple="true">
+   <options from_dataset="otu">
+    <column name="name" index="0"/>
+    <column name="value" index="0"/>
+    <filter type="static_value" name="ignore_header" keep="False" column="0" value = "label"/>
+    <filter type="unique_value" name="unq_lbl" column="0" />
+   </options>
+  </param>
+  <param name="groups" type="select" label="groups - Groups to include" multiple="true">
+   <options from_dataset="otu">
+    <column name="name" index="1"/>
+    <column name="value" index="1"/>
+    <filter type="static_value" name="ignore_header" keep="False" column="1" value = "Group"/>
+    <filter type="unique_value" name="unq_grp" column="1" />
+   </options>
+  </param>
+  <param name="method" type="select" label="method - Normalization method">
+   <option value="pearson" selected="true">pearson</option>
+   <option value="spearman">spearman</option>
+   <option value="kendall">kendall</option>
+  </param>
+ </inputs>
+ <outputs>
+  <data format="html" name="logfile" label="${tool.name} on ${on_string}: logfile" />
+ </outputs>
+ <requirements>
+  <requirement type="binary">mothur</requirement>
+ </requirements>
+ <tests>
+ </tests>
+ <help>
+**Mothur Overview**
+
+Mothur_, initiated by Dr. Patrick Schloss and his software development team
+in the Department of Microbiology and Immunology at The University of Michigan,
+provides bioinformatics for the microbial ecology community.
+
+.. _Mothur: http://www.mothur.org/wiki/Main_Page
+
+**Command Documenation**
+
+The otu.association_ command calculates the correlation coefficient for the otus in a shared_ or relabund_ file.
+
+.. _shared: http://www.mothur.org/wiki/Shared_file
+.. _relabund: http://www.mothur.org/wiki/Get.relabund
+.. _otu.association: http://www.mothur.org/wiki/Otu.association
+
+ </help>
+</tool>
--- a/mothur/tools/mothur/remove.groups.xml	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tools/mothur/remove.groups.xml	Wed Mar 28 15:45:03 2012 -0500
@@ -1,4 +1,4 @@
-<tool id="mothur_remove_groups" name="Remove.groups" version="1.21.0">
+<tool id="mothur_remove_groups" name="Remove.groups" version="1.24.0">
  <description>Remove groups from groups,fasta,names,list,taxonomy</description>
  <command interpreter="python">
   mothur_wrapper.py 
@@ -38,6 +38,10 @@
    --taxonomy=$taxonomy_in
    #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1\\.pick\\.\2',$os.path.basename($taxonomy_in.__str__)) + ":'" + $taxonomy_out.__str__]
   #end if
+  #if $design_in.__str__ != "None" and len($design_in.__str__) > 0:
+   --design=$design_in
+   #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1.*\\.pick\\.\2',$os.path.basename($design_in.__str__)) + ":'" + $design_out.__str__]
+  #end if
   --result=#echo ','.join($results)
  </command>
  <inputs>
@@ -65,6 +69,8 @@
   <param name="list_in" type="data" format="list" optional="true" label="list - OTU List"/>
   <param name="shared_in" type="data" format="shared" optional="true" label="shared - OTU Shared"/>
   <param name="taxonomy_in" type="data" format="seq.taxonomy" optional="true" label="taxonomy - Taxonomy"/>
+  <param name="design_in" type="data" format="tabular" label="design - assign groups to new grouping"
+         help="design has 2 columns: group(col 1) and grouping(col 2) (separated by a TAB character) use make.design"/>
  </inputs>
  <outputs>
   <data format="html" name="logfile" label="${tool.name} on ${on_string}: logfile" />
@@ -85,6 +91,9 @@
   <data format="seq.taxonomy" name="taxonomy_out" label="${tool.name} on ${on_string}: pick.taxonomy">
    <filter>taxonomy_in != None</filter>
   </data>
+  <data format="design" name="design_out" label="${tool.name} on ${on_string}: pick.design">
+   <filter>design_in != None</filter>
+  </data>
  </outputs>
  <requirements>
   <requirement type="binary">mothur</requirement>
--- a/mothur/tools/mothur/sffinfo.xml	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tools/mothur/sffinfo.xml	Wed Mar 28 15:45:03 2012 -0500
@@ -1,4 +1,4 @@
-<tool id="mothur_sffinfo" name="Sffinfo" version="1.19.0">
+<tool id="mothur_sffinfo" name="Sffinfo" version="1.24.0">
  <description>Summarize the quality of sequences</description>
  <command interpreter="python">
   mothur_wrapper.py 
@@ -33,7 +33,7 @@
   <param name="fasta" type="boolean" truevalue="" falsevalue="--fasta=false" checked="true" label="fasta - Add fasta to your history" />
   <param name="qfile" type="boolean" truevalue="" falsevalue="--qfile=false" checked="true" label="qfile - Add qfile to your history" />
   <param name="sfftxt" type="boolean" truevalue="--sfftxt=true" falsevalue="" checked="false" label="sfftxt - Add sfftxt to your history" />
-  <param name="flow" type="boolean" truevalue="--flow=true" falsevalue="" checked="false" label="flow - Add flow to your history" />
+  <param name="flow" type="boolean" truevalue="--flow=true" falsevalue="--flow=false" checked="true" label="flow - Add flow to your history" />
   <param name="trim" type="boolean" truevalue="" falsevalue="--trim=false" checked="true" label="trim - Trim sequences and quality scores" />
   <param name="accnos" type="data" format="accnos" optional="true" label="accnos - Limit output to named Accessions"/>
  </inputs>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mothur/tools/mothur/sort.seqs.xml	Wed Mar 28 15:45:03 2012 -0500
@@ -0,0 +1,94 @@
+<tool id="mothur_sort_seqs" name="Sort.seqs" version="1.24.0">
+ <description>put sequences in different files in the same order</description>
+ <command interpreter="python">
+  mothur_wrapper.py 
+  #import re, os.path
+  #set results = ["'^mothur.\S+\.logfile$:'" + $logfile.__str__]
+  ## adds .sorted before the last extension to the input file (except group has .pick) 
+  --cmd='sort.seqs'
+  --outputdir='$logfile.extra_files_path'
+  #if $fasta_in.__str__ != "None" and len($fasta_in.__str__) > 0:
+   --fasta=$fasta_in
+   #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1.sorted.\2',$os.path.basename($fasta_in.__str__)) + ":'" + $fasta_out.__str__]
+  #end if
+  #if $qfile_in.__str__ != "None" and len($qfile_in.__str__) > 0:
+   --qfile=$qfile_in
+   #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1.sorted.\2',$os.path.basename($qfile_in.__str__)) + ":'" + $qfile_out.__str__]
+  #end if
+  #if $flow_in.__str__ != "None" and len($flow_in.__str__) > 0:
+   --flow=$flow_in
+   #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1.sorted.\2',$os.path.basename($flow_in.__str__)) + ":'" + $flow_out.__str__]
+  #end if
+  #if $name_in.__str__ != "None" and len($name_in.__str__) > 0:
+   --name=$name_in
+   #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1.sorted.\2',$os.path.basename($name_in.__str__)) + ":'" + $name_out.__str__]
+  #end if
+  #if $group_in.__str__ != "None" and len($group_in.__str__) > 0:
+   --group=$group_in
+   #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1.pick.\2',$os.path.basename($group_in.__str__)) + ":'" + $group_out.__str__]
+  #end if
+  #if $taxonomy_in.__str__ != "None" and len($taxonomy_in.__str__) > 0:
+   --taxonomy=$taxonomy_in
+   #set results = $results + ["'" + $re.sub(r'(^.*)\.(.*?)',r'\1.sorted.\2',$os.path.basename($taxonomy_in.__str__)) + ":'" + $taxonomy_out.__str__]
+  #end if
+  #if $accnos.__str__ != "None" and len($accnos.__str__) > 0:
+   --accnos=$accnos
+  #end if
+  $large
+  --result=#echo ','.join($results)
+ </command>
+ <inputs>
+  <param name="fasta_in" type="data" format="fasta" optional="true" label="fasta - sequences"/>
+  <param name="qfile_in" type="data" format="qual" optional="true" label="qfile - sequence quality"/>
+  <param name="flow_in" type="data" format="sff.flow" optional="true" label="flow - sff flowgram "/>
+  <param name="group_in" type="data" format="groups" optional="true" label="groups - sequence groupings"/>
+  <param name="name_in" type="data" format="names" optional="true" label="names - name reference"/>
+  <param name="taxonomy_in" type="select" format="seq.taxonomy" optional="true" label="taxonomy - taxonomy reference"/>
+  <param name="accnos" type="data" format="accnos" optional="true" label="accnos - sort "/>
+  <param name="large" type="boolean" checked="false" truevalue="--large=true" falsevalue="" label="large - Datasets are large and may not fit in RAM"/>
+ </inputs>
+ <outputs>
+  <data format="html" name="logfile" label="${tool.name} on ${on_string}: logfile" />
+  <data format_source="fasta_in" name="fasta_out" label="${tool.name} on ${on_string}: sorted.fasta">
+    <filter>fasta_in != None</filter>
+  </data>
+  <data format_source="qfile_in" name="qfile_out" label="${tool.name} on ${on_string}: sorted.qfile">
+    <filter>qfile_in != None</filter>
+  </data>
+  <data format_source="flow_in" name="flow_out" label="${tool.name} on ${on_string}: sorted.flow">
+    <filter>flow_in != None</filter>
+  </data>
+  <data format_source="group_in" name="group_out" label="${tool.name} on ${on_string}: sorted.group">
+    <filter>group_in != None</filter>
+  </data>
+  <data format_source="name_in" name="name_out" label="${tool.name} on ${on_string}: sorted.name">
+    <filter>name_in != None</filter>
+  </data>
+  <data format_source="taxonomy_in" name="taxonomy_out" label="${tool.name} on ${on_string}: sorted.taxonomy">
+    <filter>taxonomy_in != None</filter>
+  </data>
+ </outputs>
+ <requirements>
+  <requirement type="binary">mothur</requirement>
+ </requirements>
+ <tests>
+ </tests>
+ <help>
+**Mothur Overview**
+
+Mothur_, initiated by Dr. Patrick Schloss and his software development team
+in the Department of Microbiology and Immunology at The University of Michigan,
+provides bioinformatics for the microbial ecology community.
+
+.. _Mothur: http://www.mothur.org/wiki/Main_Page
+
+**Command Documenation**
+
+The sort.seqs_ command puts sequences from a fasta, name, group, quality, flow or taxonomy file in the same order.
+You can provide an accnos file to indicate the order you want, otherwise mothur will use the order of the first file it reads.
+
+.. _sort.seqs: http://www.mothur.org/wiki/Sort.seqs
+
+
+ </help>
+</tool>
--- a/mothur/tools/mothur/trim.flows.xml	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tools/mothur/trim.flows.xml	Wed Mar 28 15:45:03 2012 -0500
@@ -1,4 +1,4 @@
-<tool id="mothur_trim_flows" name="Trim.flows" version="1.22.0" force_history_refresh="True">
+<tool id="mothur_trim_flows" name="Trim.flows" version="1.24.0" force_history_refresh="True">
  <description>partition by barcode, trim to length, cull by lenght and mismatches</description>
  <command interpreter="python">
   mothur_wrapper.py 
@@ -29,15 +29,21 @@
   #end if
   #if $oligo.add == "yes":
    --oligos=$oligo.oligos
-   #if int($oligo.bdiffs.__str__) > 0:
+   #if $oligo.bdiffs.__str__ != '' and int($oligo.bdiffs.__str__) > 0:
     --bdiffs=$oligo.bdiffs
    #end if
-   #if int($oligo.pdiffs.__str__) > 0:
+   #if $oligo.pdiffs.__str__ != '' and int($oligo.pdiffs.__str__) > 0:
     --pdiffs=$oligo.pdiffs
    #end if
-   #if int($oligo.tdiffs.__str__) > 0:
+   #if $oligo.tdiffs.__str__ != '' and int($oligo.tdiffs.__str__) > 0:
     --tdiffs=$oligo.tdiffs
    #end if
+   #if $oligo.ldiffs.__str__ != '' and int($oligo.ldiffs.__str__) > 0:
+    --ldiffs=$oligo.ldiffs
+   #end if
+   #if $oligo.sdiffs.__str__ != '' and int($oligo.sdiffs.__str__) > 0:
+    --sdiffs=$oligo.sdiffs
+   #end if
    --datasetid='$logfile.id' --new_file_path='$__new_file_path__'
    --new_datasets='^\S+?\.(\S+\.flow)$:sff.flow'
   #end if
@@ -65,7 +71,13 @@
     <param name="pdiffs" type="integer" value="0" label="pdiffs - number of differences to allow in the primer (default 0)">
       <validator type="in_range" message="Number of differences can't be negative" min="0"/>
     </param>
-    <param name="tdiffs" type="integer" value="0" label="tdiffs - total number of differences to allow in primer and barcode (ignored if &#060; 1)">
+    <param name="tdiffs" type="integer" value="0" label="tdiffs - total number of differences to allow in primer and barcode (default 0)">
+      <validator type="in_range" message="Number of differences can't be negative" min="0"/>
+    </param>
+    <param name="ldiffs" type="integer" value="0" optional="true" label="ldiffs - total number of differences to allow in linker sequence (default 0)">
+      <validator type="in_range" message="Number of differences can't be negative" min="0"/>
+    </param>
+    <param name="sdiffs" type="integer" value="0" optional="true" label="sdiffs - total number of differences to allow in spacer sequence (default 0)">
       <validator type="in_range" message="Number of differences can't be negative" min="0"/>
     </param>
    </when>
--- a/mothur/tools/mothur/trim.seqs.xml	Thu Jan 19 11:27:37 2012 -0600
+++ b/mothur/tools/mothur/trim.seqs.xml	Wed Mar 28 15:45:03 2012 -0500
@@ -1,4 +1,4 @@
-<tool id="mothur_trim_seqs" name="Trim.seqs" version="1.20.0" force_history_refresh="True">
+<tool id="mothur_trim_seqs" name="Trim.seqs" version="1.24.0" force_history_refresh="True">
  <description>Trim sequences - primers, barcodes, quality</description>
  <command interpreter="python">
   mothur_wrapper.py 
@@ -25,17 +25,24 @@
   #end if
   #if $oligo.add == "yes":
    --oligos=$oligo.oligos
-   #if int($oligo.bdiffs.__str__) > 0:
+   #if $oligo.bdiffs.__str__ != '' and int($oligo.bdiffs.__str__) > 0:
     --bdiffs=$oligo.bdiffs
    #end if
-   #if int($oligo.pdiffs.__str__) > 0:
+   #if $oligo.pdiffs.__str__ != '' and int($oligo.pdiffs.__str__) > 0:
     --pdiffs=$oligo.pdiffs
    #end if
-   #if int($oligo.tdiffs.__str__) > 0:
+   #if $oligo.tdiffs.__str__ != '' and int($oligo.tdiffs.__str__) > 0:
     --tdiffs=$oligo.tdiffs
    #end if
-   $oligo.allfiles
-   #if $oligo.allfiles.value:
+   #if $oligo.ldiffs.__str__ != '' and int($oligo.ldiffs.__str__) > 0:
+    --ldiffs=$oligo.ldiffs
+   #end if
+   #if $oligo.sdiffs.__str__ != '' and int($oligo.sdiffs.__str__) > 0:
+    --sdiffs=$oligo.sdiffs
+   #end if
+   $oligo.keepforward
+   $oligo.allvalues
+   #if $oligo.allfiles == True:
     --datasetid='$logfile.id' --new_file_path='$__new_file_path__'
     --new_datasets='^\S+?\.(\S+\.fasta)$:${fasta.ext}','^\S+?\.(\S+\.groups)$:groups'
    #end if
@@ -88,9 +95,22 @@
    <when value="no"/>
    <when value="yes">
     <param name="oligos" type="data" format="oligos" label="oligos - barcodes and primers"/>
-    <param name="bdiffs" type="integer" value="0" label="bdiffs - number of differences to allow in the barcode (default 0)"/>
-    <param name="pdiffs" type="integer" value="0" label="pdiffs - number of differences to allow in the primer (default 0)"/>
-    <param name="tdiffs" type="integer" value="0" label="tdiffs - total number of differences to allow in primer and barcode (ignored if &#060; 1)"/>
+    <param name="bdiffs" type="integer" value="0" label="bdiffs - number of differences to allow in the barcode (default 0)">
+      <validator type="in_range" message="Number of differences can't be negative" min="0"/>
+    </param>
+    <param name="pdiffs" type="integer" value="0" label="pdiffs - number of differences to allow in the primer (default 0)">
+      <validator type="in_range" message="Number of differences can't be negative" min="0"/>
+    </param>
+    <param name="tdiffs" type="integer" value="0" label="tdiffs - total number of differences to allow in primer and barcode (default 0)">
+      <validator type="in_range" message="Number of differences can't be negative" min="0"/>
+    </param>
+    <param name="ldiffs" type="integer" value="0" optional="true" label="ldiffs - total number of differences to allow in linker sequence (default 0)">
+      <validator type="in_range" message="Number of differences can't be negative" min="0"/>
+    </param>
+    <param name="sdiffs" type="integer" value="0" optional="true" label="sdiffs - total number of differences to allow in spacer sequence (default 0)">
+      <validator type="in_range" message="Number of differences can't be negative" min="0"/>
+    </param>
+    <param name="keepforward" type="boolean" truevalue="--keepforward=true" falsevalue="" checked="false" label="keepforward - keep the primer"/>
     <param name="allfiles" type="boolean" truevalue="--allfiles=true" falsevalue="" checked="false" label="allfiles - separate into file per barcode"/>
    </when>
   </conditional>