<title>Background</title> <p>Generation of meaningful multiple sequence alignments (MSAs) of biological sequences is a well-studied NP-complete problem, which has significant implications for a wide spectrum of applications [##UREF##0##1##,##UREF##1##2##]. In general, the challenge is aligning <italic>N </italic>sequences of varying lengths by inserting gaps in the sequences so that in the end all sequences have the same length. Of particular interest to computational biology are DNA/RNA sequences and amino acid sequences, which are comprised of nucleotide and amino acid residues, respectively.</p> <p>MSAs are generally used in studying phylogeny of organisms, structure prediction, and identifying segments of interest among many other applications in computational biology [##REF##16679011##3##].</p> <p>Given a scoring scheme to evaluate the fitness of an MSA, calculating the best MSA is an NP-complete problem [##UREF##0##1##]. Variances in scoring schemes, need for expert-hand analysis in most applications, and many-to-one mapping governing elements-to-functionality (codon mapping and function) make MSA a more challenging problem when considered from a biological context as well [##REF##16761361##4##].</p> <p>Generally, three approaches are used to automate the generation of MSAs. The first offers a brute-force method of multidimensional dynamic programming [##REF##2734293##5##], which may find a good alignment but is generally computationally expensive and, therefore, unusable beyond a small <italic>N</italic>. Another method uses a probabilistic approach where Hidden Markov Models (HMMs) are approximated from unaligned sequences. The final method, progressive alignment, is possibly the most commonly used approach when obtaining MSAs [##UREF##2##6##].</p> <p>A progressive alignment algorithm begins with an optimal alignment of two of the <italic>N </italic>sequences. Then, each of the remaining <italic>N </italic>sequences are aligned to the current MSA, either via a consensus sequence or one of the sequences already in the MSA. Variations on the progressive alignment method include PRALINE [##REF##15980472##7##], ProbCons [##REF##15687296##8##], MAFFT [##REF##12136088##9##,##REF##15661851##10##], MUSCLE [##REF##15034147##11##,##REF##15318951##12##], T-Coffee [##REF##10964570##13##], Kalign [##REF##16343337##14##], PSalign [##REF##16597242##15##], and the most commonly used CLUSTALW [##REF##7984417##16##]. In most cases, the algorithms attempt to generate accurate alignments while minimizing computational time or space. Advances in DNA sequencing technology with next generation sequencers such as ABI's SOLID and Roche's GC FLX provide vast amount of data in need of multiple alignment. In case of large sequencing projects, high number of fragments that lead to longer contigs to be combined are generated with much less time and money [##REF##17534434##17##]. In addition, as more organisms' genomes are sequenced, approaches that require MSA of the same gene in different organisms now find a more populated data set. In both cases computational time in MSA is becoming an important issue that needs to be addressed.</p> <p>This work presents GramAlign, a progressive alignment method with improvements in computational time. In particular, the natural grammar inherent in biological sequences is estimated to determine the order in which sequences are progressively merged into the ongoing MSA. The following sections describe the algorithm and present initial results as compared with other alignment algorithms.</p>
<title>Methods</title> <p>A general overview of the GramAlign algorithm is depicted in Figure ##FIG##0##1##. The set of sequences to be aligned, <italic>S</italic>, are regarded as input to the algorithm with <italic>S </italic>= {<italic>s</italic><sub>1</sub>,...,<italic>s</italic><sub><italic>N</italic></sub>}, where <italic>s</italic><sub><italic>i </italic></sub>is the <italic>i</italic><sup><italic>th </italic></sup>sequence and <italic>i </italic>∈ {1,...,<italic>N</italic>}.</p> <title>Distance Estimation</title> <p>The first step in the procedure involves the formation of an estimate of the distance between each sequence <italic>s</italic><sub><italic>m </italic></sub>and all other sequences <italic>s</italic><sub><italic>n </italic></sub>∀ <italic>n </italic>≠ <italic>m</italic>. The distance used in GramAlign is based on the natural grammar inherent to all information-containing sequences. Unfortunately, the complete grammar for biological sequences is unknown, and so cannot be used when comparing sequences. However, we do know that biological sequences have structures which correspond to functions. This in turn implies that biological sequences which correspond to proteins with similar functions will have similarities in their structure. Therefore, we use a grammar based on Lempel-Ziv (LZ) compression [##UREF##3##18##,##UREF##4##19##] used in [##REF##14594718##20##] for phylogeny reconstruction. This measure uses the fact that sequences with similar biological properties share commonalities in their sequence structure. It is also known that biological sequences contain repeats, especially in the regulatory regions [##REF##10745989##21##]. When comparing sequences with functional similarity, non-uniform distribution of repeats among the sequences poses a problem to assess sequence similarity. As shown below, the proposed distance naturally handles such cases, which are difficult to be accounted for by alignment or sequence edit based measures.</p> <p>An overview of the grammar-based distance calculation is shown in Figure ##FIG##1##2## where a dictionary of grammar rules for each sequence is calculated. Initially, the dictionary  = ∅ is empty, a fragment <italic>f</italic><sup>1 </sup>= <italic>s</italic><sub><italic>m</italic></sub>(1) is set to the first residue of the corresponding sequence, and only the first element <italic>s</italic><sub><italic>m</italic></sub>(1) is visible to the algorithm. At the <italic>k</italic>th iteration of the procedure, the <italic>k</italic>th residue is appended to the <italic>k </italic>- 1 fragment and the visible sequence is checked. If <italic>f</italic><sup><italic>k </italic></sup>∉ <italic>s</italic><sub><italic>m</italic></sub>(1,...,<italic>k </italic>- 1) then <italic>f</italic><sup><italic>k </italic></sup>is considered a new rule, and so added to the dictionary , and the fragment is reset, <italic>f</italic><sup><italic>k </italic></sup>= ∅. However, if <italic>f</italic><sup><italic>k </italic></sup>∈ <italic>s</italic><sub><italic>m </italic></sub>(1,...,<italic>k </italic>- 1), then the current dictionary contains enough rules to produce the current fragment, i.e., . In either case, the iteration completes by appending the <italic>k</italic>th residue to the visible sequence. This procedure continues until the visible sequence is equal to the entire sequence, at which time the size of the dictionary is recorded along the diagonal of the grammar elements matrix, <italic>E</italic><sub><italic>m, m </italic></sub>= |<italic>G</italic><sub><italic>m</italic></sub>|. As will be shown, calculating the distance between sequences requires only the number of entries in the dictionary.</p> <p>In the next step shown in Figure ##FIG##1##2##, each sequence is compared with all other sequences. In particular, consider the process of comparing sequences <italic>m </italic>and <italic>n</italic>. Initially, the dictionary  = <italic>G</italic><sub><italic>m </italic></sub>is set to that of sequence <italic>m</italic>, a fragment <italic>f</italic><sup>1 </sup>= <italic>s</italic><sub><italic>n</italic></sub>(1) is set to the first residue of the <italic>n</italic>th sequence, and the visible sequence is all of <italic>s</italic><sub><italic>m</italic></sub>. The algorithm operates as described previously, resulting in a new dictionary size <italic>E</italic><sub><italic>m, n </italic></sub>= |<italic>G</italic><sub><italic>m,n</italic></sub>|. When complete, more grammatically-similar sequences will have a new dictionary size with fewer entries as compared to sequences that are less grammatically-similar. Therefore, the size of the new dictionary <italic>E</italic><sub><italic>m</italic>,<italic>n </italic></sub>will be close to the size of the original dictionary <italic>E</italic><sub><italic>m,m</italic></sub>.</p> <p>In the final step, the distance between the sequences is estimated using the dictionary sizes. Five different distance measures were suggested in [##REF##14594718##20##]. This work used the distance measure</p> <p></p> <p>where <italic>m</italic>, <italic>n </italic>∈ {1,...,<italic>N</italic>} are indices of two sequences being compared. This particular metric accounts for differences in sequence lengths, and normalizes accordingly. Thus, the final distance matrix <italic>D </italic>is composed of grammar-based distance entries given by (1). Smaller entries in <italic>D </italic>indicate a stronger similarity, at least in terms of the LZ-based grammar estimate. Intuitively, sequences with a similar grammar should be pairwise aligned with each other in order for progressive combining into an MSA.</p> <p>To further improve the execution time, <italic>D </italic>is only partially calculated as follows. An initial sequence is selected and compared with all other sequences. The resulting distances are split evenly into two groups based on <italic>d</italic>, one containing the smallest distances, and the other containing the largest distances. The process is repeated recursively on each group until the number of sequences in a group is two. The benefit is that only <italic>N </italic>log(<italic>N</italic>) distances need to be calculated. The validity of only calculating these sets of distances stems from the transitivity of the LZ grammars being inferred. That is, if the grammar-based distances <italic>d</italic><sub><italic>i, j </italic></sub>and <italic>d</italic><sub><italic>j, k </italic></sub>are small, it is likely that <italic>d</italic><sub><italic>i, k </italic></sub>is also small. By recursively dividing groups of extreme distances, only those distances which would likely be used in the spanning-tree creation process will actually be calculated.</p> <title>Sequence Alphabet</title> <p>The distance between sequences <italic>m </italic>and <italic>n </italic>as determined by (1) is based on how many additional rules need to be added to each grammar in order to generate both <italic>s</italic><sub><italic>m </italic></sub>and <italic>s</italic><sub><italic>n</italic></sub>. Because the real grammars are unknown, <italic>G</italic><sub><italic>m </italic></sub>and <italic>G</italic><sub><italic>n </italic></sub>are approximated by scanning the only observations available (i.e., <italic>s</italic><sub><italic>m </italic></sub>and <italic>s</italic><sub><italic>n</italic></sub>). The grammar approximation improves as the length of the observed sequences increases. And so, the distance calculations are a function of sequence lengths, becoming more accurate as the sequences increase in length. In practice, this calculation works well for DNA sequences, even of shorter lengths, because the approximated grammar of a DNA sequence can only contain rules involving words composed of combinations of elements from the alphabet {'A','C','G','T'}. This small alphabet allows for a rapid generation of a reasonable grammar since there are a relatively small number of permutations of letters. From a grammar perspective, amino acid sequences are generally much more difficult to process correctly using (1). The reason being the alphabet contains 23 letters, where each element is not equally different from all other elements. Due to the relatively large alphabet size, much longer sequences are necessary to generate a reasonable grammar approximation. Thus, the accuracy of distances calculated for sets of short amino acid sequences are diminished. Additionally, consider the substitution scores of 'L' and 'M' as taken from the GONNET250 and BLOSUM62 substitution matrices in Figure ##FIG##2##3##. Notice in (a) and (c), that 'L' receives a relatively high positive value when aligned with any of {'I','L','M','V'}. Similarly, in (b) and (d), 'M' receives a relatively high positive value when aligned with any of the same set. Additionally, both 'L' and 'M' generally receive high negative values when compared to letters other than {'I','L','M','V'}. When taking this type of scoring into account, the elements 'L' and 'M' could be considered the same letter in a grammatical sense.</p> <p>Thus, GramAlign offers the option to use a "Merged Amino Acid Alphabet" when calculating the distance matrix. The merged alphabet contains 11 elements corresponding to the 23 amino acid letters grouped into the sets {'A','S','T','X'}, {'B','D','N'}, {'C'}, {'E','K','Q','R','Z'}, {'F'}, {'G'}, {'H'}, {'I','L','M','V'}, {'P'}, {'W'}, and {'Y'}. These groupings were determined by considering all 23 rows of the BLOSUM45, BLOSUM62, BLOSUM80 and GONNET250 substitution matrices, and only grouping elements that had a strong similarity across the entire row in all four matrices. The merged alphabet has the benefit of containing fewer elements allowing for more accurate distance estimates based upon shorter observed sequences. Also, the resultant merged-alphabet substitution matrices are more consistent in that a merged-letter score is high only when compared to itself. In practice, the average alignment scores increased when aligning the same data sets using the merged alphabet within the distance calculation, as compared to using the actual alphabet (results not shown). In either case, once the distances have been calculated, a tree based on these distances is used to determine which sequences should be pairwise aligned.</p> <title>Tree Construction</title> <p>The next step in the algorithm consists of constructing a minimal spanning tree <italic>T </italic>based on the distance matrix <italic>D</italic>. In particular, consider a completely connected graph of <italic>N </italic>vertices and  edges, where the weight of an edge between vertices <italic>i </italic>and <italic>j </italic>is given by the (<italic>i, j</italic>)th element of the distance matrix, <italic>D</italic><sub><italic>i, j</italic></sub>. This work uses Prim's Algorithm [##UREF##5##22##] to determine a minimal spanning tree <italic>T </italic>which may be used as a guide in determining the order for progressively aligning the set of sequences <italic>S</italic>.</p> <title>Align Sequences</title> <p>The minimal spanning tree <italic>T </italic>along with the set of sequences <italic>S</italic>, are processed by the "Align Sequences" block in Figure ##FIG##0##1##. This block is presented in more detail in Figure ##FIG##3##4##. The first two sequences from <italic>S </italic>to be aligned are given by <italic>T </italic>as the root sequence of <italic>T </italic>and the nearest sequence in terms of the LZ grammar distance. At the conclusion of the pairwise alignment process, the resulting alignment is stored in an ensemble of sequences.</p> <p>In the following we describe the pairwise alignment procedure, the scoring system and the method for progressive alignment.</p> <title>Dynamic Programming</title> <p>At the core of most progressive MSA algorithms is some method for performing pairwise alignments between two sequences. This work uses a version of the [##REF##5420325##23##] dynamic programming algorithm with affine gap scores as discussed in [##UREF##1##2##] to generate each pairwise alignment.</p> <title>Scoring System</title> <p>A significant ambiguity regarding the dynamic programming procedure is the scoring function used when comparing two elements, or when comparing an element with a gap.</p> <p>Typically, the pairwise scoring function <italic>c</italic>() is simply a matrix of values, where each column and row represent one element in the alphabet. In this way, each cell of the matrix corresponds to some measure representing the likelihood that two sequence elements should be aligned with each other. The most well-known amino acid scoring matrices are the Percent Accepted Mutation (PAM) [##UREF##6##24##], BLOck SUbstitution Matrix (BLOSUM) [##REF##1438297##25##] and GONNET [##REF##1604319##26##]. GramAlign defaults to the GONNET250 substitution matrix for the scoring function <italic>c</italic>(), as other progressive alignment algorithms generally use it as the default choice (e.g., [##REF##16343337##14##] and [##REF##7984417##16##]).</p> <p>Determining the best gap-open and gap-extension penalties is a challenging problem, made more difficult by introducing two different penalties to account for the beginning and ending tail gaps of alignments. The default gap penalties used by GramAlign have been adjusted to perform well based on the alignment sets presented in the results section.</p> <title>Progressive Alignment</title> <p>The ensemble is implemented as a doubly-linked list, where each node of the list represents a single column of the alignment. Each node of the ensemble contains an array of letters corresponding to the respective column alignment, a tally of gaps in the column, a weighted combination of substitution scores, and two gap penalties. Once the initial ensemble <italic>A</italic><sub>(0,1) </sub>is constructed between the first two entries in <italic>T</italic>, the remaining sequences need to be added to the ensemble in the order defined by <italic>T</italic>. This is accomplished by checking <italic>T </italic>for the next sequence not already in the ensemble, call it sequence <italic>s</italic><sub><italic>j </italic></sub>where <italic>j </italic>corresponds to the order in which the sequence was added to <italic>T</italic>; that is, <italic>j </italic>is the priority of the sequence. To progressively add <italic>s</italic><sub><italic>j </italic></sub>to the alignment, a pairwise alignment between the ensemble <italic>A</italic><sub>(0,...,<italic>j</italic>-1) </sub>and <italic>s</italic><sub><italic>j </italic></sub>is created via the afore mentioned dynamic programming algorithm. While the algorithm used is a pairwise alignment algorithm the distance calculated at each step of the pairwise alignment is an average of the distances between the particular position being aligned in the new sequence and the corresponding amino acides or bases in the ensemble at that node. The new pairwise alignment is merged into the ongoing ensemble based on the trace-back. The process continues until all sequences have been added to the ensemble of sequences. When sequence <italic>s</italic><sub><italic>j </italic></sub>is added to the current ensemble <italic>A</italic><sub>(0,...,<italic>j</italic>-1)</sub>, each node is updated to reflect the new column element.</p> <title>Gap Adjustment</title> <p>Once all <italic>N </italic>sequences have been progressively aligned, the final post-processing block in Figure ##FIG##0##1##, "Adjust MSA Gaps", is used to cluster gaps together. The adjustment is further detailed in Figure ##FIG##4##5##, where the ensemble <italic>A </italic>is scanned so a histogram <italic>H </italic>of gaps-per-column is generated.</p> <p>The histogram <italic>H </italic>is scanned using an equidistant, user-adjustable sliding window about each column. For each column, when the number of gaps is greater than a user-adjustable threshold percentage of gaps-per-column, the following steps are taken. For each row in the column under consideration:</p> <p>1. If the current row has a gap, move to the next row;</p> <p>2. Otherwise, scan the current row of the neighboring columns within the window, beginning with the nearest columns and work outward;</p> <p>3. If a neighboring column has a gap in the current row and the neighboring column has fewer total gaps than the center column, shift the gap from the neighboring column into the column under consideration.</p> <p>As an illustration, consider a portion of the ensemble</p> <p></p> <p>where <italic>x</italic><sub><italic>m, n </italic></sub>represents any element other than a gap in column <italic>n </italic>of sequence <italic>m</italic>, and -<sub><italic>m, n </italic></sub>represents a gap in column <italic>n </italic>of sequence <italic>m</italic>. And so, the gap histogram for this section of ensemble is <italic>H </italic>= {...,1, 2, 3, 4, 0,...}. Assuming the gap threshold is 0.4, then only columns with more than two gaps will be considered for adjustment. In the example, <italic>H </italic>is scanned until column <italic>i </italic>is identified as having three gaps. Following the procedure, each row in column <italic>i </italic>is checked until a non-gap entry is found. In the example, the first non-gap entry <italic>x</italic><sub>4, <italic>i </italic></sub>is in row four. Assuming the gap window is 2, elements in the fourth row of the neighboring columns are checked for gap entries. In particular, column (<italic>i </italic>+ 1) is checked first, with a gap entry -<sub>4, <italic>i</italic>+1</sub>. However, no shift occurs because a quick check of <italic>H </italic>shows that column (<italic>i </italic>+ 1) has more gaps than column <italic>i</italic>. Continuing the scan, columns (<italic>i </italic>- 1) and (<italic>i </italic>+ 2) are checked before another gap is found in column (<italic>i </italic>- 2). In this case, <italic>H </italic>indicates column (<italic>i </italic>- 2) has fewer gaps compared to column <italic>i</italic>, and so a blind shift of entries between (<italic>i </italic>- 2) and <italic>i </italic>occurs, resulting in the ensemble</p> <p></p> <p>where original indices are kept to depict which entries are shifted into which locations.</p> <p>The result is a blind movement of sparse gaps into dense regions of gaps. Numeric simulations have shown this post-processing stage does not affect alignment scoring based upon the method used in the Results and Discussion section (results not shown). And so, the user-defined parameters are set to a threshold of 1.0 and a window of 0 columns by default thereby disabling the gap adjustment block. Should it be known there are conserved regions of gaps, the user may decide to enable this process to encourage gap grouping.</p> <title>Algorithm Complexity</title> <p>The algorithm complexity of GramAlign may be broken into five pieces, beginning with the generation of each sequence grammar dictionary, <italic>G</italic><sub><italic>i </italic></sub>for <italic>i </italic>∈ {1,...,<italic>N</italic>}, where <italic>N </italic>is the number of sequences. Suppose the average sequence length is <italic>L</italic>, then each <italic>G</italic><sub><italic>i </italic></sub>results in complexity (<italic>L</italic>), so all dictionaries are generated with complexity (<italic>LN</italic>). Next, the distance matrix <italic>D </italic>is formed by recursively extending a grammar by all other sequences within it's neighborhood, each of which results in complexity (<italic>L</italic>), then splitting the neighborhood into two halves, resulting in a complexity (<italic>LN </italic>log(<italic>N</italic>)). The spanning tree <italic>T </italic>is constructed by searching over <italic>D </italic>with a complexity of (<italic>N</italic><sup>2</sup>). The tree is used as a map in determining the order in which to perform <italic>N </italic>- 1 pairwise alignments, each requiring a complexity of (<italic>L</italic><sup>2 </sup>+ <italic>L</italic>). Thus, the progressive alignment process takes (<italic>L</italic><sup>2</sup><italic>N</italic>). The alignment ensemble is scanned and has gaps shifted in (<italic>LN</italic>) time. Thus, the entire time complexity for GramAlign is (<italic>LN </italic>+ <italic>LN </italic>log(<italic>N</italic>) + <italic>N</italic><sup>2 </sup>+ <italic>L</italic><sup>2</sup><italic>N </italic>+ <italic>LN</italic>), which simplifies to (<italic>N</italic><sup>2 </sup>+ <italic>L</italic><sup>2</sup><italic>N</italic>).</p>
<title>Results and Discussion</title> <p>In this section, example alignments are used to study the possible advantages of GramAlign. All results were generated by compiling and executing the respective MSA programs on the same computer; specifically, an Apple iBook with a PowerPC G4 operating at 1.2 GHz with 1.25 Gb system memory and 512 Kb L2 cache. Two sets of experiments were conducted. The first set of experiments were conducted using the unaligned FASTA files from the BAliBASE 3.0 [##REF##10068696##27##] data-set, a well-accepted benchmark database containing example amino acid sequences. The resulting aligned FASTA files from each algorithm were scored using bali score, a program provided with the BAliBASE distribution that generates a Sum-of-Pairs (SP) score and a Total-Column (TC) score based on predetermined reference alignments. The size of the sequences in the BAliBASE distribution are relatively small and, therefore, not very useful in demonstrating the advantages to be obtained using a fast algorithm. The second set of experiments were conducted using sequences generated by Rose version 1.3 to demonstrate algorithms' capabilities on large data sets containing either long or numerous sequences. Rose is a software tool that implements a probabilistic model of sequence evolution, so that a user is able to generate families of related sequences from a common ancestor sequence via insertion, deletion and substitution [##REF##9545448##28##]. Rose allows for many parameter adjustments including rate of mutation, desired average final sequence length and number of desired sequences. The tool outputs the unaligned sequences, as well as the real alignment based on how mutations occur, and an evolutionary tree. The set of sequences generated by Rose were based on the default seed file provided with the Rose software distribution, where the seed file is the method used to input parameters to Rose.</p> <p>Note the use of simulated data here is to demonstrate the speed advantage of GramAlign, while maintaining a similar qualitative score. The default values were used to generate the data and the algorithms were not tuned to the data. The use of simulated data may actually provide a biased advantage in quality score to any given alignment program, depending on how the simulated data is generated. A wider breadth of simulated data, such as was done in [##REF##17062146##29##], would provide a better assessment of overall alignment quality.</p> <title>BAliBASE Experiments</title> <p>Alignment files in the BAliBASE database are separated into five categories (RV1x through RV50), each exhibiting different classes of alignment issues (e.g., one sequence might be significantly longer than the other sequences in a file). The first class is further divided into two subcategories labeled RV11 and RV12. The results presented in Table ##TAB##0##1## and Table ##TAB##1##2## respectively detail the average SP and TC scores over each category as aligned by GramAlign version 1.14 (see Additional file ##SUPPL##0##1##), ClustalW version 1.83, T-Coffee version 4.45, PSAlign using ProbCons as the tree generation (no version given, archive created on 3/2/2006), Kalign version 1.04, MAFFT version 5.861, and MUSCLE version 3.6. Additionally, a fast version was tested for ClustalW, MAFFT, MUSCLE and MAFFT version 6.240. In particular, the command line options used were clustalw -quicktree, mafft --retree 1, muscle -maxiters 1 -diags -sv -distance1 kbit20_3 and mafft --retree 1 --parttree --partsize 50 to incorporate high-speed progressive options. In all cases the default parameters were used for each program. In general, there are no significant differences in the performance of GramAlign and other algorithms as far as the SP and TC scores are concerned. As may be seen, GramAlign provides similar alignments in terms of the quality determined via the scoring method used.</p> <p>Presented in Table ##TAB##2##3## are the execution times necessary to generate the entire data presented in Table ##TAB##0##1## and Table ##TAB##1##2##. GramAlign finishes in approximately 0.4% of the time needed by PSAlign, which generated the highest scoring alignments in five out of the six BAliBASE categories as far as SP scores are concerned. PSAlign's average SP and TC score on the other hand were 9.4 and 17.5% better than GramAlign's scores, which was approximately 223 times faster. Out of the four approaches MAFFT, MAFFT v6, MAFFT (fast), MUSCLE (fast), which were 17.1, 49.9, 54.0, and 55.7% faster than GramAlign, respectively, only MAFFT had a 2% better average SP score than GramAlign. All other average SP and TC scores were equivalent or worse than that of GramAlign. Further, the GramAlign alignments scored equal-to or greater-than 56.9, 59.6, 60.8, and 71.1% of the trials based on TC score, compared to MAFFT, MAFFT v6, MAFFT (fast), and MUSCLE (fast) (results not shown). GramAlign finishes in 33% of the time required by ClustalW using -quicktree, and only 8% needed by ClustalW, possibly the most widely used MSA program.</p> <title>Experiments with Large Data Sets</title> <title>Long Sequence Experiments</title> <p>In order to compare the performance of MSA algorithms on long data sets, two sets of seven FASTA files each containing ten sequences were generated using Rose version 1.3. The first set of seven FASTA files contains protein sequences and the second set contains DNA sequences. In both sets, the first file contains sequences with an average length of 5,000 residues, with each file increasing the average sequence length by 5,000 residues. Thus, the seventh file contains ten sequences with an average sequence length of 35,000 residues.</p> <p>Figures ##FIG##5##6## and ##FIG##6##7## depict the execution time required for the fastest algorithms to align the seven large protein and DNA sequence sets, respectively. As the average length of sequences increases, the difference in time required by GramAlign compared to the other algorithms also increases. In particular, at an average sequence length of 35,000 residues GramAlign completes the alignments in 3,363 and 3,092 seconds, while the nearest algorithm (MAFFT in fast-mode) requires 10,362 and 6,981 seconds. That is, GramAlign finishes in 32% and 44% of the time required by the next fastest algorithm.</p> <p>MUSCLE in fast mode encountered a segmentation fault during the Root Alignment step while running on the longest test sequences, and so the execution time is not included in Figures ##FIG##5##6## and ##FIG##6##7##.</p> <title>Numerous Sequence Experiments</title> <p>In order to compare the performance of MSA algorithms on data sets with many sequences, two sets of seven FASTA files each containing sequences with an average length of 100 residues were generated using Rose version 1.3. The first set of seven FASTA files contains protein sequences and the second set contains DNA sequences. In both sets, the first file contains 100 sequences, with each file increasing the number of sequences up to the seventh file, which contains 10,000 sequences.</p> <p>As shown in [##REF##17118958##30##], the authors of MAFFT added a new heuristic method for generating a spanning tree referred to as "PartTree". The increase in performance is dramatic and intended for data sets involving many sequences. Thus, for this set of experiments, MAFFT version 6.240 was added with the command line mafft --retree 1 --parttree --partsize 50, which matches the fastest algorithm presented in [##REF##17118958##30##]. Figures ##FIG##7##8## and ##FIG##8##9## depict the execution time required for the fastest algorithms to align the seven large protein and DNA sequence sets, respectively. As the number of sequences increases, the difference in time required by GramAlign and MAFFT v6 compared to the other algorithms also increases. In particular, on the sets containing 10,000 protein and DNA sequences GramAlign completes the alignments in 162 and 68 seconds and MAFFT v6 completes the alignments in 119 and 71 seconds, while the next closest algorithm, MUSCLE in fast-mode, requires 621 and 456 seconds. That is, GramAlign finishes in 26% and 15% of the time required by the next fastest algorithm other than MAFFT v6.</p> <p>The results imply the promising viability of the proposed algorithm, especially when aligning either long or numerous sequences such as in whole-genome applications. Further, better alignment scores may be achieved with little change in execution time via the user-alterable parameters.</p>
<title>Results and Discussion</title> <p>In this section, example alignments are used to study the possible advantages of GramAlign. All results were generated by compiling and executing the respective MSA programs on the same computer; specifically, an Apple iBook with a PowerPC G4 operating at 1.2 GHz with 1.25 Gb system memory and 512 Kb L2 cache. Two sets of experiments were conducted. The first set of experiments were conducted using the unaligned FASTA files from the BAliBASE 3.0 [##REF##10068696##27##] data-set, a well-accepted benchmark database containing example amino acid sequences. The resulting aligned FASTA files from each algorithm were scored using bali score, a program provided with the BAliBASE distribution that generates a Sum-of-Pairs (SP) score and a Total-Column (TC) score based on predetermined reference alignments. The size of the sequences in the BAliBASE distribution are relatively small and, therefore, not very useful in demonstrating the advantages to be obtained using a fast algorithm. The second set of experiments were conducted using sequences generated by Rose version 1.3 to demonstrate algorithms' capabilities on large data sets containing either long or numerous sequences. Rose is a software tool that implements a probabilistic model of sequence evolution, so that a user is able to generate families of related sequences from a common ancestor sequence via insertion, deletion and substitution [##REF##9545448##28##]. Rose allows for many parameter adjustments including rate of mutation, desired average final sequence length and number of desired sequences. The tool outputs the unaligned sequences, as well as the real alignment based on how mutations occur, and an evolutionary tree. The set of sequences generated by Rose were based on the default seed file provided with the Rose software distribution, where the seed file is the method used to input parameters to Rose.</p> <p>Note the use of simulated data here is to demonstrate the speed advantage of GramAlign, while maintaining a similar qualitative score. The default values were used to generate the data and the algorithms were not tuned to the data. The use of simulated data may actually provide a biased advantage in quality score to any given alignment program, depending on how the simulated data is generated. A wider breadth of simulated data, such as was done in [##REF##17062146##29##], would provide a better assessment of overall alignment quality.</p> <title>BAliBASE Experiments</title> <p>Alignment files in the BAliBASE database are separated into five categories (RV1x through RV50), each exhibiting different classes of alignment issues (e.g., one sequence might be significantly longer than the other sequences in a file). The first class is further divided into two subcategories labeled RV11 and RV12. The results presented in Table ##TAB##0##1## and Table ##TAB##1##2## respectively detail the average SP and TC scores over each category as aligned by GramAlign version 1.14 (see Additional file ##SUPPL##0##1##), ClustalW version 1.83, T-Coffee version 4.45, PSAlign using ProbCons as the tree generation (no version given, archive created on 3/2/2006), Kalign version 1.04, MAFFT version 5.861, and MUSCLE version 3.6. Additionally, a fast version was tested for ClustalW, MAFFT, MUSCLE and MAFFT version 6.240. In particular, the command line options used were clustalw -quicktree, mafft --retree 1, muscle -maxiters 1 -diags -sv -distance1 kbit20_3 and mafft --retree 1 --parttree --partsize 50 to incorporate high-speed progressive options. In all cases the default parameters were used for each program. In general, there are no significant differences in the performance of GramAlign and other algorithms as far as the SP and TC scores are concerned. As may be seen, GramAlign provides similar alignments in terms of the quality determined via the scoring method used.</p> <p>Presented in Table ##TAB##2##3## are the execution times necessary to generate the entire data presented in Table ##TAB##0##1## and Table ##TAB##1##2##. GramAlign finishes in approximately 0.4% of the time needed by PSAlign, which generated the highest scoring alignments in five out of the six BAliBASE categories as far as SP scores are concerned. PSAlign's average SP and TC score on the other hand were 9.4 and 17.5% better than GramAlign's scores, which was approximately 223 times faster. Out of the four approaches MAFFT, MAFFT v6, MAFFT (fast), MUSCLE (fast), which were 17.1, 49.9, 54.0, and 55.7% faster than GramAlign, respectively, only MAFFT had a 2% better average SP score than GramAlign. All other average SP and TC scores were equivalent or worse than that of GramAlign. Further, the GramAlign alignments scored equal-to or greater-than 56.9, 59.6, 60.8, and 71.1% of the trials based on TC score, compared to MAFFT, MAFFT v6, MAFFT (fast), and MUSCLE (fast) (results not shown). GramAlign finishes in 33% of the time required by ClustalW using -quicktree, and only 8% needed by ClustalW, possibly the most widely used MSA program.</p> <title>Experiments with Large Data Sets</title> <title>Long Sequence Experiments</title> <p>In order to compare the performance of MSA algorithms on long data sets, two sets of seven FASTA files each containing ten sequences were generated using Rose version 1.3. The first set of seven FASTA files contains protein sequences and the second set contains DNA sequences. In both sets, the first file contains sequences with an average length of 5,000 residues, with each file increasing the average sequence length by 5,000 residues. Thus, the seventh file contains ten sequences with an average sequence length of 35,000 residues.</p> <p>Figures ##FIG##5##6## and ##FIG##6##7## depict the execution time required for the fastest algorithms to align the seven large protein and DNA sequence sets, respectively. As the average length of sequences increases, the difference in time required by GramAlign compared to the other algorithms also increases. In particular, at an average sequence length of 35,000 residues GramAlign completes the alignments in 3,363 and 3,092 seconds, while the nearest algorithm (MAFFT in fast-mode) requires 10,362 and 6,981 seconds. That is, GramAlign finishes in 32% and 44% of the time required by the next fastest algorithm.</p> <p>MUSCLE in fast mode encountered a segmentation fault during the Root Alignment step while running on the longest test sequences, and so the execution time is not included in Figures ##FIG##5##6## and ##FIG##6##7##.</p> <title>Numerous Sequence Experiments</title> <p>In order to compare the performance of MSA algorithms on data sets with many sequences, two sets of seven FASTA files each containing sequences with an average length of 100 residues were generated using Rose version 1.3. The first set of seven FASTA files contains protein sequences and the second set contains DNA sequences. In both sets, the first file contains 100 sequences, with each file increasing the number of sequences up to the seventh file, which contains 10,000 sequences.</p> <p>As shown in [##REF##17118958##30##], the authors of MAFFT added a new heuristic method for generating a spanning tree referred to as "PartTree". The increase in performance is dramatic and intended for data sets involving many sequences. Thus, for this set of experiments, MAFFT version 6.240 was added with the command line mafft --retree 1 --parttree --partsize 50, which matches the fastest algorithm presented in [##REF##17118958##30##]. Figures ##FIG##7##8## and ##FIG##8##9## depict the execution time required for the fastest algorithms to align the seven large protein and DNA sequence sets, respectively. As the number of sequences increases, the difference in time required by GramAlign and MAFFT v6 compared to the other algorithms also increases. In particular, on the sets containing 10,000 protein and DNA sequences GramAlign completes the alignments in 162 and 68 seconds and MAFFT v6 completes the alignments in 119 and 71 seconds, while the next closest algorithm, MUSCLE in fast-mode, requires 621 and 456 seconds. That is, GramAlign finishes in 26% and 15% of the time required by the next fastest algorithm other than MAFFT v6.</p> <p>The results imply the promising viability of the proposed algorithm, especially when aligning either long or numerous sequences such as in whole-genome applications. Further, better alignment scores may be achieved with little change in execution time via the user-alterable parameters.</p>
<title>Conclusion</title> <p>The primary goal of this work was to introduce a computationally-efficient progressive alignment algorithm which can be used for aligning large data sets. The grammar-based distance work presented in [##REF##14594718##20##] was adapted to generate an estimation of the proper order in which sequences are to be aligned. Additionally, a merged amino acid alphabet was determined to allow an improved grammar-based distance when operating on protein sequences. Results from extensive alignments were presented in an attempt to study the overall quality of the resultant alignments as well as the computation time necessary to achieve the alignments. Correctly aligning multiple biological sequences in an efficient amount of time is an important and challenging problem with a wide spectrum of applications. In this work, we adapt existing ideas in a novel way introducing innovative improvements. The proposed algorithm achieves reasonable alignments compared to existing methods while significantly reducing execution time. Future work will focus on determining the best set of user-defined parameters for generating the highest overall SP and TC scores.</p>
<p>This is an Open Access article distributed under the terms of the Creative Commons Attribution License (<ext-link ext-link-type="uri" xlink:href="http://creativecommons.org/licenses/by/2.0"/>), which permits unrestricted use, distribution, and reproduction in any medium, provided the original work is properly cited.</p> <title>Background</title> <p>We propose a multiple sequence alignment (MSA) algorithm and compare the alignment-quality and execution-time of the proposed algorithm with that of existing algorithms. The proposed progressive alignment algorithm uses a grammar-based distance metric to determine the order in which biological sequences are to be pairwise aligned. The progressive alignment occurs via pairwise aligning new sequences with an ensemble of the sequences previously aligned.</p> <title>Results</title> <p>The performance of the proposed algorithm is validated via comparison to popular progressive multiple alignment approaches, ClustalW and T-Coffee, and to the more recently developed algorithms MAFFT, MUSCLE, Kalign, and PSAlign using the BAliBASE 3.0 database of amino acid alignment files and a set of longer sequences generated by Rose software. The proposed algorithm has successfully built multiple alignments comparable to other programs with significant improvements in running time. The results are especially striking for large datasets.</p> <title>Conclusion</title> <p>We introduce a computationally efficient progressive alignment algorithm using a grammar based sequence distance particularly useful in aligning large datasets.</p>
<title>Availability</title> <p>The current version of GramAlign may be run on-line, or the source code may be downloaded from the web server <ext-link ext-link-type="uri" xlink:href="http://bioinfo.unl.edu/GramAlign.html"/>.</p> <title>Authors' contributions</title> <p>DJR thought of applying the natural transitivity of the LZ grammars to the recursive division of the distance matrix, implemented the entire algorithm, performed all evaluations and drafted the initial manuscript. HHO conceived the idea of using an LZ grammar for progressive alignment. KS collaborated with HHO and DJR in the development of the algorithm and preparing the final manuscript. All authors read and approved the final manuscript.</p> <title>Supplementary Material</title>
<title>Acknowledgements</title> <p>We would like to thank the National Institutes of Health (NIH) for partial funding of this work. We would also like to thank the editor and anonymous referees for their insightful comments. KS thanks NIH for support under grant K25AI068151.</p>
<fig position="float" id="F1"><label>Figure 1</label><caption><p><bold>Algorithm overview</bold>. The algorithm operates on a set of sequences <italic>S </italic>originally read in FASTA format. After a grammar-based distance matrix <italic>D </italic>is estimated, a minimal spanning tree <italic>T </italic>is constructed. The tree is used as a map for determining the order in which the sequence set is progressively aligned in <italic>A</italic>. Gaps in the alignment are grouped together using a sliding window resulting in <italic>A</italic><sub><italic>Adj</italic></sub>. Several outputs are available, including the distance matrix and various sequence alignment formats.</p></caption></fig> <fig position="float" id="F2"><label>Figure 2</label><caption><p><bold>Distance calculation</bold>. An <italic>N </italic>× <italic>N </italic>grammar-based distance matrix <italic>D </italic>is estimated from the set of <italic>N </italic>input sequences <italic>S</italic>. The first step in generating <italic>D </italic>is to approximate the original number of elements in each sequence's dictionary based on an LZ complexity. Each dictionary is extended using all other sequences resulting in new numbers of elements. The grammar-based distance between sequences <italic>m </italic>and <italic>n </italic>is determined by considering the amount by which dictionaries change.</p></caption></fig> <fig position="float" id="F3"><label>Figure 3</label><caption><p><bold>Substitution scores for amino acid 'L' and 'M'</bold>. Bar graphs of the substitution scores for amino acid 'L' and 'M' as taken from the Gonnet250 and BLOSUM62 substitution matrices. The scores are shown based on an alphabetical ordering of amino acid letters from the leftmost 'A' to rightmost 'Z'.</p></caption></fig> <fig position="float" id="F4"><label>Figure 4</label><caption><p><bold>Align sequences</bold>. From the spanning tree <italic>T </italic>and the set of sequences <italic>S</italic>, a progressive alignment is generated and stored in an ensemble. When no more sequences remain, the final alignment <italic>A </italic>is available for post-processing gap adjustments.</p></caption></fig> <fig position="float" id="F5"><label>Figure 5</label><caption><p><bold>Adjust gaps</bold>. Gaps in the complete MSA ensemble <italic>A </italic>are grouped together via a sliding window. After the histogram <italic>H </italic>of gaps-per-column is generated, an equidistant column-window is shifted across the alignment, moving one column per interval. If the center column contains more gaps than some parameter threshold, the columns within the window are scanned for possible gaps that may be shifted into the center column. The resulting adjusted ensemble <italic>A</italic><sub><italic>Adj </italic></sub>is presented as the final alignment.</p></caption></fig> <fig position="float" id="F6"><label>Figure 6</label><caption><p><bold>Rose protein long</bold>. Result of executing the fastest algorithms on the Rose-generated long protein sequence sets.</p></caption></fig> <fig position="float" id="F7"><label>Figure 7</label><caption><p><bold>Rose DNA long</bold>. Result of executing the fastest algorithms on the Rose-generated long DNA sequence sets.</p></caption></fig> <fig position="float" id="F8"><label>Figure 8</label><caption><p><bold>Rose protein many</bold>. Result of executing the fastest algorithms on the Rose-generated numerous protein sequence sets.</p></caption></fig> <fig position="float" id="F9"><label>Figure 9</label><caption><p><bold>Rose DNA many</bold>. Result of executing the fastest algorithms on the Rose-generated numerous DNA sequence sets.</p></caption></fig>
<table-wrap position="float" id="T1"><label>Table 1</label><caption><p>Average SP scores on BAliBASE.</p></caption><table frame="hsides" rules="groups"><thead><tr><td align="left">Algorithm</td><td align="left">RV11</td><td align="left">RV12</td><td align="left">RV20</td><td align="left">RV30</td><td align="left">RV40</td><td align="left">RV50</td></tr></thead><tbody><tr><td align="left">MUSCLE (fast)</td><td align="left">0.4904</td><td align="left">0.8303</td><td align="left">0.8359</td><td align="left">0.7076</td><td align="left">0.6904</td><td align="left">0.6823</td></tr><tr><td align="left">MAFFT (fast)</td><td align="left">0.4801</td><td align="left">0.8161</td><td align="left">0.8404</td><td align="left">0.7345</td><td align="left">0.7187</td><td align="left">0.7089</td></tr><tr><td align="left">MAFFT v6 (parttree, n = 50)</td><td align="left">0.4790</td><td align="left"><bold>0.8066</bold></td><td align="left"><bold>0.8096</bold></td><td align="left"><bold>0.6801</bold></td><td align="left"><bold>0.6610</bold></td><td align="left">0.6985</td></tr><tr><td align="left">MAFFT</td><td align="left">0.4914</td><td align="left">0.8258</td><td align="left">0.8459</td><td align="left">0.7437</td><td align="left">0.7347</td><td align="left">0.7253</td></tr><tr><td align="left">GramAlign</td><td align="left">0.5089</td><td align="left">0.8328</td><td align="left">0.8270</td><td align="left">0.6855</td><td align="left">0.7239</td><td align="left">0.6903</td></tr><tr><td align="left">Kalign</td><td align="left">0.5029</td><td align="left">0.8504</td><td align="left">0.8410</td><td align="left">0.7389</td><td align="left">0.7259</td><td align="left">0.7299</td></tr><tr><td align="left">ClustalW (fast)</td><td align="left"><bold>0.4748</bold></td><td align="left">0.8367</td><td align="left">0.8258</td><td align="left">0.6843</td><td align="left">0.6705</td><td align="left">0.6715</td></tr><tr><td align="left">MUSCLE</td><td align="left">0.5578</td><td align="left">0.8583</td><td align="left">0.8548</td><td align="left">0.7492</td><td align="left">0.7623</td><td align="left">0.7384</td></tr><tr><td align="left">ClustalW</td><td align="left">0.4908</td><td align="left">0.8197</td><td align="left">0.8219</td><td align="left">0.6841</td><td align="left">0.6950</td><td align="left"><bold>0.6698</bold></td></tr><tr><td align="left">PSAlign</td><td align="left"><bold>0.5924</bold></td><td align="left"><bold>0.8804</bold></td><td align="left"><bold>0.8720</bold></td><td align="left">0.7554</td><td align="left"><bold>0.7937</bold></td><td align="left"><bold>0.7739</bold></td></tr><tr><td align="left">T-Coffee</td><td align="left">0.5181</td><td align="left">0.8650</td><td align="left">0.8660</td><td align="left"><bold>0.7588</bold></td><td align="left">0.7452</td><td align="left">0.7715</td></tr></tbody></table></table-wrap> <table-wrap position="float" id="T2"><label>Table 2</label><caption><p>Average TC scores on BAliBASE.</p></caption><table frame="hsides" rules="groups"><thead><tr><td align="left">Algorithm</td><td align="left">RV11</td><td align="left">RV12</td><td align="left">RV20</td><td align="left">RV30</td><td align="left">RV40</td><td align="left">RV50</td></tr></thead><tbody><tr><td align="left">MUSCLE (fast)</td><td align="left">0.2421</td><td align="left">0.6349</td><td align="left"><bold>0.2599</bold></td><td align="left"><bold>0.2457</bold></td><td align="left"><bold>0.2614</bold></td><td align="left">0.2719</td></tr><tr><td align="left">MAFFT (fast)</td><td align="left">0.2354</td><td align="left"><bold>0.6209</bold></td><td align="left">0.3094</td><td align="left">0.2910</td><td align="left">0.3108</td><td align="left">0.3087</td></tr><tr><td align="left">MAFFT v6 (parttree, n = 50)</td><td align="left">0.2461</td><td align="left">0.6320</td><td align="left">0.2978</td><td align="left">0.2987</td><td align="left">0.3104</td><td align="left">0.3435</td></tr><tr><td align="left">MAFFT</td><td align="left">0.2532</td><td align="left">0.6256</td><td align="left">0.3168</td><td align="left">0.3158</td><td align="left">0.3073</td><td align="left">0.3303</td></tr><tr><td align="left">GramAlign</td><td align="left">0.2993</td><td align="left">0.6701</td><td align="left">0.2917</td><td align="left">0.2503</td><td align="left">0.3292</td><td align="left">0.3006</td></tr><tr><td align="left">Kalign</td><td align="left">0.2538</td><td align="left">0.6749</td><td align="left">0.2765</td><td align="left">0.2955</td><td align="left">0.3253</td><td align="left">0.3223</td></tr><tr><td align="left">ClustalW (fast)</td><td align="left"><bold>0.2317</bold></td><td align="left">0.6651</td><td align="left">0.2680</td><td align="left">0.2513</td><td align="left">0.2808</td><td align="left">0.2752</td></tr><tr><td align="left">MUSCLE</td><td align="left">0.3217</td><td align="left">0.6961</td><td align="left">0.3077</td><td align="left">0.3087</td><td align="left">0.3484</td><td align="left">0.3397</td></tr><tr><td align="left">ClustalW</td><td align="left">0.2395</td><td align="left">0.6417</td><td align="left">0.2602</td><td align="left">0.2478</td><td align="left">0.3024</td><td align="left"><bold>0.2658</bold></td></tr><tr><td align="left">PSAlign</td><td align="left"><bold>0.3503</bold></td><td align="left"><bold>0.7384</bold></td><td align="left"><bold>0.3517</bold></td><td align="left">0.2992</td><td align="left"><bold>0.3951</bold></td><td align="left">0.3816</td></tr><tr><td align="left">T-Coffee</td><td align="left">0.2716</td><td align="left">0.6986</td><td align="left">0.3257</td><td align="left"><bold>0.3637</bold></td><td align="left">0.3659</td><td align="left"><bold>0.3974</bold></td></tr></tbody></table></table-wrap> <table-wrap position="float" id="T3"><label>Table 3</label><caption><p>Execution time.</p></caption><table frame="hsides" rules="groups"><thead><tr><td align="left">Algorithm</td><td align="right">Execution Time (sec)</td></tr></thead><tbody><tr><td align="left">MUSCLE (fast)</td><td align="right">301</td></tr><tr><td align="left">MAFFT (fast)</td><td align="right">313</td></tr><tr><td align="left">MAFFT v6 (parttree, n = 50)</td><td align="right">341</td></tr><tr><td align="left">MAFFT</td><td align="right">564</td></tr><tr><td align="left">GramAlign</td><td align="right">680</td></tr><tr><td align="left">Kalign</td><td align="right">1,329</td></tr><tr><td align="left">ClustalW (fast)</td><td align="right">2,071</td></tr><tr><td align="left">MUSCLE</td><td align="right">6,129</td></tr><tr><td align="left">ClustalW</td><td align="right">8,720</td></tr><tr><td align="left">PSAlign</td><td align="right">152,168</td></tr><tr><td align="left">T-Coffee</td><td align="right">403,815</td></tr></tbody></table></table-wrap>
<inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M1" name="1471-2105-9-306-i1" overflow="scroll"><mml:semantics><mml:mrow><mml:msubsup><mml:mi>G</mml:mi><mml:mi>m</mml:mi><mml:mn>1</mml:mn></mml:msubsup></mml:mrow></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M2" name="1471-2105-9-306-i2" overflow="scroll"><mml:semantics><mml:mrow><mml:msubsup><mml:mi>G</mml:mi><mml:mi>m</mml:mi><mml:mi>k</mml:mi></mml:msubsup><mml:mo>=</mml:mo><mml:msubsup><mml:mi>G</mml:mi><mml:mi>m</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msubsup><mml:mo>∪</mml:mo><mml:mo>{</mml:mo><mml:msup><mml:mi>f</mml:mi><mml:mi>k</mml:mi></mml:msup><mml:mo>}</mml:mo></mml:mrow></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M3" name="1471-2105-9-306-i3" overflow="scroll"><mml:semantics><mml:mrow><mml:msubsup><mml:mi>G</mml:mi><mml:mi>m</mml:mi><mml:mi>k</mml:mi></mml:msubsup><mml:mo>=</mml:mo><mml:msubsup><mml:mi>G</mml:mi><mml:mi>m</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msubsup></mml:mrow></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M4" name="1471-2105-9-306-i4" overflow="scroll"><mml:semantics><mml:mrow><mml:msubsup><mml:mi>G</mml:mi><mml:mrow><mml:mi>m</mml:mi><mml:mo>,</mml:mo><mml:mi>n</mml:mi></mml:mrow><mml:mn>1</mml:mn></mml:msubsup></mml:mrow></mml:semantics></mml:math></inline-formula> <disp-formula id="bmcM1"><label>(1)</label><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M5" name="1471-2105-9-306-i5" overflow="scroll"><mml:semantics><mml:mrow><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>m</mml:mi><mml:mo>,</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:msub><mml:mi>E</mml:mi><mml:mrow><mml:mi>m</mml:mi><mml:mo>,</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:msub><mml:mo>−</mml:mo><mml:msub><mml:mi>E</mml:mi><mml:mrow><mml:mi>m</mml:mi><mml:mo>,</mml:mo><mml:mi>m</mml:mi></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>E</mml:mi><mml:mrow><mml:mi>n</mml:mi><mml:mo>,</mml:mo><mml:mi>m</mml:mi></mml:mrow></mml:msub><mml:mo>−</mml:mo><mml:msub><mml:mi>E</mml:mi><mml:mrow><mml:mi>n</mml:mi><mml:mo>,</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mrow><mml:mfrac><mml:mrow><mml:msub><mml:mi>E</mml:mi><mml:mrow><mml:mi>m</mml:mi><mml:mo>,</mml:mo><mml:mi>n</mml:mi></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>E</mml:mi><mml:mrow><mml:mi>n</mml:mi><mml:mo>,</mml:mo><mml:mi>m</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mfrac><mml:mo>,</mml:mo></mml:mrow></mml:semantics></mml:math></disp-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M6" name="1471-2105-9-306-i6" overflow="scroll"><mml:semantics><mml:mrow><mml:mfrac><mml:mrow><mml:mi>N</mml:mi><mml:mo stretchy="false">(</mml:mo><mml:mi>N</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:semantics></mml:math></inline-formula> <disp-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M7" name="1471-2105-9-306-i7" overflow="scroll"><mml:semantics><mml:mrow><mml:mi>A</mml:mi><mml:mo>:</mml:mo><mml:mrow><mml:mo>{</mml:mo><mml:mrow><mml:mtable columnalign="left"><mml:mtr columnalign="left"><mml:mtd columnalign="left"><mml:mrow><mml:mo>…</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub><mml:mo>…</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr columnalign="left"><mml:mtd columnalign="left"><mml:mrow><mml:mo>…</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>2</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>2</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>2</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>2</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>2</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub><mml:mo>…</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr columnalign="left"><mml:mtd columnalign="left"><mml:mrow><mml:mo>…</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>3</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>3</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>3</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>3</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>3</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub><mml:mo>…</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr columnalign="left"><mml:mtd columnalign="left"><mml:mrow><mml:mo>…</mml:mo><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>4</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>4</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>4</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>4</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>4</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub><mml:mo>…</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr columnalign="left"><mml:mtd columnalign="left"><mml:mrow><mml:mo>…</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>5</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>5</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>5</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>5</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>5</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub><mml:mo>…</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula> <disp-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M8" name="1471-2105-9-306-i8" overflow="scroll"><mml:semantics><mml:mrow><mml:mi>A</mml:mi><mml:mo>:</mml:mo><mml:mrow><mml:mo>{</mml:mo><mml:mrow><mml:mtable columnalign="left"><mml:mtr columnalign="left"><mml:mtd columnalign="left"><mml:mrow><mml:mo>…</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>1</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub><mml:mo>…</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr columnalign="left"><mml:mtd columnalign="left"><mml:mrow><mml:mo>…</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>2</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>2</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>2</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>2</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>2</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub><mml:mo>…</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr columnalign="left"><mml:mtd columnalign="left"><mml:mrow><mml:mo>…</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>3</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>3</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>3</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>3</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>3</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub><mml:mo>…</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr columnalign="left"><mml:mtd columnalign="left"><mml:mrow><mml:mo>…</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>4</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>4</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>4</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>4</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>4</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub><mml:mo>…</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr columnalign="left"><mml:mtd columnalign="left"><mml:mrow><mml:mo>…</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>5</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>5</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>−</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>5</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mo>−</mml:mo><mml:mrow><mml:mn>5</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd columnalign="left"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mn>5</mml:mn><mml:mo>,</mml:mo><mml:mi>i</mml:mi><mml:mo>+</mml:mo><mml:mn>2</mml:mn></mml:mrow></mml:msub><mml:mo>…</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:semantics></mml:math></disp-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M9" name="1471-2105-9-306-i9" overflow="scroll"><mml:semantics><mml:mi mathvariant="script">O</mml:mi></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M10" name="1471-2105-9-306-i9" overflow="scroll"><mml:semantics><mml:mi mathvariant="script">O</mml:mi></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M11" name="1471-2105-9-306-i9" overflow="scroll"><mml:semantics><mml:mi mathvariant="script">O</mml:mi></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M12" name="1471-2105-9-306-i9" overflow="scroll"><mml:semantics><mml:mi mathvariant="script">O</mml:mi></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M13" name="1471-2105-9-306-i9" overflow="scroll"><mml:semantics><mml:mi mathvariant="script">O</mml:mi></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M14" name="1471-2105-9-306-i9" overflow="scroll"><mml:semantics><mml:mi mathvariant="script">O</mml:mi></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M15" name="1471-2105-9-306-i9" overflow="scroll"><mml:semantics><mml:mi mathvariant="script">O</mml:mi></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M16" name="1471-2105-9-306-i9" overflow="scroll"><mml:semantics><mml:mi mathvariant="script">O</mml:mi></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M17" name="1471-2105-9-306-i9" overflow="scroll"><mml:semantics><mml:mi mathvariant="script">O</mml:mi></mml:semantics></mml:math></inline-formula> <inline-formula><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" id="M18" name="1471-2105-9-306-i9" overflow="scroll"><mml:semantics><mml:mi mathvariant="script">O</mml:mi></mml:semantics></mml:math></inline-formula>
<supplementary-material content-type="local-data" id="S1"><caption><title>Additional file 1</title><p>An archive of the source code for the version of GramAlign at the time of publishing. An executable may be generated by unzipping this file and using an ANSI C compiler to build the code.</p></caption></supplementary-material>
<table-wrap-foot><p>Average SP score for each algorithm for each category offered by the BAliBASE test suite. The bold entries indicate the lowest and highest scores.</p></table-wrap-foot> <table-wrap-foot><p>Average TC score for each algorithm for each category offered by the BAliBASE test suite. The bold entries indicate the lowest and highest scores.</p></table-wrap-foot> <table-wrap-foot><p>Execution time necessary to align all trials in the BAliBASE test suite.</p></table-wrap-foot>
<graphic xlink:href="1471-2105-9-306-1"/> <graphic xlink:href="1471-2105-9-306-2"/> <graphic xlink:href="1471-2105-9-306-3"/> <graphic xlink:href="1471-2105-9-306-4"/> <graphic xlink:href="1471-2105-9-306-5"/> <graphic xlink:href="1471-2105-9-306-6"/> <graphic xlink:href="1471-2105-9-306-7"/> <graphic xlink:href="1471-2105-9-306-8"/> <graphic xlink:href="1471-2105-9-306-9"/>
<media xlink:href="1471-2105-9-306-S1.zip" mimetype="application" mime-subtype="x-zip-compressed"><caption><p>Click here for file</p></caption></media>
[{"surname": ["Clote", "Backofen"], "given-names": ["P", "R"], "source": ["Computational Molecular Biology, An Introduction"], "year": ["1998"], "publisher-name": ["New York, NY: Cambridge University Press"]}, {"surname": ["Durbin", "Eddy", "Krogh", "Mitchison"], "given-names": ["R", "S", "A", "G"], "source": ["Biological Sequence Analysis, Probabilistic Models of Proteins and Nucleic Acids"], "year": ["1998"], "publisher-name": ["New York, NY: Cambridge University Press"]}, {"surname": ["Notredame"], "given-names": ["C"], "article-title": ["Recent Evolutions of Multiple Sequence Alignment Algorithms"], "source": ["PLoS Computational Biology"], "year": ["2007"], "volume": ["3"], "fpage": ["1405"], "lpage": ["1408"], "pub-id": ["10.1371/journal.pcbi.0030123"]}, {"surname": ["Ziv", "Lempel"], "given-names": ["J", "A"], "article-title": ["A Universal Algorithm for Sequential Data Compression"], "source": ["IEEE Transactions on Information Theory"], "year": ["1977"], "volume": ["23"], "fpage": ["337"], "lpage": ["343"], "pub-id": ["10.1109/TIT.1977.1055714"]}, {"surname": ["Ziv", "Lempel"], "given-names": ["J", "A"], "article-title": ["Compression of Individual Sequences via Variable-Rate Coding"], "source": ["IEEE Transactions on Information Theory"], "year": ["1978"], "volume": ["24"], "fpage": ["530"], "lpage": ["536"], "pub-id": ["10.1109/TIT.1978.1055934"]}, {"surname": ["Albertson", "Hutchinson"], "given-names": ["MO", "JP"], "source": ["Discrete Mathematics with Algorithms"], "year": ["1988"], "publisher-name": ["New York: John Wiley & Sons, Inc"]}, {"surname": ["Dayhoff", "Schwartz", "Orcutt"], "given-names": ["MO", "RM", "BC"], "source": ["Atlas of Protein Sequence and Structure, National Biomedical Research Foundation, 1978 chap A Model of Evolutionary Change in Proteins"], "volume": ["5"], "fpage": ["345"], "lpage": ["352"]}]
BMC Bioinformatics. 2008 Jul 10; 9:306