forked from minhhpham/bwa
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfastmap.c
77 lines (75 loc) · 2.11 KB
/
fastmap.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <zlib.h>
#include <unistd.h>
#include <stdio.h>
#include "bwt.h"
#include "kvec.h"
#include "kseq.h"
KSEQ_INIT(gzFile, gzread)
extern unsigned char nst_nt4_table[256];
int main_fastmap(int argc, char *argv[])
{
int c, i;
kseq_t *seq;
gzFile fp;
bwt_t *bwt;
bwtintv_v a[3], mem, *tvec[3];
while ((c = getopt(argc, argv, "")) >= 0) {
switch (c) {
}
}
if (optind + 1 >= argc) {
fprintf(stderr, "bwa fastmap <idxbase> <in.fq>\n");
return 1;
}
fp = gzopen(argv[optind + 1], "r");
seq = kseq_init(fp);
{ // load the BWT
char *tmp = calloc(strlen(argv[optind]) + 5, 1);
strcat(strcpy(tmp, argv[optind]), ".bwt");
bwt = bwt_restore_bwt(tmp);
free(tmp);
}
for (i = 0; i < 3; ++i) {
kv_init(a[i]);
tvec[i] = &a[i];
}
kv_init(mem);
while (kseq_read(seq) >= 0) {
for (i = 0; i < seq->seq.l; ++i)
seq->seq.s[i] = nst_nt4_table[(int)seq->seq.s[i]];
{
int beg = 98;
bwtintv_t ik, ok[4];
bwt_set_intv(bwt, seq->seq.s[seq->seq.l - 1], ik);
for (i = seq->seq.l - 2; i >= beg; --i) {
//printf("[%lld,%lld,%lld] @ %d\n", ik.x[0], ik.x[1], ik.x[2], i+1);
bwt_extend(bwt, &ik, ok, 1);
ik = ok[seq->seq.s[i]];
if (ik.x[2] == 0) break;
}
printf("[%lld,%lld,%lld] @ %d\n", ik.x[0], ik.x[1], ik.x[2], i+1);
printf("======================== %lld, [%lld,%lld,%lld,%lld]\n", bwt->primary, bwt->L2[1], bwt->L2[2]-bwt->L2[1], bwt->L2[3]-bwt->L2[2], bwt->L2[4]-bwt->L2[3]);
bwt_set_intv(bwt, seq->seq.s[beg], ik);
for (i = beg + 1; i < seq->seq.l; ++i) {
//printf("[%lld,%lld,%lld] @ %d\n", ik.x[0], ik.x[1], ik.x[2], i-1);
bwt_extend(bwt, &ik, ok, 0);
ik = ok[3-seq->seq.s[i]];
if (ik.x[2] == 0) break;
}
printf("[%lld,%lld,%lld] @ %d\n", ik.x[0], ik.x[1], ik.x[2], i-1);
}
bwt_smem(bwt, seq->seq.l, (uint8_t*)seq->seq.s, &mem, tvec);
printf(">%s\t%ld\n", seq->name.s, mem.n);
for (i = 0; i < mem.n; ++i) {
bwtintv_t *p = &mem.a[i];
printf("%d\t%d\t%ld\n", (uint32_t)(p->info>>32), (uint32_t)p->info, (long)p->x[2]);
}
puts("//");
}
free(mem.a);
for (i = 0; i < 3; ++i) free(a[i].a);
bwt_destroy(bwt);
kseq_destroy(seq);
gzclose(fp);
return 0;
}