| Previous changeset 2:b6ccc7dd7b02 (2015-12-04) Next changeset 4:cb56cc1d5c39 (2016-03-21) |
|
Commit message:
Updated to version 0.02.04.4 (new pal_filter script) |
|
modified:
README.rst pal_finder_wrapper.sh pal_finder_wrapper.xml test-data/illuminaPE_assembly.out test-data/illuminaPE_assembly_after_filters.out |
|
added:
pal_filter.py |
|
removed:
pal_finder_filter_and_assembly.py |
| b |
| diff -r b6ccc7dd7b02 -r e1a14ed7a9d6 README.rst --- a/README.rst Fri Dec 04 07:43:30 2015 -0500 +++ b/README.rst Wed Feb 24 08:25:17 2016 -0500 |
| b |
| @@ -21,7 +21,7 @@ The suggested location is in a ``tools/pal_finder_wrapper/`` folder. You will then need to modify the ``tools_conf.xml`` file to tell Galaxy to offer the tool -by adding the line: +by adding the line:: <tool file="pal_finder/pal_finder_wrapper.xml" /> @@ -48,7 +48,7 @@ full path if it's not on the Galaxy user's PATH (defaults to primer3_core) If you want to run the functional tests, copy the sample test files under -sample test files under Galaxy's ``test-data/`` directory. Then: +sample test files under Galaxy's ``test-data/`` directory. Then:: ./run_tests.sh -id microsat_pal_finder @@ -60,6 +60,8 @@ ========== ====================================================================== Version Changes ---------- ---------------------------------------------------------------------- +0.02.04.4 - Update to the filter script (``pal_filter.py``) which removes some + columns from the output assembly file. 0.02.04.3 - Update to the Illumina filtering script from Graeme Fox (including new option to run ``PANDASeq`` assembly/QC steps), and corresponding update to the tool; add support for input FASTQs to be a dataset |
| b |
| diff -r b6ccc7dd7b02 -r e1a14ed7a9d6 pal_filter.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pal_filter.py Wed Feb 24 08:25:17 2016 -0500 |
| [ |
| b'@@ -0,0 +1,500 @@\n+#!/usr/bin/python -tt\n+#\n+# pal_filter\n+# https://github.com/graemefox/pal_filter\n+#\n+################################################################################\n+# Graeme Fox - 15/02/2016 - graeme.fox@manchester.ac.uk\n+# Tested on 64-bit Ubuntu, with Python 2.7\n+#\n+################################################################################\n+# PROGRAM DESCRIPTION\n+#\n+# Program to pick optimum loci from the output of pal_finder_v0.02.04\n+#\n+# This program can be used to filter output from pal_finder and choose the\n+# \'optimum\' loci.\n+#\n+# For the paper referncing this workflow, see Griffiths et al.\n+# (unpublished as of 15/02/2016) (sarah.griffiths-5@postgrad.manchester.ac.uk)\n+#\n+################################################################################\n+#\n+# This program also contains a quality-check method to improve the rate of PCR\n+# success. For this QC method, paired end reads are assembled using\n+# PANDAseq so you must have PANDAseq installed.\n+#\n+# For the paper referencing this assembly-QC method see Fox et al.\n+# (unpublished as of 15/02/2016) (graeme.fox@manchester.ac.uk)\n+#\n+# For best results in PCR for marker development, I suggest enabling all the\n+# filter options AND the assembly based QC\n+#\n+################################################################################\n+# REQUIREMENTS\n+#\n+# Must have Biopython installed (www.biopython.org).\n+#\n+# If you with to perform the assembly QC step, you must have:\n+# PandaSeq (https://github.com/neufeld/pandaseq)\n+# PandaSeq must be in your $PATH / able to run from anywhere\n+################################################################################\n+# REQUIRED OPTIONS\n+#\n+# -i forward_paired_ends.fastQ\n+# -j reverse_paired_ends.fastQ\n+# -p pal_finder output - the "(microsatellites with read IDs and\n+# primer pairs)" file\n+#\n+# By default the program does nothing....\n+#\n+# NON-REQUIRED OPTIONS\n+#\n+# -assembly: turn on the pandaseq assembly QC step\n+# -primers: filter microsatellite loci to just those which\n+# have primers designed\n+#\n+# -occurrences: filter microsatellite loci to those with primers\n+# which appear only once in the dataset\n+#\n+# -rankmotifs: filter microsatellite loci to just those with perfect motifs.\n+# Rank the output by size of motif (largest first)\n+#\n+###########################################################\n+# For repeat analysis, the following extra non-required options may be useful:\n+#\n+# Since PandaSeq Assembly, and fastq -> fasta conversion are slow, do them the\n+# first time, generate the files and then skip either, or both steps with\n+# the following:\n+#\n+# -a: skip assembly step\n+# -c: skip fastq -> fasta conversion step\n+#\n+# Just make sure to keep the assembled/converted files in the correct directory\n+# with the correct filename(s)\n+###########################################################\n+#\n+# EXAMPLE USAGE:\n+#\n+# pal_filtery.py -i R1.fastq -j R2.fastq\n+# -p pal_finder_output.tabular -primers -occurrences -rankmotifs -assembly\n+#\n+###########################################################\n+import Bio, subprocess, argparse, csv, os, re, time\n+from Bio import SeqIO\n+\n+# Get values for all the required and optional arguments\n+\n+parser = argparse.ArgumentParser(description=\'pal_filter\')\n+parser.add_argument(\'-i\',\'--input1\', help=\'Forward paired-end fastq file\', \\\n+ required=True)\n+\n+parser.add_argument(\'-j\',\'--input2\', help=\'Reverse paired-end fastq file\', \\\n+ required=True)\n+\n+parser.add_argument(\'-p\',\'--pal_finder\', help=\'Output from pal_finder \', \\\n+ required=True)\n+\n+parser.add_argument(\'-assembly\',\'--assembly_QC\', help=\'Perform the PandaSeq \\\n+ based QC\', nargs=\'?\', const=1, type=int, required=False)\n+\n+parser.add_argument(\'-a\',\'--skip_assembly\', help=\'If the assembly has already \\\n+ been run, skip it with -a\', nargs=\'?\', const=1, \\\n+ type=int, required=False)\n+\n+par'..b' fasta_IDs = []\n+\n+# populate the above lists with sequence IDs\n+ for sequence in assembly_sequences:\n+ assembly_IDs.append(sequence.id)\n+ for sequence in R1fasta_sequences:\n+ fasta_IDs.append(sequence.id)\n+\n+# Index the assembly fasta file\n+ assembly_sequences_index = SeqIO.index(assembly_file,\'fasta\')\n+ R1fasta_sequences_index = SeqIO.index(R1_fasta,\'fasta\')\n+ R2fasta_sequences_index = SeqIO.index(R2_fasta,\'fasta\')\n+\n+# prepare the output file\n+ with open (outputfilename + "_pal_filter_assembly_output.txt", \'w\') \\\n+ as outputfile:\n+# write the headers for the output file\n+ outputfile.write("readPairID\\t Forward Primer\\t F Primer Position in "\n+ "Assembled Read\\t Reverse Primer\\t R Primer Position in "\n+ "Assembled Read\\t Motifs(bases)\\t Assembled Read ID\\t "\n+ "Assembled Read Sequence\\t Raw Forward Read ID\\t Raw "\n+ "Forward Read Sequence\\t Raw Reverse Read ID\\t Raw Reverse "\n+ "Read Sequence\\n")\n+\n+# cycle through parameters from the pal_finder output\n+ for x, y, z, a in zip(seqIDs, F_primers, R_primers, motif):\n+ if str(x) in assembly_IDs:\n+ # get the raw sequences ready to go into the output file\n+ assembly_seq = (assembly_sequences_index.get_raw(x).decode())\n+# fasta entries need to be converted to single line so sit nicely in the output\n+ assembly_output = assembly_seq.replace("\\n","\\t")\n+ R1_fasta_seq = (R1fasta_sequences_index.get_raw(x).decode())\n+ R1_output = R1_fasta_seq.replace("\\n","\\t",1).replace("\\n","")\n+ R2_fasta_seq = (R2fasta_sequences_index.get_raw(x).decode())\n+ R2_output = R2_fasta_seq.replace("\\n","\\t",1).replace("\\n","")\n+ assembly_no_id = \'\\n\'.join(assembly_seq.split(\'\\n\')[1:])\n+\n+# check that both primer sequences can be seen in the assembled contig\n+ if y or ReverseComplement1(y) in assembly_no_id and z or \\\n+ ReverseComplement1(z) in assembly_no_id:\n+ if y in assembly_no_id:\n+# get the positions of the primers in the assembly to predict fragment length\n+ F_position = assembly_no_id.index(y)+len(y)+1\n+ if ReverseComplement1(y) in assembly_no_id:\n+ F_position = assembly_no_id.index(ReverseComplement1(y)\\\n+ )+len(ReverseComplement1(y))+1\n+ if z in assembly_no_id:\n+ R_position = assembly_no_id.index(z)+1\n+ if ReverseComplement1(z) in assembly_no_id:\n+ R_position = assembly_no_id.index(ReverseComplement1(z)\\\n+ )+1\n+\n+# write everything out into the output file\n+ output = (str(x) + "\\t" + y + "\\t" + str(F_position) \\\n+ + "\\t" + (z) + "\\t" + str(R_position) \\\n+ + "\\t" + a + "\\t" + assembly_output \\\n+ + R1_output + "\\t" + R2_output + "\\n")\n+ outputfile.write(output)\n+ print "\\nPANDAseq quality check complete."\n+ print "Results from PANDAseq quality check (and filtering, if any" \\\n+ " any filters enabled) written to output file" \\\n+ " ending \\"_pal_filter_assembly_output.txt\\".\\n\\n"\n+\n+ print "Filtering of pal_finder results complete."\n+ print "Filtered results written to output file ending \\".filtered\\"."\n+ print "\\nFinished\\n"\n+else:\n+ if (skip_assembly == 1 or skip_conversion == 1):\n+ print "\\nERROR: You cannot supply the -a flag or the -c flag without \\\n+ also supplying the -assembly flag.\\n"\n+\n+ print "\\nProgram Finished\\n"\n' |
| b |
| diff -r b6ccc7dd7b02 -r e1a14ed7a9d6 pal_finder_filter_and_assembly.py --- a/pal_finder_filter_and_assembly.py Fri Dec 04 07:43:30 2015 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 |
| [ |
| b'@@ -1,363 +0,0 @@\n-#!/usr/bin/python -tt\n-\n-###########################################################\n-# Graeme Fox - 26/09/2015 - graeme.fox@manchester.ac.uk\n-# Tested on (L)ubuntu 15.04 only, with Python 2.7\n-###########################################################\n-# PROGRAM DESCRIPTION\n-# Program to pick optimum loci from the output of pal_finder_v0.02.04\n-# and to predict the fragment length.\n-#\n-# This program can be used to filter pal_finder output to choose the \'optimum\' loci.\n-#\n-# Additionally this program can assemble the two paired end reads,\n-# find the primers within HQ assembly, log their positions\n-# and calculate the difference to give the fragment length.\n-#\n-# For best results in your PCR, I suggest doing both.\n-#\n-###########################################################\n-# Requirements:\n-# Must have Biopython (www.biopython.org).\n-#\n-# If you with to perform the assembly QC step, you must have:\n-# PandaSeq (https://github.com/neufeld/pandaseq)\n-# PandaSeq must be in your path / able to run from anywhere\n-###########################################################\n-# Required options:\n-# -i forward_paired_ends.fastQ\n-# -j reverse_paired_ends.fastQ\n-# -p pal_finder output - the "(microsatellites with read IDs and primer pairs)" file\n-#\n-# By default it does nothing.\n-#\n-# Non-required options:\n-# -assembly: turn on the pandaseq assembly QC step\n-# -primers: filter microsatellite loci to just those which have primers designed\n-# -occurrences: filter microsatellite loci to those with primers which appear only once in the dataset\n-# -rankmotifs: filter microsatellite loci to just those with perfect motifs. Rank the output by size of motif (largest first)\n-#\n-###########################################################\n-# For repeat analysis, the following extra non-required options may be useful:\n-# PandaSeq Assembly, and fastq -> fasta conversion are slow.\n-#\n-# Do them the first time, generate the files and then skip either, or both steps with the following:\n-# -a: skip assembly step\n-# -c: skip fastq -> fasta conversion step\n-#\n-# # Just make sure to keep the files in the correct directory with the correct filename\n-###########################################################\n-#\n-# Example usage:\n-# pal_finder_filter_and_assembly.py -i R1.fastq -j R2.fastq -p pal_finder_output_(microsatellites with read IDs and primer pairs).tabular -primers -occurrences -rankmotifs -assembly\n-#\n-###########################################################\n-import Bio, subprocess, argparse, csv, os, re, time\n-from Bio import SeqIO\n-\n-# Get values for all the required and optional arguments\n-\n-parser = argparse.ArgumentParser(description=\'Frag_length_finder\')\n-parser.add_argument(\'-i\',\'--input1\', help=\'Forward paired-end fastq file\', required=True)\n-parser.add_argument(\'-j\',\'--input2\', help=\'Reverse paired-end fastq file\', required=True)\n-parser.add_argument(\'-p\',\'--pal_finder\', help=\'Output from pal_finder \', required=True)\n-parser.add_argument(\'-assembly\',\'--assembly_QC\', help=\'Perform the PandaSeq based QC\', nargs=\'?\', const=1, type=int, required=False)\n-parser.add_argument(\'-a\',\'--skip_assembly\', help=\'If the assembly has already been run, skip it with -a\', nargs=\'?\', const=1, type=int, required=False)\n-parser.add_argument(\'-c\',\'--skip_conversion\', help=\'If the fastq to fasta conversion has already been run, skip it with -c\', nargs=\'?\', const=1, type=int, required=False)\n-parser.add_argument(\'-primers\',\'--filter_by_primer_column\', help=\'Filter pal_finder output to just those loci which have primers designed\', nargs=\'?\', const=1, type=int, required=False)\n-parser.add_argument(\'-occurrences\',\'--filter_by_occurrences_column\', help=\'Filter pal_finder output to just loci with primers which only occur once in the dataset\', nargs=\'?\', const=1, type=int, required=False)\n-parser.add_argument(\'-rankmotifs\',\'--filter_and_rank_by_motif_size\', help=\'Filter pal_finder output to just loci which are a perfect repeat unit. Also'..b'will need\n- assembly_file = "Assembly_adapters_removed.fasta" # Assembled fasta file\n- R1_fasta = os.path.splitext(os.path.basename(R1_input))[0] + "_filtered.fasta" # filtered R1 reads\n- R2_fasta = os.path.splitext(os.path.basename(R2_input))[0] + "_filtered.fasta" # filtered R2 reads\n- outputfilename = os.path.splitext(os.path.basename(R1_input))[0]\n-\n-# parse the files with SeqIO\n- assembly_sequences = SeqIO.parse(assembly_file,\'fasta\')\n- R1fasta_sequences = SeqIO.parse(R1_fasta,\'fasta\')\n-\n-# create some empty lists to hold the ID tags we are interested in\n- assembly_IDs = []\n- fasta_IDs = []\n-\n-# populate the above lists with sequence IDs\n- for sequence in assembly_sequences:\n- assembly_IDs.append(sequence.id)\n- for sequence in R1fasta_sequences:\n- fasta_IDs.append(sequence.id)\n-\n-# Index the assembly fasta file\n- assembly_sequences_index = SeqIO.index(assembly_file,\'fasta\')\n- R1fasta_sequences_index = SeqIO.index(R1_fasta,\'fasta\')\n- R2fasta_sequences_index = SeqIO.index(R2_fasta,\'fasta\')\n-\n-# prepare the output file\n- with open (outputfilename + "_pal_finder_assembly_output.txt", \'w\') as outputfile:\n- outputfile.write("readPairID\\t Forward Primer\\t F Primer Position in Assembled Read\\t Reverse Primer\\t R Primer Position in Assembled Read\\t Predicted Amplicon Size (bp)\\t Motifs(bases)\\t Assembled Read ID\\t Assembled Read Sequence\\t Raw Forward Read ID\\t Raw Forward Read Sequence\\t Raw Reverse Read ID\\t Raw Reverse Read Sequence\\n")\n-\n-# cycle through parameters from the pal_finder output\n- for x, y, z, a in zip(seqIDs, F_primers, R_primers, motif):\n- if str(x) in assembly_IDs:\n- # get the raw sequences ready to go into the output file\n- assembly_seq = (assembly_sequences_index.get_raw(x).decode())\n- # fasta entries need to be converted to single line so they sit nicely in the output\n- assembly_output = assembly_seq.replace("\\n","\\t")\n- R1_fasta_seq = (R1fasta_sequences_index.get_raw(x).decode())\n- R1_output = R1_fasta_seq.replace("\\n","\\t",1).replace("\\n","")\n- #R1_output = R1_output.replace("\\n","")\n- R2_fasta_seq = (R2fasta_sequences_index.get_raw(x).decode())\n- R2_output = R2_fasta_seq.replace("\\n","\\t",1).replace("\\n","")\n- #R2_output = R2_output.replace("\\n","")\n- assembly_no_id = \'\\n\'.join(assembly_seq.split(\'\\n\')[1:])\n-\n-# check that both primer sequences can be seen in the assembled contig\n- if y or ReverseComplement1(y) in assembly_no_id and z or ReverseComplement1(z) in assembly_no_id:\n- if y in assembly_no_id:\n- # get the positions of the primers in the assembly to predict fragment length\n- F_position = assembly_no_id.index(y)+len(y)+1\n- if ReverseComplement1(y) in assembly_no_id:\n- F_position = assembly_no_id.index(ReverseComplement1(y))+len(ReverseComplement1(y))+1\n- if z in assembly_no_id:\n- R_position = assembly_no_id.index(z)+1\n- if ReverseComplement1(z) in assembly_no_id:\n- R_position = assembly_no_id.index(ReverseComplement1(z))+1\n- # calculate fragment length\n- fragment_length = R_position-F_position\n-\n-# write everything out into the output file\n- output = (str(x) + "\\t" + y + "\\t" + str(F_position) + "\\t" + (z) + "\\t" + str(R_position) + "\\t" + str(fragment_length) + "\\t" + a + "\\t" + assembly_output + R1_output + "\\t" + R2_output + "\\n")\n- outputfile.write(output)\n- print "\\nFinished\\n"\n-else:\n- if (skip_assembly == 1 or skip_conversion == 1):\n- print "\\nERROR: You cannot supply the -a flag or the -c flag without also supplying the -assembly flag.\\n"\n- print "\\nFinished\\n"\n' |
| b |
| diff -r b6ccc7dd7b02 -r e1a14ed7a9d6 pal_finder_wrapper.sh --- a/pal_finder_wrapper.sh Fri Dec 04 07:43:30 2015 -0500 +++ b/pal_finder_wrapper.sh Wed Feb 24 08:25:17 2016 -0500 |
| [ |
| @@ -58,7 +58,7 @@ : ${PRIMER3_CORE_EXE:=primer3_core} # # Filter script is in the same directory as this script -PALFINDER_FILTER=$(dirname $0)/pal_finder_filter_and_assembly.py +PALFINDER_FILTER=$(dirname $0)/pal_filter.py if [ ! -f $PALFINDER_FILTER ] ; then echo No $PALFINDER_FILTER script >&2 exit 1 @@ -115,7 +115,7 @@ if [ $# -lt 2 ] ; then echo "Usage: $0 FASTQ_R1 FASTQ_R2 MICROSAT_SUMMARY PAL_SUMMARY [OPTIONS]" echo " $0 --454 FASTA MICROSAT_SUMMARY PAL_SUMMARY [OPTIONS]" - exit + exits fi if [ "$1" == "--454" ] ; then PLATFORM="454" @@ -357,9 +357,12 @@ /bin/mv PAL_summary.filtered $FILTERED_MICROSATS fi if [ ! -z "$OUTPUT_ASSEMBLY" ] ; then - assembly=${fastq_r1%.*}_pal_finder_assembly_output.txt + assembly=${fastq_r1%.*}_pal_filter_assembly_output.txt if [ -f "$assembly" ] ; then /bin/mv $assembly "$OUTPUT_ASSEMBLY" + else + echo ERROR no assembly output found >&2 + exit 1 fi fi if [ ! -z "$OUTPUT_CONFIG_FILE" ] && [ -f config.txt ] ; then |
| b |
| diff -r b6ccc7dd7b02 -r e1a14ed7a9d6 pal_finder_wrapper.xml --- a/pal_finder_wrapper.xml Fri Dec 04 07:43:30 2015 -0500 +++ b/pal_finder_wrapper.xml Wed Feb 24 08:25:17 2016 -0500 |
| b |
| @@ -1,4 +1,4 @@ -<tool id="microsat_pal_finder" name="pal_finder" version="0.02.04.3"> +<tool id="microsat_pal_finder" name="pal_finder" version="0.02.04.4"> <description>Find microsatellite repeat elements from sequencing reads and design PCR primers to amplify them</description> <requirements> <requirement type="package" version="5.16.3">perl</requirement> |
| b |
| diff -r b6ccc7dd7b02 -r e1a14ed7a9d6 test-data/illuminaPE_assembly.out --- a/test-data/illuminaPE_assembly.out Fri Dec 04 07:43:30 2015 -0500 +++ b/test-data/illuminaPE_assembly.out Wed Feb 24 08:25:17 2016 -0500 |
| b |
| @@ -1,2 +1,2 @@ -readPairID Forward Primer F Primer Position in Assembled Read Reverse Primer R Primer Position in Assembled Read Predicted Amplicon Size (bp) Motifs(bases) Assembled Read ID Assembled Read Sequence Raw Forward Read ID Raw Forward Read Sequence Raw Reverse Read ID Raw Reverse Read Sequence -ILLUMINA-545855:49:FC61RLR:2:1:19063:1614 1 1 0 AT(14) AT(14) AT(14) AT(14) >ILLUMINA-545855:49:FC61RLR:2:1:19063:1614 TATATATATATATACACATATATATATATATTTTTTACATTATTTCACTTCGCCCAAACTAGAGAGTCTAACAAAGTACAACCCAGCATATTAAAGTTCATCTCAGTTTTGTTCTGAAATGAGAAAAAAATATATATATATATGTTTATATATATATATA >ILLUMINA-545855:49:FC61RLR:2:1:19063:1614 TATATATATATATACACATATATATATATATTTTTTACATTATTTCACTTCGCCCAAACTAGAGAGTCTAACAAAGTACAACCCAGCATATTAAAGTTCATCTCAGTTTTGTTCTG >ILLUMINA-545855:49:FC61RLR:2:1:19063:1614 TATATATATATATAAACATATATATATATATTTTTTTCTCATTTCAGAACAAAAGTGAGATGAACTTTAATATGGTGGGGTGTATTTTGAGAGACTCTCTAGTTTGGGAGGAGTGA +readPairID Forward Primer F Primer Position in Assembled Read Reverse Primer R Primer Position in Assembled Read Motifs(bases) Assembled Read ID Assembled Read Sequence Raw Forward Read ID Raw Forward Read Sequence Raw Reverse Read ID Raw Reverse Read Sequence +ILLUMINA-545855:49:FC61RLR:2:1:19063:1614 1 1 AT(14) AT(14) AT(14) AT(14) >ILLUMINA-545855:49:FC61RLR:2:1:19063:1614 TATATATATATATACACATATATATATATATTTTTTACATTATTTCACTTCGCCCAAACTAGAGAGTCTAACAAAGTACAACCCAGCATATTAAAGTTCATCTCAGTTTTGTTCTGAAATGAGAAAAAAATATATATATATATGTTTATATATATATATA >ILLUMINA-545855:49:FC61RLR:2:1:19063:1614 TATATATATATATACACATATATATATATATTTTTTACATTATTTCACTTCGCCCAAACTAGAGAGTCTAACAAAGTACAACCCAGCATATTAAAGTTCATCTCAGTTTTGTTCTG >ILLUMINA-545855:49:FC61RLR:2:1:19063:1614 TATATATATATATAAACATATATATATATATTTTTTTCTCATTTCAGAACAAAAGTGAGATGAACTTTAATATGGTGGGGTGTATTTTGAGAGACTCTCTAGTTTGGGAGGAGTGA |
| b |
| diff -r b6ccc7dd7b02 -r e1a14ed7a9d6 test-data/illuminaPE_assembly_after_filters.out --- a/test-data/illuminaPE_assembly_after_filters.out Fri Dec 04 07:43:30 2015 -0500 +++ b/test-data/illuminaPE_assembly_after_filters.out Wed Feb 24 08:25:17 2016 -0500 |
| b |
| @@ -1,1 +1,1 @@ -readPairID Forward Primer F Primer Position in Assembled Read Reverse Primer R Primer Position in Assembled Read Predicted Amplicon Size (bp) Motifs(bases) Assembled Read ID Assembled Read Sequence Raw Forward Read ID Raw Forward Read Sequence Raw Reverse Read ID Raw Reverse Read Sequence +readPairID Forward Primer F Primer Position in Assembled Read Reverse Primer R Primer Position in Assembled Read Motifs(bases) Assembled Read ID Assembled Read Sequence Raw Forward Read ID Raw Forward Read Sequence Raw Reverse Read ID Raw Reverse Read Sequence |