annotate bwa-0.6.2/ksw.c @ 0:dd1186b11b3b draft

Uploaded BWA
author ashvark
date Fri, 18 Jul 2014 07:55:14 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
1 /* The MIT License
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
2
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
3 Copyright (c) 2011 by Attractive Chaos <attractor@live.co.uk>
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
4
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
5 Permission is hereby granted, free of charge, to any person obtaining
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
6 a copy of this software and associated documentation files (the
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
7 "Software"), to deal in the Software without restriction, including
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
8 without limitation the rights to use, copy, modify, merge, publish,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
9 distribute, sublicense, and/or sell copies of the Software, and to
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
10 permit persons to whom the Software is furnished to do so, subject to
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
11 the following conditions:
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
12
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
13 The above copyright notice and this permission notice shall be
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
14 included in all copies or substantial portions of the Software.
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
15
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
17 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
18 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
19 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
20 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
21 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
22 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
23 SOFTWARE.
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
24 */
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
25
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
26 #ifndef _NO_SSE2
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
27 #include <stdlib.h>
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
28 #include <stdint.h>
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
29 #include <emmintrin.h>
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
30 #include "ksw.h"
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
31
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
32 #ifdef __GNUC__
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
33 #define LIKELY(x) __builtin_expect((x),1)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
34 #define UNLIKELY(x) __builtin_expect((x),0)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
35 #else
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
36 #define LIKELY(x) (x)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
37 #define UNLIKELY(x) (x)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
38 #endif
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
39
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
40 struct _ksw_query_t {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
41 int qlen, slen;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
42 uint8_t shift, mdiff, max, size;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
43 __m128i *qp, *H0, *H1, *E, *Hmax;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
44 };
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
45
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
46 ksw_query_t *ksw_qinit(int size, int qlen, const uint8_t *query, int m, const int8_t *mat)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
47 {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
48 ksw_query_t *q;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
49 int slen, a, tmp, p;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
50
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
51 size = size > 1? 2 : 1;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
52 p = 8 * (3 - size); // # values per __m128i
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
53 slen = (qlen + p - 1) / p; // segmented length
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
54 q = malloc(sizeof(ksw_query_t) + 256 + 16 * slen * (m + 4)); // a single block of memory
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
55 q->qp = (__m128i*)(((size_t)q + sizeof(ksw_query_t) + 15) >> 4 << 4); // align memory
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
56 q->H0 = q->qp + slen * m;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
57 q->H1 = q->H0 + slen;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
58 q->E = q->H1 + slen;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
59 q->Hmax = q->E + slen;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
60 q->slen = slen; q->qlen = qlen; q->size = size;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
61 // compute shift
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
62 tmp = m * m;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
63 for (a = 0, q->shift = 127, q->mdiff = 0; a < tmp; ++a) { // find the minimum and maximum score
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
64 if (mat[a] < (int8_t)q->shift) q->shift = mat[a];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
65 if (mat[a] > (int8_t)q->mdiff) q->mdiff = mat[a];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
66 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
67 q->max = q->mdiff;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
68 q->shift = 256 - q->shift; // NB: q->shift is uint8_t
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
69 q->mdiff += q->shift; // this is the difference between the min and max scores
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
70 // An example: p=8, qlen=19, slen=3 and segmentation:
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
71 // {{0,3,6,9,12,15,18,-1},{1,4,7,10,13,16,-1,-1},{2,5,8,11,14,17,-1,-1}}
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
72 if (size == 1) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
73 int8_t *t = (int8_t*)q->qp;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
74 for (a = 0; a < m; ++a) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
75 int i, k, nlen = slen * p;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
76 const int8_t *ma = mat + a * m;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
77 for (i = 0; i < slen; ++i)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
78 for (k = i; k < nlen; k += slen) // p iterations
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
79 *t++ = (k >= qlen? 0 : ma[query[k]]) + q->shift;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
80 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
81 } else {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
82 int16_t *t = (int16_t*)q->qp;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
83 for (a = 0; a < m; ++a) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
84 int i, k, nlen = slen * p;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
85 const int8_t *ma = mat + a * m;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
86 for (i = 0; i < slen; ++i)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
87 for (k = i; k < nlen; k += slen) // p iterations
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
88 *t++ = (k >= qlen? 0 : ma[query[k]]);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
89 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
90 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
91 return q;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
92 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
93
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
94 int ksw_sse2_16(ksw_query_t *q, int tlen, const uint8_t *target, ksw_aux_t *a) // the first gap costs -(_o+_e)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
95 {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
96 int slen, i, m_b, n_b, te = -1, gmax = 0;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
97 uint64_t *b;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
98 __m128i zero, gapoe, gape, shift, *H0, *H1, *E, *Hmax;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
99
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
100 #define __max_16(ret, xx) do { \
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
101 (xx) = _mm_max_epu8((xx), _mm_srli_si128((xx), 8)); \
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
102 (xx) = _mm_max_epu8((xx), _mm_srli_si128((xx), 4)); \
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
103 (xx) = _mm_max_epu8((xx), _mm_srli_si128((xx), 2)); \
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
104 (xx) = _mm_max_epu8((xx), _mm_srli_si128((xx), 1)); \
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
105 (ret) = _mm_extract_epi16((xx), 0) & 0x00ff; \
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
106 } while (0)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
107
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
108 // initialization
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
109 m_b = n_b = 0; b = 0;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
110 zero = _mm_set1_epi32(0);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
111 gapoe = _mm_set1_epi8(a->gapo + a->gape);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
112 gape = _mm_set1_epi8(a->gape);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
113 shift = _mm_set1_epi8(q->shift);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
114 H0 = q->H0; H1 = q->H1; E = q->E; Hmax = q->Hmax;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
115 slen = q->slen;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
116 for (i = 0; i < slen; ++i) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
117 _mm_store_si128(E + i, zero);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
118 _mm_store_si128(H0 + i, zero);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
119 _mm_store_si128(Hmax + i, zero);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
120 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
121 // the core loop
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
122 for (i = 0; i < tlen; ++i) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
123 int j, k, cmp, imax;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
124 __m128i e, h, f = zero, max = zero, *S = q->qp + target[i] * slen; // s is the 1st score vector
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
125 h = _mm_load_si128(H0 + slen - 1); // h={2,5,8,11,14,17,-1,-1} in the above example
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
126 h = _mm_slli_si128(h, 1); // h=H(i-1,-1); << instead of >> because x64 is little-endian
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
127 for (j = 0; LIKELY(j < slen); ++j) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
128 /* SW cells are computed in the following order:
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
129 * H(i,j) = max{H(i-1,j-1)+S(i,j), E(i,j), F(i,j)}
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
130 * E(i+1,j) = max{H(i,j)-q, E(i,j)-r}
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
131 * F(i,j+1) = max{H(i,j)-q, F(i,j)-r}
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
132 */
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
133 // compute H'(i,j); note that at the beginning, h=H'(i-1,j-1)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
134 h = _mm_adds_epu8(h, _mm_load_si128(S + j));
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
135 h = _mm_subs_epu8(h, shift); // h=H'(i-1,j-1)+S(i,j)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
136 e = _mm_load_si128(E + j); // e=E'(i,j)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
137 h = _mm_max_epu8(h, e);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
138 h = _mm_max_epu8(h, f); // h=H'(i,j)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
139 max = _mm_max_epu8(max, h); // set max
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
140 _mm_store_si128(H1 + j, h); // save to H'(i,j)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
141 // now compute E'(i+1,j)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
142 h = _mm_subs_epu8(h, gapoe); // h=H'(i,j)-gapo
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
143 e = _mm_subs_epu8(e, gape); // e=E'(i,j)-gape
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
144 e = _mm_max_epu8(e, h); // e=E'(i+1,j)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
145 _mm_store_si128(E + j, e); // save to E'(i+1,j)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
146 // now compute F'(i,j+1)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
147 f = _mm_subs_epu8(f, gape);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
148 f = _mm_max_epu8(f, h);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
149 // get H'(i-1,j) and prepare for the next j
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
150 h = _mm_load_si128(H0 + j); // h=H'(i-1,j)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
151 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
152 // NB: we do not need to set E(i,j) as we disallow adjecent insertion and then deletion
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
153 for (k = 0; LIKELY(k < 16); ++k) { // this block mimics SWPS3; NB: H(i,j) updated in the lazy-F loop cannot exceed max
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
154 f = _mm_slli_si128(f, 1);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
155 for (j = 0; LIKELY(j < slen); ++j) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
156 h = _mm_load_si128(H1 + j);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
157 h = _mm_max_epu8(h, f); // h=H'(i,j)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
158 _mm_store_si128(H1 + j, h);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
159 h = _mm_subs_epu8(h, gapoe);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
160 f = _mm_subs_epu8(f, gape);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
161 cmp = _mm_movemask_epi8(_mm_cmpeq_epi8(_mm_subs_epu8(f, h), zero));
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
162 if (UNLIKELY(cmp == 0xffff)) goto end_loop16;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
163 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
164 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
165 end_loop16:
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
166 //int k;for (k=0;k<16;++k)printf("%d ", ((uint8_t*)&max)[k]);printf("\n");
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
167 __max_16(imax, max); // imax is the maximum number in max
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
168 if (imax >= a->T) { // write the b array; this condition adds branching unfornately
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
169 if (n_b == 0 || (int32_t)b[n_b-1] + 1 != i) { // then append
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
170 if (n_b == m_b) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
171 m_b = m_b? m_b<<1 : 8;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
172 b = realloc(b, 8 * m_b);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
173 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
174 b[n_b++] = (uint64_t)imax<<32 | i;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
175 } else if ((int)(b[n_b-1]>>32) < imax) b[n_b-1] = (uint64_t)imax<<32 | i; // modify the last
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
176 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
177 if (imax > gmax) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
178 gmax = imax; te = i; // te is the end position on the target
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
179 for (j = 0; LIKELY(j < slen); ++j) // keep the H1 vector
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
180 _mm_store_si128(Hmax + j, _mm_load_si128(H1 + j));
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
181 if (gmax + q->shift >= 255) break;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
182 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
183 S = H1; H1 = H0; H0 = S; // swap H0 and H1
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
184 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
185 a->score = gmax; a->te = te;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
186 { // get a->qe, the end of query match; find the 2nd best score
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
187 int max = -1, low, high, qlen = slen * 16;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
188 uint8_t *t = (uint8_t*)Hmax;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
189 for (i = 0, a->qe = -1; i < qlen; ++i, ++t)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
190 if ((int)*t > max) max = *t, a->qe = i / 16 + i % 16 * slen;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
191 //printf("%d,%d\n", max, gmax);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
192 i = (a->score + q->max - 1) / q->max;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
193 low = te - i; high = te + i;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
194 for (i = 0, a->score2 = 0; i < n_b; ++i) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
195 int e = (int32_t)b[i];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
196 if ((e < low || e > high) && b[i]>>32 > (uint32_t)a->score2)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
197 a->score2 = b[i]>>32, a->te2 = e;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
198 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
199 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
200 free(b);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
201 return a->score + q->shift >= 255? 255 : a->score;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
202 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
203
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
204 int ksw_sse2_8(ksw_query_t *q, int tlen, const uint8_t *target, ksw_aux_t *a) // the first gap costs -(_o+_e)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
205 {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
206 int slen, i, m_b, n_b, te = -1, gmax = 0;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
207 uint64_t *b;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
208 __m128i zero, gapoe, gape, *H0, *H1, *E, *Hmax;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
209
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
210 #define __max_8(ret, xx) do { \
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
211 (xx) = _mm_max_epi16((xx), _mm_srli_si128((xx), 8)); \
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
212 (xx) = _mm_max_epi16((xx), _mm_srli_si128((xx), 4)); \
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
213 (xx) = _mm_max_epi16((xx), _mm_srli_si128((xx), 2)); \
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
214 (ret) = _mm_extract_epi16((xx), 0); \
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
215 } while (0)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
216
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
217 // initialization
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
218 m_b = n_b = 0; b = 0;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
219 zero = _mm_set1_epi32(0);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
220 gapoe = _mm_set1_epi16(a->gapo + a->gape);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
221 gape = _mm_set1_epi16(a->gape);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
222 H0 = q->H0; H1 = q->H1; E = q->E; Hmax = q->Hmax;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
223 slen = q->slen;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
224 for (i = 0; i < slen; ++i) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
225 _mm_store_si128(E + i, zero);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
226 _mm_store_si128(H0 + i, zero);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
227 _mm_store_si128(Hmax + i, zero);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
228 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
229 // the core loop
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
230 for (i = 0; i < tlen; ++i) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
231 int j, k, imax;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
232 __m128i e, h, f = zero, max = zero, *S = q->qp + target[i] * slen; // s is the 1st score vector
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
233 h = _mm_load_si128(H0 + slen - 1); // h={2,5,8,11,14,17,-1,-1} in the above example
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
234 h = _mm_slli_si128(h, 2);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
235 for (j = 0; LIKELY(j < slen); ++j) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
236 h = _mm_adds_epi16(h, *S++);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
237 e = _mm_load_si128(E + j);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
238 h = _mm_max_epi16(h, e);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
239 h = _mm_max_epi16(h, f);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
240 max = _mm_max_epi16(max, h);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
241 _mm_store_si128(H1 + j, h);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
242 h = _mm_subs_epu16(h, gapoe);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
243 e = _mm_subs_epu16(e, gape);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
244 e = _mm_max_epi16(e, h);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
245 _mm_store_si128(E + j, e);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
246 f = _mm_subs_epu16(f, gape);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
247 f = _mm_max_epi16(f, h);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
248 h = _mm_load_si128(H0 + j);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
249 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
250 for (k = 0; LIKELY(k < 16); ++k) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
251 f = _mm_slli_si128(f, 2);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
252 for (j = 0; LIKELY(j < slen); ++j) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
253 h = _mm_load_si128(H1 + j);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
254 h = _mm_max_epi16(h, f);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
255 _mm_store_si128(H1 + j, h);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
256 h = _mm_subs_epu16(h, gapoe);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
257 f = _mm_subs_epu16(f, gape);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
258 if(UNLIKELY(!_mm_movemask_epi8(_mm_cmpgt_epi16(f, h)))) goto end_loop8;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
259 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
260 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
261 end_loop8:
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
262 __max_8(imax, max);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
263 if (imax >= a->T) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
264 if (n_b == 0 || (int32_t)b[n_b-1] + 1 != i) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
265 if (n_b == m_b) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
266 m_b = m_b? m_b<<1 : 8;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
267 b = realloc(b, 8 * m_b);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
268 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
269 b[n_b++] = (uint64_t)imax<<32 | i;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
270 } else if ((int)(b[n_b-1]>>32) < imax) b[n_b-1] = (uint64_t)imax<<32 | i; // modify the last
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
271 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
272 if (imax > gmax) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
273 gmax = imax; te = i;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
274 for (j = 0; LIKELY(j < slen); ++j)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
275 _mm_store_si128(Hmax + j, _mm_load_si128(H1 + j));
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
276 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
277 S = H1; H1 = H0; H0 = S;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
278 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
279 a->score = gmax; a->te = te;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
280 {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
281 int max = -1, low, high, qlen = slen * 8;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
282 uint16_t *t = (uint16_t*)Hmax;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
283 for (i = 0, a->qe = -1; i < qlen; ++i, ++t)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
284 if ((int)*t > max) max = *t, a->qe = i / 8 + i % 8 * slen;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
285 i = (a->score + q->max - 1) / q->max;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
286 low = te - i; high = te + i;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
287 for (i = 0, a->score2 = 0; i < n_b; ++i) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
288 int e = (int32_t)b[i];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
289 if ((e < low || e > high) && b[i]>>32 > (uint32_t)a->score2)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
290 a->score2 = b[i]>>32, a->te2 = e;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
291 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
292 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
293 free(b);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
294 return a->score;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
295 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
296
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
297 int ksw_sse2(ksw_query_t *q, int tlen, const uint8_t *target, ksw_aux_t *a)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
298 {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
299 if (q->size == 1) return ksw_sse2_16(q, tlen, target, a);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
300 else return ksw_sse2_8(q, tlen, target, a);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
301 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
302
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
303 /*******************************************
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
304 * Main function (not compiled by default) *
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
305 *******************************************/
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
306
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
307 #ifdef _KSW_MAIN
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
308
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
309 #include <unistd.h>
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
310 #include <stdio.h>
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
311 #include <zlib.h>
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
312 #include "kseq.h"
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
313 KSEQ_INIT(gzFile, gzread)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
314
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
315 unsigned char seq_nt4_table[256] = {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
316 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
317 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
318 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
319 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
320 4, 0, 4, 1, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
321 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
322 4, 0, 4, 1, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
323 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
324 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
325 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
326 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
327 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
328 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
329 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
330 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
331 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
332 };
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
333
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
334 int main(int argc, char *argv[])
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
335 {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
336 int c, sa = 1, sb = 3, i, j, k, forward_only = 0, size = 2;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
337 int8_t mat[25];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
338 ksw_aux_t a;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
339 gzFile fpt, fpq;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
340 kseq_t *kst, *ksq;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
341 // parse command line
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
342 a.gapo = 5; a.gape = 2; a.T = 10;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
343 while ((c = getopt(argc, argv, "a:b:q:r:ft:s:")) >= 0) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
344 switch (c) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
345 case 'a': sa = atoi(optarg); break;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
346 case 'b': sb = atoi(optarg); break;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
347 case 'q': a.gapo = atoi(optarg); break;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
348 case 'r': a.gape = atoi(optarg); break;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
349 case 't': a.T = atoi(optarg); break;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
350 case 'f': forward_only = 1; break;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
351 case 's': size = atoi(optarg); break;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
352 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
353 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
354 if (optind + 2 > argc) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
355 fprintf(stderr, "Usage: ksw [-s%d] [-a%d] [-b%d] [-q%d] [-r%d] <target.fa> <query.fa>\n", size, sa, sb, a.gapo, a.gape);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
356 return 1;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
357 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
358 // initialize scoring matrix
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
359 for (i = k = 0; i < 5; ++i) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
360 for (j = 0; j < 4; ++j)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
361 mat[k++] = i == j? sa : -sb;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
362 mat[k++] = 0; // ambiguous base
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
363 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
364 for (j = 0; j < 5; ++j) mat[k++] = 0;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
365 // open file
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
366 fpt = gzopen(argv[optind], "r"); kst = kseq_init(fpt);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
367 fpq = gzopen(argv[optind+1], "r"); ksq = kseq_init(fpq);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
368 // all-pair alignment
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
369 while (kseq_read(ksq) > 0) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
370 ksw_query_t *q[2];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
371 for (i = 0; i < ksq->seq.l; ++i) ksq->seq.s[i] = seq_nt4_table[(int)ksq->seq.s[i]];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
372 q[0] = ksw_qinit(size, ksq->seq.l, (uint8_t*)ksq->seq.s, 5, mat);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
373 if (!forward_only) { // reverse
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
374 for (i = 0; i < ksq->seq.l/2; ++i) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
375 int t = ksq->seq.s[i];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
376 ksq->seq.s[i] = ksq->seq.s[ksq->seq.l-1-i];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
377 ksq->seq.s[ksq->seq.l-1-i] = t;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
378 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
379 for (i = 0; i < ksq->seq.l; ++i)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
380 ksq->seq.s[i] = ksq->seq.s[i] == 4? 4 : 3 - ksq->seq.s[i];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
381 q[1] = ksw_qinit(size, ksq->seq.l, (uint8_t*)ksq->seq.s, 5, mat);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
382 } else q[1] = 0;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
383 gzrewind(fpt); kseq_rewind(kst);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
384 while (kseq_read(kst) > 0) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
385 int s;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
386 for (i = 0; i < kst->seq.l; ++i) kst->seq.s[i] = seq_nt4_table[(int)kst->seq.s[i]];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
387 s = ksw_sse2(q[0], kst->seq.l, (uint8_t*)kst->seq.s, &a);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
388 printf("%s\t%s\t+\t%d\t%d\t%d\n", ksq->name.s, kst->name.s, s, a.te+1, a.qe+1);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
389 if (q[1]) {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
390 s = ksw_sse2(q[1], kst->seq.l, (uint8_t*)kst->seq.s, &a);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
391 printf("%s\t%s\t-\t%d\t%d\t%d\n", ksq->name.s, kst->name.s, s, a.te+1, a.qe+1);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
392 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
393 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
394 free(q[0]); free(q[1]);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
395 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
396 kseq_destroy(kst); gzclose(fpt);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
397 kseq_destroy(ksq); gzclose(fpq);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
398 return 0;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
399 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
400 #endif // _KSW_MAIN
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
401 #endif // _NO_SSE2