changeset 1:4a89ba6cfc63 draft

"planemo upload for repository https://github.com/jj-umn/galaxytools/tree/master/iedb_api commit 18698e056ccc2d6d37836bd22728e2d8765e92ec"
author jjohnson
date Tue, 25 Feb 2020 17:37:34 -0500
parents 991424605492
children 883cdf0ffae5
files iedb_api.py iedb_api.xml test-data/bcell.fa test-data/seqs.fa test-data/seqs.tsv
diffstat 5 files changed, 600 insertions(+), 283 deletions(-) [+]
line wrap: on
line diff
--- a/iedb_api.py	Mon Feb 17 16:04:07 2020 -0500
+++ b/iedb_api.py	Tue Feb 25 17:37:34 2020 -0500
@@ -1,142 +1,281 @@
 #!/usr/bin/env python
-"""
-"""
-import sys
+
+import argparse
 import os.path
 import re
-import optparse
-import urllib
-import urllib2
-from optparse import OptionParser
+import sys
+import time
+
+from urllib.error import HTTPError
+from urllib.parse import urlencode, unquote
+from urllib.request import urlopen
 
-mhci_methods = ['recommended','consensus','netmhcpan','ann','smmpmbec','smm','comblib_sidney2008','netmhccons','pickpocket']
-mhcii_methods = ['recommended','consensus3','NetMHCIIpan','nn_align','smm_align','comblib','tepitope']
-processing_methods = ['recommended','consensus','netmhcpan','ann','smmpmbec','smm','comblib_sidney2008']
-mhcnp_methods = ['mhcnp']
-bcell_methods = ['Bepipred','Chou-FasmanEmini','Karplus-Schulz','Kolaskar-Tongaonkar','Parker']
-prediction_methods = {'mhci':mhci_methods,'mhcii':mhcii_methods,'processing':processing_methods,'mhcnp':mhcnp_methods,'bcell':bcell_methods}
+mhci_methods = ['recommended', 'consensus',
+                'netmhcpan_ba', 'netmhcpan_el',
+                'ann', 'smmpmbec', 'smm',
+                'comblib_sidney2008', 'netmhccons',
+                'pickpocket', 'netmhcstabpan']
+mhcii_methods = ['recommended', 'consensus', 'NetMHCIIpan',
+                 'nn_align', 'smm_align', 'comblib', 'tepitope']
+processing_methods = ['recommended', 'netmhcpan', 'ann',
+                      'smmpmbec', 'smm', 'comblib_sidney2008',
+                      'netmhccons', 'pickpocket']
+mhcnp_methods = ['mhcnp', 'netmhcpan']
+bcell_methods = ['Bepipred', 'Chou-Fasman', 'Emini', 'Karplus-Schulz',
+                 'Kolaskar-Tongaonkar', 'Parker', 'Bepipred-2.0']
+prediction_methods = {'mhci': mhci_methods,
+                      'mhcii': mhcii_methods,
+                      'processing': processing_methods,
+                      'mhcnp': mhcnp_methods,
+                      'bcell': bcell_methods}
+all_methods = set(mhci_methods + mhcii_methods +
+                  mhcnp_methods + bcell_methods)
+prediction_lengths = {'mhci': range(8, 16),
+                      'mhcii': range(11, 31),
+                      'processing': range(8, 15),
+                      'mhcnp': range(8, 12),
+                      'bcell': range(8, 16)}
 
-def warn_err(msg,exit_code=1):
-  sys.stderr.write(msg)
-  if exit_code:
-    sys.exit(exit_code)
+
+def warn_err(msg, exit_code=1):
+    sys.stderr.write(msg)
+    if exit_code:
+        sys.exit(exit_code)
 
 
 def __main__():
