annotate bwa-0.6.2/bwtio.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 #include <string.h>
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
2 #include <stdio.h>
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
3 #include <stdlib.h>
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
4 #include "bwt.h"
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
5 #include "utils.h"
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
6
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
7 void bwt_dump_bwt(const char *fn, const bwt_t *bwt)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
8 {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
9 FILE *fp;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
10 fp = xopen(fn, "wb");
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
11 fwrite(&bwt->primary, sizeof(bwtint_t), 1, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
12 fwrite(bwt->L2+1, sizeof(bwtint_t), 4, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
13 fwrite(bwt->bwt, 4, bwt->bwt_size, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
14 fclose(fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
15 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
16
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
17 void bwt_dump_sa(const char *fn, const bwt_t *bwt)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
18 {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
19 FILE *fp;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
20 fp = xopen(fn, "wb");
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
21 fwrite(&bwt->primary, sizeof(bwtint_t), 1, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
22 fwrite(bwt->L2+1, sizeof(bwtint_t), 4, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
23 fwrite(&bwt->sa_intv, sizeof(bwtint_t), 1, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
24 fwrite(&bwt->seq_len, sizeof(bwtint_t), 1, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
25 fwrite(bwt->sa + 1, sizeof(bwtint_t), bwt->n_sa - 1, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
26 fclose(fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
27 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
28
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
29 void bwt_restore_sa(const char *fn, bwt_t *bwt)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
30 {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
31 char skipped[256];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
32 FILE *fp;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
33 bwtint_t primary;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
34
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
35 fp = xopen(fn, "rb");
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
36 fread(&primary, sizeof(bwtint_t), 1, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
37 xassert(primary == bwt->primary, "SA-BWT inconsistency: primary is not the same.");
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
38 fread(skipped, sizeof(bwtint_t), 4, fp); // skip
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
39 fread(&bwt->sa_intv, sizeof(bwtint_t), 1, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
40 fread(&primary, sizeof(bwtint_t), 1, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
41 xassert(primary == bwt->seq_len, "SA-BWT inconsistency: seq_len is not the same.");
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
42
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
43 bwt->n_sa = (bwt->seq_len + bwt->sa_intv) / bwt->sa_intv;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
44 bwt->sa = (bwtint_t*)calloc(bwt->n_sa, sizeof(bwtint_t));
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
45 bwt->sa[0] = -1;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
46
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
47 fread(bwt->sa + 1, sizeof(bwtint_t), bwt->n_sa - 1, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
48 fclose(fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
49 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
50
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
51 bwt_t *bwt_restore_bwt(const char *fn)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
52 {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
53 bwt_t *bwt;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
54 FILE *fp;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
55
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
56 bwt = (bwt_t*)calloc(1, sizeof(bwt_t));
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
57 fp = xopen(fn, "rb");
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
58 fseek(fp, 0, SEEK_END);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
59 bwt->bwt_size = (ftell(fp) - sizeof(bwtint_t) * 5) >> 2;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
60 bwt->bwt = (uint32_t*)calloc(bwt->bwt_size, 4);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
61 fseek(fp, 0, SEEK_SET);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
62 fread(&bwt->primary, sizeof(bwtint_t), 1, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
63 fread(bwt->L2+1, sizeof(bwtint_t), 4, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
64 fread(bwt->bwt, 4, bwt->bwt_size, fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
65 bwt->seq_len = bwt->L2[4];
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
66 fclose(fp);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
67 bwt_gen_cnt_table(bwt);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
68
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
69 return bwt;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
70 }
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
71
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
72 void bwt_destroy(bwt_t *bwt)
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
73 {
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
74 if (bwt == 0) return;
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
75 free(bwt->sa); free(bwt->bwt);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
76 free(bwt);
dd1186b11b3b Uploaded BWA
ashvark
parents:
diff changeset
77 }