-  #Parse Command Line
-  parser = optparse.OptionParser()
-  parser.add_option( '-p', '--prediction', dest='prediction', default='mhci', choices=['mhci','mhcii','processing','mhcnp','bcell'], help='IEDB API prediction service' )
-  parser.add_option( '-s', '--sequence', dest='sequence', action="append", default=None, help='Peptide Sequence' )
-  parser.add_option( '-m', '--method', dest='method', default='recommended', choices=['recommended','consensus','netmhcpan','ann','smmpmbec','smm','comblib_sidney2008','netmhccons','pickpocket' ], help='prediction method' )
-  parser.add_option( '-a', '--allele', dest='allele', action="append", default=[], help='Alleles for which to make predictions' )
-  parser.add_option( '-l', '--length', dest='length', action="append", default=[], choices=['8', '9', '10', '11', '12', '13', '14', '15'], help='lengths for which to make predictions, 1 per allele' )
-  parser.add_option( '-i', '--input', dest='input', default=None, help='Input file for peptide sequences (fasta or tabular)' )
-  parser.add_option( '-c', '--column', dest='column', default=None, help='Peptide Column in a tabular input file' )
-  parser.add_option( '-C', '--id_column', dest='id_column', default=None, help='ID Column in a tabular input file' )
-  parser.add_option( '-o', '--output', dest='output', default=None, help='Output file for query results' )
-  parser.add_option( '-d', '--debug', dest='debug', action='store_true', default=False, help='Turn on wrapper debugging to stderr'  )
-  (options, args) = parser.parse_args()
-
-  aapat = '^[ABCDEFGHIKLMNPQRSTVWY]+$'          
-
-  if not options.allele and options.prediction != 'bcell':
-    warn_err('-a allele required\n', exit_code=1)
-
-  if not (options.sequence or options.input): 
-    warn_err('NO Sequences given: either -s sequence or -i input_file is required\n', exit_code=1)
+    # Parse Command Line
+    parser = argparse.ArgumentParser(description='', epilog='')
+    parser.add_argument('-p', '--prediction',
+                        default='mhci',
+                        choices=prediction_methods.keys(),
+                        help='IEDB API prediction service')
+    parser.add_argument('-s', '--sequence',
+                        action="append",
+                        default=None,
+                        help='Peptide Sequence')
+    parser.add_argument('-m', '--method',
+                        default='recommended',
+                        choices=all_methods,
+                        help='prediction method')
+    parser.add_argument('-P', '--proteasome',
+                        default=None,
+                        choices=['immuno', 'constitutive'],
+                        help='IEDB processing proteasome type')
+    parser.add_argument('-a', '--allele',
+                        action="append",
+                        default=[],
+                        help='Alleles for which to make predictions')
+    parser.add_argument('-l', '--length',
+                        action="append",
+                        default=[],
+                        help='lengths for which to make predictions, ' +
+                             '1 per allele')
+    parser.add_argument('-w', '--window_size',
+                        type=int,
+                        default=None,
+                        help='window_size for bcell prediction')
+    parser.add_argument('-i', '--input',
+                        default=None,
+                        help='Input file for peptide sequences ' +
+                             '(fasta or tabular)')
+    parser.add_argument('-c', '--column',
+                        default=None,
+                        help='Peptide Column in a tabular input file')
+    parser.add_argument('-C', '--id_column',
+                        default=None,
+                        help='ID Column in a tabular input file')
+    parser.add_argument('-o', '--output',
+                        default=None,
+                        help='Output file for query results')
+    parser.add_argument('-O', '--output2',
+                        default='iedb_results2',
+                        help='Output file for secondary query results')
+    parser.add_argument('-t', '--timeout',
+                        type=int,
+                        default=600,
+                        help='Seconds to wait for server response')
+    parser.add_argument('-r', '--retries',
+                        type=int,
+                        default=5,
+                        help='Number of times to retry server query')
+    parser.add_argument('-S', '--sleep',
+                        type=int,
+                        default=300,
+                        help='Seconds to wait between retries')
+    parser.add_argument('-d', '--debug',
+                        action='store_true',
+                        default=False,
+                        help='Turn on wrapper debugging to stderr')
+    args = parser.parse_args()
 
-  if options.output != None:
-    try:
-      outputPath = os.path.abspath(options.output)
-      outputFile = open(outputPath, 'w')
-    except Exception, e:
-      warn_err("Unable to open output file: %s\n" % e, exit_code=1)
-  else:
-    outputFile = sys.stdout
+    aapat = '^[ABCDEFGHIKLMNPQRSTVWY]+$'
+
+    if not args.allele and args.prediction != 'bcell':
+        warn_err('-a allele required\n', exit_code=1)
 
-  url = 'http://tools-api.iedb.org/tools_api/%s/' % options.prediction
+    if not (args.sequence or args.input):
+        warn_err('NO Sequences given: ' +
+                 'either -s sequence or -i input_file is required\n',
+                 exit_code=1)
 
-  #TODO parse alleles from the options.alleles file
-  alleles = ','.join(options.allele)
-  lengths = ','.join(options.length)
-  method = options.method
+    if args.output is not None:
+        try:
+            outputPath = os.path.abspath(args.output)
+            outputFile = open(outputPath, 'w')
+        except Exception as e:
+            warn_err("Unable to open output file: %s\n" % e, exit_code=1)
+    else:
+        outputFile = sys.stdout
 
-  results = []
-  global header
-  header = None
+    url = 'http://tools-cluster-interface.iedb.org/tools_api/%s/' %\
+        args.prediction
+    len_param = 'length' if args.prediction != 'bcell' else 'window_size'
 
-  sequence_text = []
-  def add_seq(seqid,seq):
-    sequence_text.append(">%s\n%s" % (seqid if seqid else "peptide%d" % len(sequence_text),seq))
-
-  def query(url,seq,allele,length,seqid=None,method='recommended'):
+    # TODO parse alleles from the args.alleles file
+    alleles = ','.join(args.allele) if args.prediction != 'bcell' else None
+    lengths = ','.join(args.length)
+    if args.prediction == 'bcell':
+        lengths = args.window_size
+    method = args.method
+    proteasome = args.proteasome if args.prediction == 'processcing' else None
     global header
-    params = dict()
-    if method:
-      params['method'] = method
-    params['sequence_text'] = seq
-    params['allele'] = allele
-    params['length'] = length
-    data = urllib.urlencode(params)
-    request = urllib2.Request(url, data)
-    if options.debug:
-      print >> sys.stderr, "url %s %s %s" % (request.get_full_url(), seqid if seqid else "None", seq)
-    response = None
-    response = urllib2.urlopen(request)
-    if response and response.getcode() == 200:
-      resp_data = response.readlines()
-      for line in resp_data:
-        if line.find('eptide') > 0:
-          header = "#%s%s" % ("ID\t" if seqid else "", line)
-          continue
-        if seqid:
-          results.append("%s\t%s" % (seqid,line))
-        else:
-          results.append(line)
-    elif not response:
-      warn_err("NO response from IEDB server\n",  exit_code=3)
-    else:
-      warn_err("Error connecting to IEDB server\n",  exit_code=response.getcode())
+    header = None
+    results = []
+    global header2
+    header2 = None
+    results2 = []
+
+    sequence_text = []
+
+    def add_seq(seqid, seq):
+        sid = seqid if seqid else "peptide%d" % len(sequence_text)
+        sequence_text.append(">%s\n%s" % (sid, seq))
 
-  if options.sequence:
-    for i,seq in enumerate(options.sequence):
-      query(url,seq,alleles,lengths,seqid=None,method=method)
-  if options.input:
-    try:
-      fh = open(options.input,'r')
-      if options.column: ## tabular
-        col = int(options.column)
-        idcol = int(options.id_column) if options.id_column else None
-        for i,line in enumerate(fh):
-          fields = line.split('\t')
-          if len(fields) > col:
-            seq = re.sub('[_*]','',fields[col])
-            if re.match(aapat,seq):
-              seqid = fields[idcol] if idcol != None and idcol < len(fields) else None
-              query(url,seq,alleles,lengths,seqid=seqid,method=method)
-            else:
-              warn_err('Line %d, Not a peptide: %s\n' % (i,seq),exit_code=None)
-      else:  ## fasta
-        seqid = None
-        seq = ''
-        for i,line in enumerate(fh):
-          if line.startswith('>'):
-            if seqid and len(seq) > 0:
-              query(url,seq,alleles,lengths,seqid=seqid,method=method)
-            seqid = line[1:].strip()
-            seq = ''
-          else:
-            seq += line.strip()
-        if seqid and len(seq) > 0:
-          query(url,seq,alleles,lengths,seqid=seqid,method=method)
-      fh.close()
-    except Exception, e:
-      warn_err("Unable to open input file: %s\n" % e, exit_code=1)
+    def query(url, seq, allele, length, seqid=None, method='recommended'):
+        global header
+        global header2
+        params = dict()
+        if method:
+            params['method'] = method.encode()
+        if proteasome:
+            params['proteasome'] = proteasome.encode()
+        params['sequence_text'] = seq.encode()
+        if allele is not None:
+            params['allele'] = allele.encode()
+        if length is not None:
+            params[len_param] = str(length).encode()
+        req_data = urlencode(params)
+        if args.debug:
+            print('url %s %s' % (url, unquote(req_data)), file=sys.stderr)
+        retries = max(0, args.retries) + 1
+        for retry in range(1, retries):
+            response = None
+            try:
+                response = urlopen(url, data=req_data.encode('utf-8'),
+                                   timeout=args.timeout)
+                if response and response.getcode() == 200:
+                    data = [line.decode() for line in response.readlines()]
+                    if args.debug:
+                        print(data, file=sys.stderr)
+                    rslts = results
+                    for ln, line in enumerate(data):
+                        if line.lower().find('invalid') >= 0:
+                            msg = '%s %s\n%s' % (url, unquote(req_data),
+                                                 ''.join(data))
+                            warn_err(msg, exit_code=1)
+                        if line.find('eptide') > 0:
+                            header = "#%s%s" %\
+                                    ("ID\t" if seqid else "", line)
+                            if args.debug:
+                                print(header, file=sys.stderr)
+                            continue
+                        elif method == 'Bepipred' and line.find('Residue') > 0:
+                            header2 = "#%s%s" %\
+                                    ("ID\t" if seqid else "", line)
+                            if args.debug:
+                                print(header2, file=sys.stderr)
+                            rslts = results2
+                            continue
+                        if seqid:
+                            rslts.extend("%s\t%s" % (seqid, line))
+                        else:
+                            rslts.extend(line)
+                    break
+                else:
+                    code = response.getcode() if response else 1
+                    warn_err("Error connecting to IEDB server\n",
+                             exit_code=code)
+            except HTTPError as e:
+                code = None if retry < args.retries else e.code
+                warn_err("%d of %d Error connecting to IEDB server %s\n" %
+                         (retry, retries, e),
+                         exit_code=code)
+                time.sleep(args.sleep)
+            except Exception as e:
+                warn_err("Error connecting to IEDB server %s\n" % e,
+                         exit_code=3)
 
-  if header:
-    outputFile.write(header)  
-  for line in results:
-    outputFile.write(line)  
+    if args.sequence:
+        for i, seq in enumerate(args.sequence):
+            query(url, seq, alleles, lengths, seqid=None, method=method)
+    if args.input:
+        try:
+            fh = open(args.input, 'r')
+            if args.column:  # tabular
+                col = int(args.column)
+                idcol = int(args.id_column) if args.id_column else None
+                for i, line in enumerate(fh):
+                    fields = line.split('\t')
+                    if len(fields) > col:
+                        seq = re.sub('[_*]', '', fields[col])
+                        if re.match(aapat, seq):
+                            if idcol is not None and idcol < len(fields):
+                                seqid = fields[idcol]
+                            else:
+                                seqid = None
+                            query(url, seq, alleles, lengths,
+                                  seqid=seqid, method=method)
+                        else:
+                            warn_err('Line %d, Not a peptide: %s\n' % (i, seq),
+                                     exit_code=None)
+            else:  # fasta
+                seqid = None
+                seq = ''
+                for i, line in enumerate(fh):
+                    if line.startswith('>'):
+                        if seqid and len(seq) > 0:
+                            query(url, seq, alleles, lengths,
+                                  seqid=seqid, method=method)
+                        seqid = line[1:].strip()
+                        seq = ''
+                    else:
+                        seq += line.strip()
+                if seqid and len(seq) > 0:
+                    query(url, seq, alleles, lengths,
+                          seqid=seqid, method=method)
+            fh.close()
+        except Exception as e:
+            warn_err("Unable to open input file: %s\n" % e, exit_code=1)
 
-if __name__ == "__main__": __main__()
+    if header:
+        outputFile.write(header)
+    for line in results:
+        outputFile.write(line)
+    if results2:
+        if args.output2:
+            try:
+                outPath = os.path.abspath(args.output2)
+                outFile = open(outPath, 'w')
+            except Exception as e:
+                warn_err("Unable to open output file: %s\n" % e, exit_code=1)
+        else:
+            outFile = sys.stdout
+        if header2:
+            outFile.write(header2)
+        for line in results2:
+            outFile.write(line)
 
+
+if __name__ == "__main__":
+    __main__()
--- a/iedb_api.xml	Mon Feb 17 16:04:07 2020 -0500
+++ b/iedb_api.xml	Tue Feb 25 17:37:34 2020 -0500
@@ -1,17 +1,81 @@
-<tool id="iedb_api" name="IEDB" version="0.1.0">
+<tool id="iedb_api" name="IEDB" version="2.15.0">
     <description>MHC Binding prediction</description>
+    <macros>
+        <xml name="alleles" token_hla_regex="" token_hla_examples="" token_hlalen_examples=""> 
+            <conditional name="alleles">
+               <param name="allelesrc" type="select" label="Alleles">
+                   <option value="history">From history</option>
+                   <option value="entry">Entered</option>
+               </param>
+               <when value="history">
+                   <param name="allele_file" type="data" format="txt" label="Alleles file">
+                       <help>The dataset should have on allele per line. The allele may be followed by an optional comma-separated list of peptide lengths, e.g.: @HLALEN_EXAMPLES@</help>
+                   </param>
+               </when>
+               <when value="entry">
+                   <param name="allele_text" type="text" size="80" label="Alleles">
+                       <help>Enter alleles separated by white space: @HLA_EXAMPLES@  (The peptide lengths may follow each allele: @HLALEN_EXAMPLES@)</help>
+                       <validator type="regex" message="Doesn't appear to be a valid allele">^@HLA_REGEX@(\s+@HLA_REGEX@)*$</validator>
+                   </param>
+               </when>
+            </conditional>
+        </xml>
+    </macros>
     <requirements>
+        <requirement type="package" version="3.7">python</requirement>
     </requirements>
-    <stdio>
-        <exit_code range="1:" />
-    </stdio>
-    <command interpreter="python"><![CDATA[
+    <command detect_errors="exit_code"><![CDATA[
         #import re
-        iedb_api.py --prediction=$prediction.tool --method=$prediction.method 
+        python '${__tool_directory__}/iedb_api.py' 
+        --prediction=$prediction.tool
+        --method=$prediction.method 
+        #if $prediction.tool == 'bcell':
+            #if $prediction.window_size:
+                -w $prediction.window_size
+            #end if
+        #else
+            #if $prediction.tool == 'processing' and $prediction.proteasome:
+                --proteasome $prediction.proteasome
+            #end if
+            #if $prediction.alleles.allelesrc == 'history':
+              #for $line in open(str($prediction.alleles.allele_file)):
+                #set $fields = $line.strip().split(',') 
+                #set $allele = $fields[0].strip()
+                #if len($allele) > 0:
+                  #if len($fields) > 1: 
+                    #for $alen in $fields[1:]:
+                      -a '$allele' -l $alen
+                    #end for
+                  #else:
+                    #for $alen in str($prediction.lengths).split(','):
+                      -a '$allele' -l $alen
+                    #end for
+                  #end if
+                #end if
+              #end for
+            #else:
+              #for $word in str($prediction.alleles.allele_text).strip().split():
+                #set $fields = $word.strip().split(',') 
+                #set $allele = $fields[0].strip()
+                #if len($allele) > 0:
+                  #if len($fields) > 1: 
+                    #for $alen in $fields[1:]:
+                      -a '$allele' -l $alen
+                    #end for
+                  #else:
+                    #for $alen in str($prediction.lengths).split(','):
+                      -a '$allele' -l $alen
+                    #end for
+                  #end if
+                #end if
+              #end for
+            #end if
+        #end if
+
         #if $sequence.seqsrc == 'fasta':
-          -i $sequence.seq_fasta
+          -i '$sequence.seq_fasta'
         #else if $sequence.seqsrc == 'tabular':
-          -i $sequence.seq_tsv
+          -i '$sequence.seq_tsv'
           -c #echo int(str($sequence.pep_col)) - 1
           #if $sequence.id_col:
             -C #echo  int(str($sequence.id_col)) - 1
@@ -21,42 +85,131 @@
             -s $seq.strip()
           #end for
         #end if
-        #if $alleles.allelesrc == 'history':
-          #for $line in open(str($alleles.allele_file)):
-            #set $fields = $line.strip().split(',') 
-            #set $allele = $fields[0].strip()
-            #if len($allele) > 0:
-              #if len($fields) > 1: 
-                #for $alen in $fields[1:]:
-                  -a $allele -l $alen
-                #end for
-              #else:
-                #for $alen in str($lengths).split(','):
-                  -a $allele -l $alen
-                #end for
-              #end if
-            #end if
-          #end for
-        #else:
-          #for $word in str($alleles.allele_text).strip().split():
-            #set $fields = $word.strip().split(',') 
-            #set $allele = $fields[0].strip()
-            #if len($allele) > 0:
-              #if len($fields) > 1: 
-                #for $alen in $fields[1:]:
-                  -a $allele -l $alen
-                #end for
-              #else:
-                #for $alen in str($lengths).split(','):
-                  -a $allele -l $alen
-                #end for
-              #end if
-            #end if
-          #end for
-        #end if
         -o $output
     ]]></command>
     <inputs>
+        <conditional name="prediction">
+            <param name="tool" type="select" label="Prediction">
+                <option value="mhci">MHC-I Binding</option>
+                <option value="mhcii">MHC-II Binding</option>
+                <option value="processing">MHC-I Processing</option>
+                <option value="mhcnp">MHC-NP T-Cell Epitope</option>
+                <option value="bcell">Antibody Epitope Prediction</option>
+            </param>
+            <when value="mhci">
+                <param name="method" type="select" label="prediction method">
+                    <option value="recommended" selected="true">recommended</option>
+                    <option value="consensus">consensus</option>
+                    <option value="netmhcpan">netmhcpan</option>
+                    <option value="ann">ann</option>
+                    <option value="smmpmbec">smmpmbec</option>
+                    <option value="smm">smm</option>
+                    <option value="comblib_sidney2008">comblib_sidney2008</option>
+                    <option value="netmhccons">netmhccons</option>
+                    <option value="pickpocket">pickpocket</option>
+                </param>
+                <expand macro="alleles" hla_regex="(HLA-[A-CEG]\*[0-8][[0-9]:[0-9][0-9][0-9]*|BoLA-.+|Gogo-.+|H-2-[DKL][bdk]|Mamu-.+|Patr-.+|RT.+|SLA-.+)(,([8-9]|1[0-5]))*" hla_examples="HLA-A*03:01  HLA-B*07:02" hlalen_examples="HLA-A*03:01,8,9,10  HLA-B*07:02,9"/>
+                <param name="lengths" type="select" multiple="true" optional="false" label="peptide lengths for prediction">
+                    <help>Used for any alleles which don't include specified lengths</help>
+                    <option value="8" selected="true">8</option>
+                    <option value="9">9</option>
+                    <option value="10">10</option>
+                    <option value="11">11</option>
+                    <option value="12">12</option>
+                    <option value="13">13</option>
+                    <option value="14">14</option>
+                    <option value="15">15</option>
+                </param>
+
+            </when>
+            <when value="mhcii">
+                <param name="method" type="select" label="prediction method">
+                    <option value="recommended" selected="true">recommended</option>
+                    <option value="consensus3">consensus3</option>
+                    <option value="NetMHCIIpan">NetMHCIIpan</option>
+                    <option value="nn_align">nn_align</option>
+                    <option value="smm_align">smm_align</option>
+                    <option value="comblib">comblib</option>
+                    <option value="tepitope">tepitope</option>
+                </param>
+                <expand macro="alleles" hla_regex="((DPA1\*0[1-3](:0[1-3])?/DPB1\*0[1-6]:0[12]|DQA1\*0[1-5]:0[12]/DQB1\*0[2-6]:0[12]|DRB[1-5]\*[01][1-9]:0[1-5]|H2-IA[bd]),(asis|[1-2][0-9]|30))*" hla_examples="DPA1*01/DPB1*04:01 HLA-DRB1*01:01 H2-IAb" hlalen_examples="DPA1*01/DPB1*04:01,11,15"/>
+                <param name="lengths" type="select" multiple="true" optional="false" label="peptide lengths for prediction">
+                    <help>Used for any alleles which don't include specified lengths</help>
+                    <option value="asis">asis</option>
+                    <option value="11">11</option>
+                    <option value="12">12</option>
+                    <option value="13">13</option>
+                    <option value="14">14</option>
+                    <option value="15" selected="true">15</option>
+                    <option value="16">16</option>
+                    <option value="17">17</option>
+                    <option value="18">18</option>
+                    <option value="19">19</option>
+                    <option value="20">20</option>
+                    <option value="21">21</option>
+                    <option value="22">22</option>
+                    <option value="23">23</option>
+                    <option value="24">24</option>
+                    <option value="25">25</option>
+                    <option value="26">26</option>
+                    <option value="27">27</option>
+                    <option value="28">28</option>
+                    <option value="29">29</option>
+                    <option value="30">30</option>
+                </param>
+            </when>
+            <when value="processing">
+                <param name="method" type="select" label="prediction method">
+                    <option value="recommended" selected="true">recommended</option>
+                    <option value="consensus">consensus</option>
+                    <option value="netmhcpan">netmhcpan</option>
+                    <option value="ann">ann</option>
+                    <option value="smmpmbec">smmpmbec</option>
+                    <option value="smm">smm</option>
+                    <option value="comblib_sidney2008">comblib_sidney2008</option>
+                </param>
+                <param name="proteasome" type="select" label="proteasome type">
+                    <option value="immuno">immuno</option>
+                    <option value="constitutive">constitutive</option>
+                </param>
+                <expand macro="alleles" hla_regex="(HLA-[A-CE]\*[0-8][[0-9]:[0-9][0-9]|BoLA-.+|Gogo-.+|H-2-[DKL][bdk]|Mamu-.+|Patr-.+|RT.+|SLA-.+)(,([8-9]|1[0-4]))*" hla_examples="HLA-A*03:01  HLA-B*07:02" hlalen_examples="HLA-A*03:01,8,9,10  HLA-B*07:02,9"/> 
+                <param name="lengths" type="select" multiple="true" optional="false" label="peptide lengths for prediction">
+                    <help>Used for any alleles which don't include specified lengths</help>
+                    <option value="8" selected="true">8</option>
+                    <option value="9">9</option>
+                    <option value="10">10</option>
+                    <option value="11">11</option>
+                    <option value="12">12</option>
+                    <option value="13">13</option>
+                    <option value="14">14</option>
+                </param>
+            </when>
+            <when value="mhcnp">
+                <param name="method" type="select" label="prediction method">
+                    <option value="mhcnp" selected="true">mhcnp</option>
+                    <option value="netmhcpan">netmhcpan</option>
+                </param>
+                <expand macro="alleles" hla_regex="(HLA-(A\*02:01|B\*07:02|B\*35:01|B\*44:03|B\*53:01|B\*57:01)|H-2-[DK]b)(,[8-9]|1[0-1])*" hla_examples="HLA-A*02:01  H-2-Db" hlalen_examples="HLA-A*02:01,8,9,10"/> 
+                <param name="lengths" type="select" multiple="true" optional="false" label="peptide lengths for prediction">
+                    <help>Used for any alleles which don't include specified lengths</help>
+                    <option value="8" selected="true">8</option>
+                    <option value="9">9</option>
+                    <option value="10">10</option>
+                    <option value="11">11</option>
+                </param>
+            </when>
+            <when value="bcell">
+                <param name="method" type="select" label="prediction method">
+                    <option value="Bepipred" selected="true">Bepipred</option>
+                    <option value="Chou-Fasman">Chou-Fasman</option>
+                    <option value="Emini">Emini</option>
+                    <option value="Karplus-Schulz">Karplus-Schulz</option>
+                    <option value="Kolaskar-Tongaonkar">Kolaskar-Tongaonkar</option>
+                    <option value="Parker">Parker</option>
+                </param>
+                <param name="window_size" type="integer" value="" optional="true" min="1" label="window_size" help="window_size should be less than the sequence length, and less than 8 for Karplus-Schulz method"/>
+            </when>
+        </conditional>
         <conditional name="sequence">
            <param name="seqsrc" type="select" label="Peptide sequences">
                <option value="fasta">Fasta file</option>
@@ -75,139 +228,157 @@
                <param name="seq_text" type="text" size="80" label="Peptide Sequence"/>
            </when>
         </conditional>
-        <conditional name="alleles">
-           <param name="allelesrc" type="select" label="Alleles">
-               <option value="history">From history</option>
-               <option value="entry">Entered</option>
-           </param>
-           <when value="history">
-               <param name="allele_file" type="data" format="txt" label="Alleles file">
-                   <help>The dataset should have on allele per line. The allele may be followed by an optional comma-separated list of pepttide lengths, e.g.: HLA-A*02:01,8,9</help>
-               </param>
-           </when>
-           <when value="entry">
-               <param name="allele_text" type="text" size="80" label="Alleles">
-                   <help>Enter alleles separated by white space: HLA-A*03:01  HLA-B*07:02  (The peptide lengths may follow each allele: HLA-A*03:01,8,9,10  HLA-B*07:02,9</help>
-                   <validator type="regex" message="IDs separted by commas">^(HLA-([A-C]|D[PQR][AB]1)\*[0-9][[0-9]:[0-9][0-9](,(8|9|10|11|12|13|14|15))*)(\s+HLA-([A-C]|D[PQR][AB]1)\*[0-9][[0-9]:[0-9][0-9](,(8|9|10|11|12|13|14|15))*)*$</validator>
-               </param>
-           </when>
-        </conditional>
-        <param name="lengths" type="select" multiple="true" label="peptide lengths for prediction">
-            <help>Used for any alleles which don't include specified lengths</help>
-            <option value="8">8</option>
-            <option value="9">9</option>
-            <option value="10">10</option>
-            <option value="11">11</option>
-            <option value="12">12</option>
-            <option value="13">13</option>
-            <option value="14">14</option>
-            <option value="15">15</option>
-        </param>
-        <conditional name="prediction">
-           <param name="tool" type="select" label="Prediction">
-               <option value="mhci">MHC-I Binding</option>
-               <option value="mhcii">MHC-II Binding</option>
-               <option value="processing">MHC-I Processing</option>
-               <option value="mhcnp">MHC-NP T-Cell Epitope</option>
-               <option value="bcell">Antibody Epitope Prediction</option>
-           </param>
-           <when value="mhci">
-               <param name="method" type="select" label="prediction method">
-                   <option value="recommended" selected="true">recommended</option>
-                   <option value="consensus">consensus</option>
-                   <option value="netmhcpan">netmhcpan</option>
-                   <option value="ann">ann</option>
-                   <option value="smmpmbec">smmpmbec</option>
-                   <option value="smm">smm</option>
-                   <option value="comblib_sidney2008">comblib_sidney2008</option>
-                   <option value="netmhccons">netmhccons</option>
-                   <option value="pickpocket">pickpocket</option>
-               </param>
-           </when>
-           <when value="mhcii">
-               <param name="method" type="select" label="prediction method">
-                   <option value="recommended" selected="true">recommended</option>
-                   <option value="consensus3">consensus3</option>
-                   <option value="NetMHCIIpan">NetMHCIIpan</option>
-                   <option value="nn_align">nn_align</option>
-                   <option value="smm_align">smm_align</option>
-                   <option value="comblib">comblib</option>
-                   <option value="tepitope">tepitope</option>
-               </param>
-           </when>
-           <when value="processing">
-               <param name="method" type="select" label="prediction method">
-                   <option value="recommended" selected="true">recommended</option>
-                   <option value="consensus">consensus</option>
-                   <option value="netmhcpan">netmhcpan</option>
-                   <option value="ann">ann</option>
-                   <option value="smmpmbec">smmpmbec</option>
-                   <option value="smm">smm</option>
-                   <option value="comblib_sidney2008">comblib_sidney2008</option>
-               </param>
-           </when>
-           <when value="mhcnp">
-               <param name="method" type="select" label="prediction method">
-                   <option value="mhcnp" selected="true">mhcnp</option>
-               </param>
-           </when>
-           <when value="bcell">
-               <param name="method" type="select" label="prediction method">
-                   <option value="Bepipred" selected="true">Bepipred</option>
-                   <option value="Chou-Fasman">Chou-Fasman</option>
-                   <option value="Emini">Emini</option>
-                   <option value="Karplus-Schulz">Karplus-Schulz</option>
-                   <option value="Kolaskar-Tongaonkar">Kolaskar-Tongaonkar</option>
-                   <option value="Parker">Parker</option>
-               </param>
-               <param name="window_size" type="integer" value="" optional="true" min="1" label="window_size" help="window_size should be less than the sequence length, and less than 8 for Karplus-Schulz method"/>
-           </when>
-        </conditional>
+
     </inputs>
     <outputs>
+        <!--
         <data name="output" format="tabular"/>
+        -->
+        <data name="output" format="tabular" label="IEDB ${prediction.tool} ${prediction.method}"/>
+        <data name="output2" format="tabular" label="IEDB ${prediction.tool} ${prediction.method} residue scores" from_work_dir="iedb_results2">
+            <filter>prediction['method'].startswith('Bepipred')</filter>
+        </data> 
     </outputs>
     <tests>
-        <test>
-            <param name="seqsrc" value="entry"/>
-            <param name="seq_text" value="SLYNTVATLYCVHQRIDV"/>
-            <param name="allelesrc" value="entry"/>
-            <param name="allele_text" value="HLA-A*01:01,9"/>
-            <param name="tool" value="mhci"/>
-            <param name="method" value="recommended"/>
+        <!-- test1 -->
+        <test> 
+            <conditional name="prediction">
+                <param name="tool" value="mhci"/>
+                <param name="method" value="recommended"/>
+                <conditional name="alleles">
+                    <param name="allelesrc" value="entry"/>
+                    <param name="allele_text" value="HLA-A*01:01,9"/>
+                </conditional>
+            </conditional>
+            <conditional name="sequence">
+                <param name="seqsrc" value="entry"/>
+                <param name="seq_text" value="SLYNTVATLYCVHQRIDV"/>
+            </conditional>
             <output name="output">
                 <assert_contents>
                     <has_text text="LYNTVATLY" />
                 </assert_contents>
             </output>
         </test>
+        <!-- test2 -->
         <test>
-            <param name="seqsrc" value="fasta"/>
-            <param name="seq_fasta" ftype="fasta" value="seqs.fa"/>
-            <param name="allelesrc" value="history"/>
-            <param name="allele_file" ftype="txt" value="alleles.txt"/>
-            <param name="tool" value="mhci"/>
-            <param name="method" value="recommended"/>
+            <conditional name="prediction">
+                <param name="tool" value="mhci"/>
+                <param name="method" value="recommended"/>
+                <conditional name="alleles">
+                    <param name="allelesrc" value="history"/>
+                    <param name="allele_file" ftype="tabular" value="alleles.tsv"/>
+                </conditional>
+            </conditional>
+            <conditional name="sequence">
+                <param name="seqsrc" value="fasta"/>
+                <param name="seq_fasta" ftype="fasta" value="seqs.fa"/>
+            </conditional>
             <output name="output">
                 <assert_contents>
                     <has_text text="peptide1" />
-                    <has_text text="AHKVPRRLLK" />
+                    <has_text text="HKVPRRLLK" />
+                </assert_contents>
+            </output>
+        </test>
+        <!-- test3 -->
+        <test>
+            <conditional name="prediction">
+                <param name="tool" value="mhci"/>
+                <param name="method" value="recommended"/>
+                <conditional name="alleles">
+                    <param name="allelesrc" value="history"/>
+                    <param name="allele_file" ftype="tabular" value="alleles.tsv"/>
+                </conditional>
+            </conditional>
+            <conditional name="sequence">
+                <param name="seqsrc" value="tabular"/>
+                <param name="seq_tsv" ftype="tabular" value="seqs.tsv"/>
+                <param name="pep_col" value="3"/>
+                <param name="id_col" value="1"/>
+            </conditional>
+            <output name="output">
+                <assert_contents>
+                    <has_text text="peptide1" />
+                    <has_text text="HKVPRRLLK" />
                 </assert_contents>
             </output>
         </test>
+        <!-- test4 -->
         <test>
-            <param name="seqsrc" value="tabular"/>
-            <param name="seq_tsv" ftype="tabular" value="seqs.tsv"/>
-            <param name="pep_col" value="3"/>
-            <param name="id_col" value="1"/>
-            <param name="allelesrc" value="history"/>
-            <param name="allele_file" ftype="txt" value="alleles.txt"/>
-            <param name="tool" value="mhci"/>
-            <param name="method" value="recommended"/>
+            <conditional name="prediction">
+                <param name="tool" value="mhcii"/>
+                <param name="method" value="recommended"/>
+                <conditional name="alleles">
+                    <param name="allelesrc" value="entry"/>
+                    <param name="allele_text" value="DPA1*01/DPB1*04:01"/>
+                </conditional>
+                <param name="lengths" value="asis"/>
+            </conditional>
+            <conditional name="sequence">
+                <param name="seqsrc" value="entry"/>
+                <param name="seq_text" value="SLYNTVATLYCVHQRIDV"/>
+            </conditional>
+            <output name="output">
+                <assert_contents>
+                    <has_text text="LYNTVATLY" />
+                </assert_contents>
+            </output>
+        </test>
+        <!-- test5 -->
+        <test>
+            <conditional name="prediction">
+                <param name="tool" value="processing"/>
+                <param name="method" value="recommended"/>
+                <conditional name="alleles">
+                    <param name="allelesrc" value="entry"/>
+                    <param name="allele_text" value="HLA-A*01:01,8 HLA-A*02:01,9"/>
+                </conditional>
+                <param name="proteasome" value="constitutive"/>
+            </conditional>
+            <conditional name="sequence">
+                <param name="seqsrc" value="entry"/>
+                <param name="seq_text" value="SLYNTVATLYCVHQRIDV"/>
+            </conditional>
             <output name="output">
                 <assert_contents>
-                    <has_text text="peptide1" />
-                    <has_text text="AHKVPRRLLK" />
+                    <has_text text="LYNTVATLY" />
+                </assert_contents>
+            </output>
+        </test>
+        <!-- test6 -->
+        <test>
+            <conditional name="prediction">
+                <param name="tool" value="mhcnp"/>
+                <param name="method" value="mhcnp"/>
+                <conditional name="alleles">
+                    <param name="allelesrc" value="entry"/>
+                    <param name="allele_text" value="HLA-A*02:01,9"/>
+                </conditional>
+            </conditional>
+            <conditional name="sequence">
+                <param name="seqsrc" value="entry"/>
+                <param name="seq_text" value="SLYNTVATLYCVHQRIDV"/>
+            </conditional>
+            <output name="output">
+                <assert_contents>
+                    <has_text text="LYNTVATLY" />
+                </assert_contents>
+            </output>
+        </test>
+        <!-- test7 -->
+        <test>
+            <conditional name="prediction">
+                <param name="tool" value="bcell"/>
+                <param name="method" value="Emini"/>
+            </conditional>
+            <conditional name="sequence">
+                <param name="seqsrc" value="entry"/>
+                <param name="seq_text" value="VLSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRFKHLKTE"/>
+            </conditional>
+            <output name="output">
+                <assert_contents>
+                    <has_text text="VLSEGE" />
                 </assert_contents>
             </output>
         </test>
@@ -215,14 +386,15 @@
     <help><![CDATA[
 The IEDB is a free resource, funded by a contract from the National Institute of Allergy and Infectious Diseases. It offers easy searching of experimental data characterizing antibody and T cell epitopes studied in humans, non-human primates, and other animal species. 
 
-This tool retrieves epitope information about input peptide sequences by using the RESTful web services provided by IEDB.  
+This tool retrieves epitope binding information about input peptide sequences by using the RESTful web services provided by IEDB.  
 The webservices are described at:  http://tools.immuneepitope.org/main/tools-api/
+That page also describes how to retrieve the available HLA alleles for class of epitope binding.
 
 **INPUTS**
 
   peptide sequences from a fasta file or a column in a tabular file
 
-  HLA alleles either entered as text or on per line in a text file
+  HLA alleles either entered as text or one per line in a text file
 
 
 **OUTPUTS**
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/bcell.fa	Tue Feb 25 17:37:34 2020 -0500
@@ -0,0 +1,6 @@
+>pep1
+VLSEGEWQLVLHVWAKVEADVAGHGQDILIRLFKSHPETLEKFDRFKHLKTE
+>pep2
+AGHAHKVPRRLLKAAR
+>pep3
+ALKAADASADADGSGSGSGSGAGHAHKVPRRLLKAAR
--- a/test-data/seqs.fa	Mon Feb 17 16:04:07 2020 -0500
+++ b/test-data/seqs.fa	Tue Feb 25 17:37:34 2020 -0500
@@ -1,4 +1,4 @@
 >peptide1
-AGHAHKVPRRLLKAAR
+GHAHKVPRRLLKAAR
 >peptide2
-ALKAADASADADGSGSGSGSG
+LKAADASADADGSGSGSGSG
--- a/test-data/seqs.tsv	Mon Feb 17 16:04:07 2020 -0500
+++ b/test-data/seqs.tsv	Tue Feb 25 17:37:34 2020 -0500
@@ -1,2 +1,2 @@
-peptide1	16	AGHAHKVPRRLLKAAR
-peptide2	21	ALKAADASADADGSGSGSGSG
+peptide1	16	GHAHKVPRRLLKAAR
+peptide2	21	LKAADASADADGSGSGSGSG