annotate pyPRADA_1.2/tools/bwa-0.5.7-mh/stdaln.c @ 0:acc2ca1a3ba4

Uploaded
author siyuan
date Thu, 20 Feb 2014 00:44:58 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1 /* The MIT License
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
2
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
3 Copyright (c) 2003-2006, 2008, 2009, by Heng Li <lh3lh3@gmail.com>
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
4
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
5 Permission is hereby granted, free of charge, to any person obtaining
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
6 a copy of this software and associated documentation files (the
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
7 "Software"), to deal in the Software without restriction, including
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
8 without limitation the rights to use, copy, modify, merge, publish,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
9 distribute, sublicense, and/or sell copies of the Software, and to
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
10 permit persons to whom the Software is furnished to do so, subject to
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
11 the following conditions:
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
12
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
13 The above copyright notice and this permission notice shall be
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
14 included in all copies or substantial portions of the Software.
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
15
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
17 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
18 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
19 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
20 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
21 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
22 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
23 SOFTWARE.
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
24 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
25
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
26 #include <stdlib.h>
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
27 #include <stdio.h>
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
28 #include <string.h>
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
29 #include <stdint.h>
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
30 #include "stdaln.h"
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
31
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
32 /* char -> 17 (=16+1) nucleotides */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
33 unsigned char aln_nt16_table[256] = {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
34 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
35 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
36 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,16 /*'-'*/,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
37 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
38 15, 1,14, 4, 11,15,15, 2, 13,15,15,10, 15, 5,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
39 15,15, 3, 6, 8,15, 7, 9, 0,12,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
40 15, 1,14, 4, 11,15,15, 2, 13,15,15,10, 15, 5,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
41 15,15, 3, 6, 8,15, 7, 9, 0,12,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
42 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
43 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
44 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
45 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
46 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
47 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
48 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
49 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
50 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
51 char *aln_nt16_rev_table = "XAGRCMSVTWKDYHBN-";
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
52
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
53 /* char -> 5 (=4+1) nucleotides */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
54 unsigned char aln_nt4_table[256] = {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
55 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
56 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
57 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5 /*'-'*/, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
58 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
59 4, 0, 4, 2, 4, 4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
60 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
61 4, 0, 4, 2, 4, 4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
62 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
63 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
64 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
65 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
66 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
67 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
68 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
69 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
70 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
71 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
72 char *aln_nt4_rev_table = "AGCTN-";
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
73
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
74 /* char -> 22 (=20+1+1) amino acids */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
75 unsigned char aln_aa_table[256] = {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
76 21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
77 21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
78 21,21,21,21, 21,21,21,21, 21,21,20,21, 21,22 /*'-'*/,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
79 21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
80 21, 0,21, 4, 3, 6,13, 7, 8, 9,21,11, 10,12, 2,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
81 14, 5, 1,15, 16,21,19,17, 21,18,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
82 21, 0,21, 4, 3, 6,13, 7, 8, 9,21,11, 10,12, 2,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
83 14, 5, 1,15, 16,21,19,17, 21,18,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
84 21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
85 21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
86 21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
87 21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
88 21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
89 21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
90 21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
91 21,21,21,21, 21,21,21,21, 21,21,21,21, 21,21,21,21
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
92 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
93 char *aln_aa_rev_table = "ARNDCQEGHILKMFPSTWYV*X-";
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
94 /* 01234567890123456789012 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
95
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
96 /* translation table. They are useless in stdaln.c, but when you realize you need it, you need not write the table again. */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
97 unsigned char aln_trans_table_eu[66] = {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
98 11,11, 2, 2, 1, 1,15,15, 16,16,16,16, 9,12, 9, 9,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
99 6, 6, 3, 3, 7, 7, 7, 7, 0, 0, 0, 0, 19,19,19,19,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
100 5, 5, 8, 8, 1, 1, 1, 1, 14,14,14,14, 10,10,10,10,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
101 20,20,18,18, 20,17, 4, 4, 15,15,15,15, 10,10,13,13, 21, 22
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
102 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
103 char *aln_trans_table_eu_char = "KKNNRRSSTTTTIMIIEEDDGGGGAAAAVVVVQQHHRRRRPPPPLLLL**YY*WCCSSSSLLFFX";
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
104 /* 01234567890123456789012345678901234567890123456789012345678901234 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
105 int aln_sm_blosum62[] = {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
106 /* A R N D C Q E G H I L K M F P S T W Y V * X */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
107 4,-1,-2,-2, 0,-1,-1, 0,-2,-1,-1,-1,-1,-2,-1, 1, 0,-3,-2, 0,-4, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
108 -1, 5, 0,-2,-3, 1, 0,-2, 0,-3,-2, 2,-1,-3,-2,-1,-1,-3,-2,-3,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
109 -2, 0, 6, 1,-3, 0, 0, 0, 1,-3,-3, 0,-2,-3,-2, 1, 0,-4,-2,-3,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
110 -2,-2, 1, 6,-3, 0, 2,-1,-1,-3,-4,-1,-3,-3,-1, 0,-1,-4,-3,-3,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
111 0,-3,-3,-3, 9,-3,-4,-3,-3,-1,-1,-3,-1,-2,-3,-1,-1,-2,-2,-1,-4,-2,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
112 -1, 1, 0, 0,-3, 5, 2,-2, 0,-3,-2, 1, 0,-3,-1, 0,-1,-2,-1,-2,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
113 -1, 0, 0, 2,-4, 2, 5,-2, 0,-3,-3, 1,-2,-3,-1, 0,-1,-3,-2,-2,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
114 0,-2, 0,-1,-3,-2,-2, 6,-2,-4,-4,-2,-3,-3,-2, 0,-2,-2,-3,-3,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
115 -2, 0, 1,-1,-3, 0, 0,-2, 8,-3,-3,-1,-2,-1,-2,-1,-2,-2, 2,-3,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
116 -1,-3,-3,-3,-1,-3,-3,-4,-3, 4, 2,-3, 1, 0,-3,-2,-1,-3,-1, 3,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
117 -1,-2,-3,-4,-1,-2,-3,-4,-3, 2, 4,-2, 2, 0,-3,-2,-1,-2,-1, 1,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
118 -1, 2, 0,-1,-3, 1, 1,-2,-1,-3,-2, 5,-1,-3,-1, 0,-1,-3,-2,-2,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
119 -1,-1,-2,-3,-1, 0,-2,-3,-2, 1, 2,-1, 5, 0,-2,-1,-1,-1,-1, 1,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
120 -2,-3,-3,-3,-2,-3,-3,-3,-1, 0, 0,-3, 0, 6,-4,-2,-2, 1, 3,-1,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
121 -1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4, 7,-1,-1,-4,-3,-2,-4,-2,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
122 1,-1, 1, 0,-1, 0, 0, 0,-1,-2,-2, 0,-1,-2,-1, 4, 1,-3,-2,-2,-4, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
123 0,-1, 0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1, 1, 5,-2,-2, 0,-4, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
124 -3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1, 1,-4,-3,-2,11, 2,-3,-4,-2,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
125 -2,-2,-2,-3,-2,-1,-2,-3, 2,-1,-1,-2,-1, 3,-3,-2,-2, 2, 7,-1,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
126 0,-3,-3,-3,-1,-2,-2,-3,-3, 3, 1,-2, 1,-1,-2,-2, 0,-3,-1, 4,-4,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
127 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, 1,-4,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
128 0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2, 0, 0,-2,-1,-1,-4,-1
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
129 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
130
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
131 int aln_sm_blosum45[] = {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
132 /* A R N D C Q E G H I L K M F P S T W Y V * X */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
133 5,-2,-1,-2,-1,-1,-1, 0,-2,-1,-1,-1,-1,-2,-1, 1, 0,-2,-2, 0,-5, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
134 -2, 7, 0,-1,-3, 1, 0,-2, 0,-3,-2, 3,-1,-2,-2,-1,-1,-2,-1,-2,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
135 -1, 0, 6, 2,-2, 0, 0, 0, 1,-2,-3, 0,-2,-2,-2, 1, 0,-4,-2,-3,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
136 -2,-1, 2, 7,-3, 0, 2,-1, 0,-4,-3, 0,-3,-4,-1, 0,-1,-4,-2,-3,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
137 -1,-3,-2,-3,12,-3,-3,-3,-3,-3,-2,-3,-2,-2,-4,-1,-1,-5,-3,-1,-5,-2,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
138 -1, 1, 0, 0,-3, 6, 2,-2, 1,-2,-2, 1, 0,-4,-1, 0,-1,-2,-1,-3,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
139 -1, 0, 0, 2,-3, 2, 6,-2, 0,-3,-2, 1,-2,-3, 0, 0,-1,-3,-2,-3,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
140 0,-2, 0,-1,-3,-2,-2, 7,-2,-4,-3,-2,-2,-3,-2, 0,-2,-2,-3,-3,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
141 -2, 0, 1, 0,-3, 1, 0,-2,10,-3,-2,-1, 0,-2,-2,-1,-2,-3, 2,-3,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
142 -1,-3,-2,-4,-3,-2,-3,-4,-3, 5, 2,-3, 2, 0,-2,-2,-1,-2, 0, 3,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
143 -1,-2,-3,-3,-2,-2,-2,-3,-2, 2, 5,-3, 2, 1,-3,-3,-1,-2, 0, 1,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
144 -1, 3, 0, 0,-3, 1, 1,-2,-1,-3,-3, 5,-1,-3,-1,-1,-1,-2,-1,-2,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
145 -1,-1,-2,-3,-2, 0,-2,-2, 0, 2, 2,-1, 6, 0,-2,-2,-1,-2, 0, 1,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
146 -2,-2,-2,-4,-2,-4,-3,-3,-2, 0, 1,-3, 0, 8,-3,-2,-1, 1, 3, 0,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
147 -1,-2,-2,-1,-4,-1, 0,-2,-2,-2,-3,-1,-2,-3, 9,-1,-1,-3,-3,-3,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
148 1,-1, 1, 0,-1, 0, 0, 0,-1,-2,-3,-1,-2,-2,-1, 4, 2,-4,-2,-1,-5, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
149 0,-1, 0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-1,-1, 2, 5,-3,-1, 0,-5, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
150 -2,-2,-4,-4,-5,-2,-3,-2,-3,-2,-2,-2,-2, 1,-3,-4,-3,15, 3,-3,-5,-2,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
151 -2,-1,-2,-2,-3,-1,-2,-3, 2, 0, 0,-1, 0, 3,-3,-2,-1, 3, 8,-1,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
152 0,-2,-3,-3,-1,-3,-3,-3,-3, 3, 1,-2, 1, 0,-3,-1, 0,-3,-1, 5,-5,-1,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
153 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, 1,-5,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
154 0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0,-2,-1,-1,-5,-1
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
155 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
156
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
157 int aln_sm_nt[] = {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
158 /* X A G R C M S V T W K D Y H B N */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
159 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
160 -2, 2,-1, 1,-2, 1,-2, 0,-2, 1,-2, 0,-2, 0,-2, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
161 -2,-1, 2, 1,-2,-2, 1, 0,-2,-2, 1, 0,-2,-2, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
162 -2, 1, 1, 1,-2,-1,-1, 0,-2,-1,-1, 0,-2, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
163 -2,-2,-2,-2, 2, 1, 1, 0,-1,-2,-2,-2, 1, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
164 -2, 1,-2,-1, 1, 1,-1, 0,-2,-1,-2, 0,-1, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
165 -2,-2, 1,-1, 1,-1, 1, 0,-2,-2,-1, 0,-1, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
166 -2, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
167 -2,-2,-2,-2,-1,-2,-2,-2, 2, 1, 1, 0, 1, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
168 -2, 1,-2,-1,-2,-1,-2, 0, 1, 1,-1, 0,-1, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
169 -2,-2, 1,-1,-2,-2,-1, 0, 1,-1, 1, 0,-1, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
170 -2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
171 -2,-2,-2,-2, 1,-1,-1, 0, 1,-1,-1, 0, 1, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
172 -2, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
173 -2,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
174 -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
175 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
176
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
177 int aln_sm_read[] = {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
178 /* X A G R C M S V T W K D Y H B N */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
179 -17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,-17,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
180 -17, 2,-17, 1,-17, 1,-17, 0,-17, 1,-17, 0,-17, 0,-17, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
181 -17,-17, 2, 1,-17,-17, 1, 0,-17,-17, 1, 0,-17,-17, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
182 -17, 1, 1, 1,-17,-17,-17, 0,-17,-17,-17, 0,-17, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
183 -17,-17,-17,-17, 2, 1, 1, 0,-17,-17,-17,-17, 1, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
184 -17, 1,-17,-17, 1, 1,-17, 0,-17,-17,-17, 0,-17, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
185 -17,-17, 1,-17, 1,-17, 1, 0,-17,-17,-17, 0,-17, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
186 -17, 0, 0, 0, 0, 0, 0, 0,-17, 0, 0, 0, 0, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
187 -17,-17,-17,-17,-17,-17,-17,-17, 2, 1, 1, 0, 1, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
188 -17, 1,-17,-17,-17,-17,-17, 0, 1, 1,-17, 0,-17, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
189 -17,-17, 1,-17,-17,-17,-17, 0, 1,-17, 1, 0,-17, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
190 -17, 0, 0, 0,-17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
191 -17,-17,-17,-17, 1,-17,-17, 0, 1,-17,-17, 0, 1, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
192 -17, 0,-17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
193 -17,-17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
194 -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
195 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
196
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
197 int aln_sm_hs[] = {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
198 /* A G C T N */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
199 91, -31,-114,-123, -44,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
200 -31, 100,-125,-114, -42,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
201 -123,-125, 100, -31, -42,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
202 -114,-114, -31, 91, -42,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
203 -44, -42, -42, -42, -43
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
204 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
205
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
206 int aln_sm_maq[] = {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
207 11, -19, -19, -19, -13,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
208 -19, 11, -19, -19, -13,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
209 -19, -19, 11, -19, -13,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
210 -19, -19, -19, 11, -13,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
211 -13, -13, -13, -13, -13
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
212 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
213
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
214 int aln_sm_blast[] = {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
215 1, -3, -3, -3, -2,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
216 -3, 1, -3, -3, -2,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
217 -3, -3, 1, -3, -2,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
218 -3, -3, -3, 1, -2,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
219 -2, -2, -2, -2, -2
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
220 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
221
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
222 /********************/
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
223 /* START OF align.c */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
224 /********************/
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
225
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
226 AlnParam aln_param_blast = { 5, 2, 2, aln_sm_blast, 5, 50 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
227 AlnParam aln_param_bwa = { 26, 9, 5, aln_sm_maq, 5, 50 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
228 AlnParam aln_param_nt2nt = { 8, 2, 2, aln_sm_nt, 16, 75 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
229 AlnParam aln_param_rd2rd = { 1, 19, 19, aln_sm_read, 16, 75 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
230 AlnParam aln_param_aa2aa = { 10, 2, 2, aln_sm_blosum62, 22, 50 };
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
231
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
232 AlnAln *aln_init_AlnAln()
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
233 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
234 AlnAln *aa;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
235 aa = (AlnAln*)malloc(sizeof(AlnAln));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
236 aa->path = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
237 aa->out1 = aa->out2 = aa->outm = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
238 aa->path_len = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
239 return aa;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
240 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
241 void aln_free_AlnAln(AlnAln *aa)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
242 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
243 free(aa->path); free(aa->cigar32);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
244 free(aa->out1); free(aa->out2); free(aa->outm);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
245 free(aa);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
246 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
247
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
248 /***************************/
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
249 /* START OF common_align.c */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
250 /***************************/
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
251
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
252 #define LOCAL_OVERFLOW_THRESHOLD 32000
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
253 #define LOCAL_OVERFLOW_REDUCE 16000
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
254 #define NT_LOCAL_SCORE int
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
255 #define NT_LOCAL_SHIFT 16
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
256 #define NT_LOCAL_MASK 0xffff
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
257
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
258 #define SET_INF(s) (s).M = (s).I = (s).D = MINOR_INF;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
259
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
260 #define set_M(MM, cur, p, sc) \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
261 { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
262 if ((p)->M >= (p)->I) { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
263 if ((p)->M >= (p)->D) { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
264 (MM) = (p)->M + (sc); (cur)->Mt = FROM_M; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
265 } else { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
266 (MM) = (p)->D + (sc); (cur)->Mt = FROM_D; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
267 } \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
268 } else { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
269 if ((p)->I > (p)->D) { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
270 (MM) = (p)->I + (sc); (cur)->Mt = FROM_I; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
271 } else { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
272 (MM) = (p)->D + (sc); (cur)->Mt = FROM_D; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
273 } \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
274 } \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
275 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
276 #define set_I(II, cur, p) \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
277 { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
278 if ((p)->M - gap_open > (p)->I) { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
279 (cur)->It = FROM_M; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
280 (II) = (p)->M - gap_open - gap_ext; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
281 } else { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
282 (cur)->It = FROM_I; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
283 (II) = (p)->I - gap_ext; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
284 } \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
285 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
286 #define set_end_I(II, cur, p) \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
287 { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
288 if (gap_end >= 0) { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
289 if ((p)->M - gap_open > (p)->I) { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
290 (cur)->It = FROM_M; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
291 (II) = (p)->M - gap_open - gap_end; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
292 } else { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
293 (cur)->It = FROM_I; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
294 (II) = (p)->I - gap_end; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
295 } \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
296 } else set_I(II, cur, p); \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
297 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
298 #define set_D(DD, cur, p) \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
299 { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
300 if ((p)->M - gap_open > (p)->D) { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
301 (cur)->Dt = FROM_M; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
302 (DD) = (p)->M - gap_open - gap_ext; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
303 } else { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
304 (cur)->Dt = FROM_D; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
305 (DD) = (p)->D - gap_ext; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
306 } \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
307 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
308 #define set_end_D(DD, cur, p) \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
309 { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
310 if (gap_end >= 0) { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
311 if ((p)->M - gap_open > (p)->D) { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
312 (cur)->Dt = FROM_M; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
313 (DD) = (p)->M - gap_open - gap_end; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
314 } else { \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
315 (cur)->Dt = FROM_D; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
316 (DD) = (p)->D - gap_end; \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
317 } \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
318 } else set_D(DD, cur, p); \
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
319 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
320
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
321 typedef struct
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
322 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
323 unsigned char Mt:3, It:2, Dt:2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
324 } dpcell_t;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
325
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
326 typedef struct
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
327 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
328 int M, I, D;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
329 } dpscore_t;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
330
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
331 /* build score profile for accelerating alignment, in theory */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
332 void aln_init_score_array(unsigned char *seq, int len, int row, int *score_matrix, int **s_array)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
333 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
334 int *tmp, *tmp2, i, k;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
335 for (i = 0; i != row; ++i) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
336 tmp = score_matrix + i * row;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
337 tmp2 = s_array[i];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
338 for (k = 0; k != len; ++k)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
339 tmp2[k] = tmp[seq[k]];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
340 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
341 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
342 /***************************
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
343 * banded global alignment *
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
344 ***************************/
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
345 int aln_global_core(unsigned char *seq1, int len1, unsigned char *seq2, int len2, const AlnParam *ap,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
346 path_t *path, int *path_len)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
347 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
348 register int i, j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
349 dpcell_t **dpcell, *q;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
350 dpscore_t *curr, *last, *s;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
351 path_t *p;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
352 int b1, b2, tmp_end;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
353 int *mat, end, max;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
354 unsigned char type, ctype;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
355
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
356 int gap_open, gap_ext, gap_end, b;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
357 int *score_matrix, N_MATRIX_ROW;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
358
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
359 /* initialize some align-related parameters. just for compatibility */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
360 gap_open = ap->gap_open;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
361 gap_ext = ap->gap_ext;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
362 gap_end = ap->gap_end;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
363 b = ap->band_width;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
364 score_matrix = ap->matrix;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
365 N_MATRIX_ROW = ap->row;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
366
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
367 if (len1 == 0 || len2 == 0) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
368 *path_len = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
369 return 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
370 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
371 /* calculate b1 and b2 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
372 if (len1 > len2) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
373 b1 = len1 - len2 + b;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
374 b2 = b;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
375 } else {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
376 b1 = b;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
377 b2 = len2 - len1 + b;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
378 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
379 if (b1 > len1) b1 = len1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
380 if (b2 > len2) b2 = len2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
381 --seq1; --seq2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
382
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
383 /* allocate memory */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
384 end = (b1 + b2 <= len1)? (b1 + b2 + 1) : (len1 + 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
385 dpcell = (dpcell_t**)malloc(sizeof(dpcell_t*) * (len2 + 1));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
386 for (j = 0; j <= len2; ++j)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
387 dpcell[j] = (dpcell_t*)malloc(sizeof(dpcell_t) * end);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
388 for (j = b2 + 1; j <= len2; ++j)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
389 dpcell[j] -= j - b2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
390 curr = (dpscore_t*)malloc(sizeof(dpscore_t) * (len1 + 1));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
391 last = (dpscore_t*)malloc(sizeof(dpscore_t) * (len1 + 1));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
392
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
393 /* set first row */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
394 SET_INF(*curr); curr->M = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
395 for (i = 1, s = curr + 1; i < b1; ++i, ++s) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
396 SET_INF(*s);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
397 set_end_D(s->D, dpcell[0] + i, s - 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
398 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
399 s = curr; curr = last; last = s;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
400
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
401 /* core dynamic programming, part 1 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
402 tmp_end = (b2 < len2)? b2 : len2 - 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
403 for (j = 1; j <= tmp_end; ++j) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
404 q = dpcell[j]; s = curr; SET_INF(*s);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
405 set_end_I(s->I, q, last);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
406 end = (j + b1 <= len1 + 1)? (j + b1 - 1) : len1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
407 mat = score_matrix + seq2[j] * N_MATRIX_ROW;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
408 ++s; ++q;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
409 for (i = 1; i != end; ++i, ++s, ++q) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
410 set_M(s->M, q, last + i - 1, mat[seq1[i]]); /* this will change s->M ! */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
411 set_I(s->I, q, last + i);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
412 set_D(s->D, q, s - 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
413 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
414 set_M(s->M, q, last + i - 1, mat[seq1[i]]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
415 set_D(s->D, q, s - 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
416 if (j + b1 - 1 > len1) { /* bug fixed, 040227 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
417 set_end_I(s->I, q, last + i);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
418 } else s->I = MINOR_INF;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
419 s = curr; curr = last; last = s;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
420 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
421 /* last row for part 1, use set_end_D() instead of set_D() */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
422 if (j == len2 && b2 != len2 - 1) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
423 q = dpcell[j]; s = curr; SET_INF(*s);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
424 set_end_I(s->I, q, last);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
425 end = (j + b1 <= len1 + 1)? (j + b1 - 1) : len1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
426 mat = score_matrix + seq2[j] * N_MATRIX_ROW;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
427 ++s; ++q;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
428 for (i = 1; i != end; ++i, ++s, ++q) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
429 set_M(s->M, q, last + i - 1, mat[seq1[i]]); /* this will change s->M ! */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
430 set_I(s->I, q, last + i);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
431 set_end_D(s->D, q, s - 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
432 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
433 set_M(s->M, q, last + i - 1, mat[seq1[i]]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
434 set_end_D(s->D, q, s - 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
435 if (j + b1 - 1 > len1) { /* bug fixed, 040227 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
436 set_end_I(s->I, q, last + i);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
437 } else s->I = MINOR_INF;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
438 s = curr; curr = last; last = s;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
439 ++j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
440 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
441
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
442 /* core dynamic programming, part 2 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
443 for (; j <= len2 - b2 + 1; ++j) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
444 SET_INF(curr[j - b2]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
445 mat = score_matrix + seq2[j] * N_MATRIX_ROW;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
446 end = j + b1 - 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
447 for (i = j - b2 + 1, q = dpcell[j] + i, s = curr + i; i != end; ++i, ++s, ++q) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
448 set_M(s->M, q, last + i - 1, mat[seq1[i]]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
449 set_I(s->I, q, last + i);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
450 set_D(s->D, q, s - 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
451 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
452 set_M(s->M, q, last + i - 1, mat[seq1[i]]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
453 set_D(s->D, q, s - 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
454 s->I = MINOR_INF;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
455 s = curr; curr = last; last = s;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
456 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
457
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
458 /* core dynamic programming, part 3 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
459 for (; j < len2; ++j) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
460 SET_INF(curr[j - b2]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
461 mat = score_matrix + seq2[j] * N_MATRIX_ROW;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
462 for (i = j - b2 + 1, q = dpcell[j] + i, s = curr + i; i < len1; ++i, ++s, ++q) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
463 set_M(s->M, q, last + i - 1, mat[seq1[i]]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
464 set_I(s->I, q, last + i);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
465 set_D(s->D, q, s - 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
466 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
467 set_M(s->M, q, last + len1 - 1, mat[seq1[i]]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
468 set_end_I(s->I, q, last + i);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
469 set_D(s->D, q, s - 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
470 s = curr; curr = last; last = s;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
471 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
472 /* last row */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
473 if (j == len2) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
474 SET_INF(curr[j - b2]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
475 mat = score_matrix + seq2[j] * N_MATRIX_ROW;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
476 for (i = j - b2 + 1, q = dpcell[j] + i, s = curr + i; i < len1; ++i, ++s, ++q) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
477 set_M(s->M, q, last + i - 1, mat[seq1[i]]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
478 set_I(s->I, q, last + i);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
479 set_end_D(s->D, q, s - 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
480 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
481 set_M(s->M, q, last + len1 - 1, mat[seq1[i]]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
482 set_end_I(s->I, q, last + i);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
483 set_end_D(s->D, q, s - 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
484 s = curr; curr = last; last = s;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
485 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
486
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
487 /* backtrace */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
488 i = len1; j = len2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
489 q = dpcell[j] + i;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
490 s = last + len1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
491 max = s->M; type = q->Mt; ctype = FROM_M;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
492 if (s->I > max) { max = s->I; type = q->It; ctype = FROM_I; }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
493 if (s->D > max) { max = s->D; type = q->Dt; ctype = FROM_D; }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
494
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
495 p = path;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
496 p->ctype = ctype; p->i = i; p->j = j; /* bug fixed 040408 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
497 ++p;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
498 do {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
499 switch (ctype) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
500 case FROM_M: --i; --j; break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
501 case FROM_I: --j; break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
502 case FROM_D: --i; break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
503 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
504 q = dpcell[j] + i;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
505 ctype = type;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
506 switch (type) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
507 case FROM_M: type = q->Mt; break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
508 case FROM_I: type = q->It; break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
509 case FROM_D: type = q->Dt; break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
510 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
511 p->ctype = ctype; p->i = i; p->j = j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
512 ++p;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
513 } while (i || j);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
514 *path_len = p - path - 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
515
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
516 /* free memory */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
517 for (j = b2 + 1; j <= len2; ++j)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
518 dpcell[j] += j - b2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
519 for (j = 0; j <= len2; ++j)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
520 free(dpcell[j]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
521 free(dpcell);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
522 free(curr); free(last);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
523
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
524 return max;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
525 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
526 /*************************************************
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
527 * local alignment combined with banded strategy *
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
528 *************************************************/
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
529 int aln_local_core(unsigned char *seq1, int len1, unsigned char *seq2, int len2, const AlnParam *ap,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
530 path_t *path, int *path_len, int _thres, int *_subo)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
531 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
532 register NT_LOCAL_SCORE *s;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
533 register int i;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
534 int q, r, qr, tmp_len, qr_shift;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
535 int **s_array, *score_array;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
536 int e, f;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
537 int is_overflow, of_base;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
538 NT_LOCAL_SCORE *eh, curr_h, last_h, curr_last_h;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
539 int j, start_i, start_j, end_i, end_j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
540 path_t *p;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
541 int score_f, score_r, score_g;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
542 int start, end, max_score;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
543 int thres, *suba, *ss;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
544
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
545 int gap_open, gap_ext, b;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
546 int *score_matrix, N_MATRIX_ROW;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
547
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
548 /* initialize some align-related parameters. just for compatibility */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
549 gap_open = ap->gap_open;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
550 gap_ext = ap->gap_ext;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
551 b = ap->band_width;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
552 score_matrix = ap->matrix;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
553 N_MATRIX_ROW = ap->row;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
554 thres = _thres > 0? _thres : -_thres;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
555
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
556 if (len1 == 0 || len2 == 0) return -1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
557
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
558 /* allocate memory */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
559 suba = (int*)malloc(sizeof(int) * (len2 + 1));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
560 eh = (NT_LOCAL_SCORE*)malloc(sizeof(NT_LOCAL_SCORE) * (len1 + 1));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
561 s_array = (int**)malloc(sizeof(int*) * N_MATRIX_ROW);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
562 for (i = 0; i != N_MATRIX_ROW; ++i)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
563 s_array[i] = (int*)malloc(sizeof(int) * len1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
564 /* initialization */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
565 aln_init_score_array(seq1, len1, N_MATRIX_ROW, score_matrix, s_array);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
566 q = gap_open;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
567 r = gap_ext;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
568 qr = q + r;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
569 qr_shift = (qr+1) << NT_LOCAL_SHIFT;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
570 tmp_len = len1 + 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
571 start_i = start_j = end_i = end_j = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
572 for (i = 0, max_score = 0; i != N_MATRIX_ROW * N_MATRIX_ROW; ++i)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
573 if (max_score < score_matrix[i]) max_score = score_matrix[i];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
574 /* convert the coordinate */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
575 --seq1; --seq2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
576 for (i = 0; i != N_MATRIX_ROW; ++i) --s_array[i];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
577
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
578 /* forward dynamic programming */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
579 for (i = 0, s = eh; i != tmp_len; ++i, ++s) *s = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
580 score_f = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
581 is_overflow = of_base = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
582 suba[0] = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
583 for (j = 1, ss = suba + 1; j <= len2; ++j, ++ss) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
584 int subo = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
585 last_h = f = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
586 score_array = s_array[seq2[j]];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
587 if (is_overflow) { /* adjust eh[] array if overflow occurs. */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
588 /* If LOCAL_OVERFLOW_REDUCE is too small, optimal alignment might be missed.
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
589 * If it is too large, this block will be excuted frequently and therefore
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
590 * slow down the whole program.
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
591 * Acually, smaller LOCAL_OVERFLOW_REDUCE might also help to reduce the
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
592 * number of assignments because it sets some cells to zero when overflow
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
593 * happens. */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
594 int tmp, tmp2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
595 score_f -= LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
596 of_base += LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
597 is_overflow = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
598 for (i = 1, s = eh; i <= tmp_len; ++i, ++s) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
599 tmp = *s >> NT_LOCAL_SHIFT; tmp2 = *s & NT_LOCAL_MASK;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
600 if (tmp2 < LOCAL_OVERFLOW_REDUCE) tmp2 = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
601 else tmp2 -= LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
602 if (tmp < LOCAL_OVERFLOW_REDUCE) tmp = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
603 else tmp -= LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
604 *s = (tmp << NT_LOCAL_SHIFT) | tmp2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
605 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
606 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
607 for (i = 1, s = eh; i != tmp_len; ++i, ++s) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
608 /* prepare for calculate current h */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
609 curr_h = (*s >> NT_LOCAL_SHIFT) + score_array[i];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
610 if (curr_h < 0) curr_h = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
611 if (last_h > 0) { /* initialize f */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
612 f = (f > last_h - q)? f - r : last_h - qr;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
613 if (curr_h < f) curr_h = f;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
614 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
615 if (*(s+1) >= qr_shift) { /* initialize e */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
616 curr_last_h = *(s+1) >> NT_LOCAL_SHIFT;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
617 e = ((*s & NT_LOCAL_MASK) > curr_last_h - q)? (*s & NT_LOCAL_MASK) - r : curr_last_h - qr;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
618 if (curr_h < e) curr_h = e;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
619 *s = (last_h << NT_LOCAL_SHIFT) | e;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
620 } else *s = last_h << NT_LOCAL_SHIFT; /* e = 0 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
621 last_h = curr_h;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
622 if (subo < curr_h) subo = curr_h;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
623 if (score_f < curr_h) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
624 score_f = curr_h; end_i = i; end_j = j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
625 if (score_f > LOCAL_OVERFLOW_THRESHOLD) is_overflow = 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
626 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
627 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
628 *s = last_h << NT_LOCAL_SHIFT;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
629 *ss = subo + of_base;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
630 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
631 score_f += of_base;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
632
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
633 if (score_f < thres) { /* no matching residue at all, 090218 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
634 *path_len = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
635 goto end_func;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
636 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
637 if (path == 0) goto end_func; /* skip path-filling */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
638
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
639 /* reverse dynamic programming */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
640 for (i = end_i, s = eh + end_i; i >= 0; --i, --s) *s = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
641 if (end_i == 0 || end_j == 0) goto end_func; /* no local match */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
642 score_r = score_matrix[seq1[end_i] * N_MATRIX_ROW + seq2[end_j]];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
643 is_overflow = of_base = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
644 start_i = end_i; start_j = end_j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
645 eh[end_i] = ((NT_LOCAL_SCORE)(qr + score_r)) << NT_LOCAL_SHIFT; /* in order to initialize f and e, 040408 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
646 start = end_i - 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
647 end = end_i - 3;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
648 if (end <= 0) end = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
649
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
650 /* second pass DP can be done in a band, speed will thus be enhanced */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
651 for (j = end_j - 1; j != 0; --j) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
652 last_h = f = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
653 score_array = s_array[seq2[j]];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
654 if (is_overflow) { /* adjust eh[] array if overflow occurs. */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
655 int tmp, tmp2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
656 score_r -= LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
657 of_base += LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
658 is_overflow = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
659 for (i = start, s = eh + start + 1; i >= end; --i, --s) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
660 tmp = *s >> NT_LOCAL_SHIFT; tmp2 = *s & NT_LOCAL_MASK;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
661 if (tmp2 < LOCAL_OVERFLOW_REDUCE) tmp2 = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
662 else tmp2 -= LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
663 if (tmp < LOCAL_OVERFLOW_REDUCE) tmp = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
664 else tmp -= LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
665 *s = (tmp << NT_LOCAL_SHIFT) | tmp2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
666 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
667 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
668 for (i = start, s = eh + start + 1; i != end; --i, --s) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
669 /* prepare for calculate current h */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
670 curr_h = (*s >> NT_LOCAL_SHIFT) + score_array[i];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
671 if (curr_h < 0) curr_h = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
672 if (last_h > 0) { /* initialize f */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
673 f = (f > last_h - q)? f - r : last_h - qr;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
674 if (curr_h < f) curr_h = f;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
675 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
676 curr_last_h = *(s-1) >> NT_LOCAL_SHIFT;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
677 e = ((*s & NT_LOCAL_MASK) > curr_last_h - q)? (*s & NT_LOCAL_MASK) - r : curr_last_h - qr;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
678 if (e < 0) e = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
679 if (curr_h < e) curr_h = e;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
680 *s = (last_h << NT_LOCAL_SHIFT) | e;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
681 last_h = curr_h;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
682 if (score_r < curr_h) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
683 score_r = curr_h; start_i = i; start_j = j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
684 if (score_r + of_base - qr == score_f) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
685 j = 1; break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
686 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
687 if (score_r > LOCAL_OVERFLOW_THRESHOLD) is_overflow = 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
688 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
689 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
690 *s = last_h << NT_LOCAL_SHIFT;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
691 /* recalculate start and end, the boundaries of the band */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
692 if ((eh[start] >> NT_LOCAL_SHIFT) <= qr) --start;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
693 if (start <= 0) start = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
694 end = start_i - (start_j - j) - (score_r + of_base + (start_j - j) * max_score) / r - 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
695 if (end <= 0) end = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
696 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
697
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
698 if (_subo) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
699 int tmp2 = 0, tmp = (int)(start_j - .33 * (end_j - start_j) + .499);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
700 for (j = 1; j <= tmp; ++j)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
701 if (tmp2 < suba[j]) tmp2 = suba[j];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
702 tmp = (int)(end_j + .33 * (end_j - start_j) + .499);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
703 for (j = tmp; j <= len2; ++j)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
704 if (tmp2 < suba[j]) tmp2 = suba[j];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
705 *_subo = tmp2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
706 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
707
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
708 if (path_len == 0) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
709 path[0].i = start_i; path[0].j = start_j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
710 path[1].i = end_i; path[1].j = end_j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
711 goto end_func;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
712 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
713
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
714 score_r += of_base;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
715 score_r -= qr;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
716
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
717 #ifdef DEBUG
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
718 /* this seems not a bug */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
719 if (score_f != score_r)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
720 fprintf(stderr, "[aln_local_core] unknown flaw occurs: score_f(%d) != score_r(%d)\n", score_f, score_r);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
721 #endif
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
722
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
723 if (_thres > 0) { /* call global alignment to fill the path */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
724 score_g = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
725 j = (end_i - start_i > end_j - start_j)? end_i - start_i : end_j - start_j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
726 ++j; /* j is the maximum band_width */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
727 for (i = ap->band_width;; i <<= 1) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
728 AlnParam ap_real = *ap;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
729 ap_real.gap_end = -1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
730 ap_real.band_width = i;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
731 score_g = aln_global_core(seq1 + start_i, end_i - start_i + 1, seq2 + start_j,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
732 end_j - start_j + 1, &ap_real, path, path_len);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
733 if (score_g == score_r || score_f == score_g) break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
734 if (i > j) break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
735 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
736 if (score_r > score_g && score_f > score_g) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
737 fprintf(stderr, "[aln_local_core] Potential bug: (%d,%d) > %d\n", score_f, score_r, score_g);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
738 score_f = score_r = -1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
739 } else score_f = score_g;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
740
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
741 /* convert coordinate */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
742 for (p = path + *path_len - 1; p >= path; --p) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
743 p->i += start_i - 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
744 p->j += start_j - 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
745 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
746 } else { /* just store the start and end */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
747 *path_len = 2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
748 path[1].i = start_i; path[1].j = start_j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
749 path->i = end_i; path->j = end_j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
750 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
751
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
752 end_func:
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
753 /* free */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
754 free(eh); free(suba);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
755 for (i = 0; i != N_MATRIX_ROW; ++i) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
756 ++s_array[i];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
757 free(s_array[i]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
758 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
759 free(s_array);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
760 return score_f;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
761 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
762 AlnAln *aln_stdaln_aux(const char *seq1, const char *seq2, const AlnParam *ap,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
763 int type, int thres, int len1, int len2)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
764 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
765 unsigned char *seq11, *seq22;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
766 int score;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
767 int i, j, l;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
768 path_t *p;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
769 char *out1, *out2, *outm;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
770 AlnAln *aa;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
771
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
772 if (len1 < 0) len1 = strlen(seq1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
773 if (len2 < 0) len2 = strlen(seq2);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
774
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
775 aa = aln_init_AlnAln();
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
776 seq11 = (unsigned char*)malloc(sizeof(unsigned char) * len1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
777 seq22 = (unsigned char*)malloc(sizeof(unsigned char) * len2);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
778 aa->path = (path_t*)malloc(sizeof(path_t) * (len1 + len2 + 1));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
779
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
780 if (ap->row < 10) { /* 4-nucleotide alignment */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
781 for (i = 0; i < len1; ++i)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
782 seq11[i] = aln_nt4_table[(int)seq1[i]];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
783 for (j = 0; j < len2; ++j)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
784 seq22[j] = aln_nt4_table[(int)seq2[j]];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
785 } else if (ap->row < 20) { /* 16-nucleotide alignment */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
786 for (i = 0; i < len1; ++i)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
787 seq11[i] = aln_nt16_table[(int)seq1[i]];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
788 for (j = 0; j < len2; ++j)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
789 seq22[j] = aln_nt16_table[(int)seq2[j]];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
790 } else { /* amino acids */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
791 for (i = 0; i < len1; ++i)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
792 seq11[i] = aln_aa_table[(int)seq1[i]];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
793 for (j = 0; j < len2; ++j)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
794 seq22[j] = aln_aa_table[(int)seq2[j]];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
795 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
796
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
797 if (type == ALN_TYPE_GLOBAL) score = aln_global_core(seq11, len1, seq22, len2, ap, aa->path, &aa->path_len);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
798 else if (type == ALN_TYPE_LOCAL) score = aln_local_core(seq11, len1, seq22, len2, ap, aa->path, &aa->path_len, thres, &aa->subo);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
799 else if (type == ALN_TYPE_EXTEND) score = aln_extend_core(seq11, len1, seq22, len2, ap, aa->path, &aa->path_len, 1, 0);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
800 else {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
801 free(seq11); free(seq22); free(aa->path);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
802 aln_free_AlnAln(aa);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
803 return 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
804 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
805 aa->score = score;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
806
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
807 if (thres > 0) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
808 out1 = aa->out1 = (char*)malloc(sizeof(char) * (aa->path_len + 1));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
809 out2 = aa->out2 = (char*)malloc(sizeof(char) * (aa->path_len + 1));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
810 outm = aa->outm = (char*)malloc(sizeof(char) * (aa->path_len + 1));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
811
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
812 --seq1; --seq2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
813 --seq11; --seq22;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
814
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
815 p = aa->path + aa->path_len - 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
816
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
817 for (l = 0; p >= aa->path; --p, ++l) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
818 switch (p->ctype) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
819 case FROM_M: out1[l] = seq1[p->i]; out2[l] = seq2[p->j];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
820 outm[l] = (seq11[p->i] == seq22[p->j] && seq11[p->i] != ap->row)? '|' : ' ';
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
821 break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
822 case FROM_I: out1[l] = '-'; out2[l] = seq2[p->j]; outm[l] = ' '; break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
823 case FROM_D: out1[l] = seq1[p->i]; out2[l] = '-'; outm[l] = ' '; break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
824 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
825 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
826 out1[l] = out2[l] = outm[l] = '\0';
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
827 ++seq11; ++seq22;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
828 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
829
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
830 free(seq11);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
831 free(seq22);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
832
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
833 p = aa->path + aa->path_len - 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
834 aa->start1 = p->i? p->i : 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
835 aa->end1 = aa->path->i;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
836 aa->start2 = p->j? p->j : 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
837 aa->end2 = aa->path->j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
838 aa->cigar32 = aln_path2cigar32(aa->path, aa->path_len, &aa->n_cigar);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
839
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
840 return aa;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
841 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
842 AlnAln *aln_stdaln(const char *seq1, const char *seq2, const AlnParam *ap, int type, int thres)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
843 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
844 return aln_stdaln_aux(seq1, seq2, ap, type, thres, -1, -1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
845 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
846
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
847 /* for backward compatibility */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
848 uint16_t *aln_path2cigar(const path_t *path, int path_len, int *n_cigar)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
849 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
850 uint32_t *cigar32;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
851 uint16_t *cigar;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
852 int i;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
853 cigar32 = aln_path2cigar32(path, path_len, n_cigar);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
854 cigar = (uint16_t*)cigar32;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
855 for (i = 0; i < *n_cigar; ++i)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
856 cigar[i] = (cigar32[i]&0xf)<<14 | (cigar32[i]>>4&0x3fff);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
857 return cigar;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
858 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
859
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
860 /* newly added functions (2009-07-21) */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
861
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
862 int aln_extend_core(unsigned char *seq1, int len1, unsigned char *seq2, int len2, const AlnParam *ap,
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
863 path_t *path, int *path_len, int G0, uint8_t *_mem)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
864 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
865 int q, r, qr, tmp_len;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
866 int32_t **s_array, *score_array;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
867 int is_overflow, of_base;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
868 uint32_t *eh;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
869 int i, j, end_i, end_j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
870 int score, start, end;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
871 int *score_matrix, N_MATRIX_ROW;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
872 uint8_t *mem, *_p;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
873
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
874 /* initialize some align-related parameters. just for compatibility */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
875 q = ap->gap_open;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
876 r = ap->gap_ext;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
877 qr = q + r;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
878 score_matrix = ap->matrix;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
879 N_MATRIX_ROW = ap->row;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
880
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
881 if (len1 == 0 || len2 == 0) return -1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
882
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
883 /* allocate memory */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
884 mem = _mem? _mem : calloc((len1 + 2) * (N_MATRIX_ROW + 1), 4);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
885 _p = mem;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
886 eh = (uint32_t*)_p, _p += 4 * (len1 + 2);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
887 s_array = calloc(N_MATRIX_ROW, sizeof(void*));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
888 for (i = 0; i != N_MATRIX_ROW; ++i)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
889 s_array[i] = (int32_t*)_p, _p += 4 * len1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
890 /* initialization */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
891 aln_init_score_array(seq1, len1, N_MATRIX_ROW, score_matrix, s_array);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
892 tmp_len = len1 + 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
893 start = 1; end = 2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
894 end_i = end_j = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
895 score = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
896 is_overflow = of_base = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
897 /* convert the coordinate */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
898 --seq1; --seq2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
899 for (i = 0; i != N_MATRIX_ROW; ++i) --s_array[i];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
900
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
901 /* dynamic programming */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
902 memset(eh, 0, 4 * (len1 + 2));
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
903 eh[1] = (uint32_t)G0<<16;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
904 for (j = 1; j <= len2; ++j) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
905 int _start, _end;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
906 int h1 = 0, f = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
907 score_array = s_array[seq2[j]];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
908 /* set start and end */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
909 _start = j - ap->band_width;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
910 if (_start < 1) _start = 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
911 if (_start > start) start = _start;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
912 _end = j + ap->band_width;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
913 if (_end > len1 + 1) _end = len1 + 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
914 if (_end < end) end = _end;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
915 if (start == end) break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
916 /* adjust eh[] array if overflow occurs. */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
917 if (is_overflow) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
918 int tmp, tmp2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
919 score -= LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
920 of_base += LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
921 is_overflow = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
922 for (i = start; i <= end; ++i) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
923 uint32_t *s = &eh[i];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
924 tmp = *s >> 16; tmp2 = *s & 0xffff;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
925 if (tmp2 < LOCAL_OVERFLOW_REDUCE) tmp2 = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
926 else tmp2 -= LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
927 if (tmp < LOCAL_OVERFLOW_REDUCE) tmp = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
928 else tmp -= LOCAL_OVERFLOW_REDUCE;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
929 *s = (tmp << 16) | tmp2;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
930 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
931 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
932 _start = _end = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
933 /* the inner loop */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
934 for (i = start; i < end; ++i) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
935 /* At the beginning of each cycle:
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
936 eh[i] -> h[j-1,i-1]<<16 | e[j,i]
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
937 f -> f[j,i]
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
938 h1 -> h[j,i-1]
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
939 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
940 uint32_t *s = &eh[i];
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
941 int h = (int)(*s >> 16);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
942 int e = *s & 0xffff; /* this is e[j,i] */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
943 *s = (uint32_t)h1 << 16; /* eh[i] now stores h[j,i-1]<<16 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
944 h += h? score_array[i] : 0; /* this is left_core() specific */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
945 /* calculate h[j,i]; don't need to test 0, as {e,f}>=0 */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
946 h = h > e? h : e;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
947 h = h > f? h : f; /* h now is h[j,i] */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
948 h1 = h;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
949 if (h > 0) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
950 if (_start == 0) _start = i;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
951 _end = i;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
952 if (score < h) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
953 score = h; end_i = i; end_j = j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
954 if (score > LOCAL_OVERFLOW_THRESHOLD) is_overflow = 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
955 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
956 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
957 /* calculate e[j+1,i] and f[j,i+1] */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
958 h -= qr;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
959 h = h > 0? h : 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
960 e -= r;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
961 e = e > h? e : h;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
962 f -= r;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
963 f = f > h? f : h;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
964 *s |= e;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
965 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
966 eh[end] = h1 << 16;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
967 /* recalculate start and end, the boundaries of the band */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
968 if (_end <= 0) break; /* no cell in this row has a positive score */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
969 start = _start;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
970 end = _end + 3;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
971 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
972
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
973 score += of_base - 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
974 if (score <= 0) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
975 if (path_len) *path_len = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
976 goto end_left_func;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
977 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
978
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
979 if (path == 0) goto end_left_func;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
980
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
981 if (path_len == 0) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
982 path[0].i = end_i; path[0].j = end_j;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
983 goto end_left_func;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
984 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
985
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
986 { /* call global alignment to fill the path */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
987 int score_g = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
988 j = (end_i - 1 > end_j - 1)? end_i - 1 : end_j - 1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
989 ++j; /* j is the maximum band_width */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
990 for (i = ap->band_width;; i <<= 1) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
991 AlnParam ap_real = *ap;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
992 ap_real.gap_end = -1;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
993 ap_real.band_width = i;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
994 score_g = aln_global_core(seq1 + 1, end_i, seq2 + 1, end_j, &ap_real, path, path_len);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
995 if (score == score_g) break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
996 if (i > j) break;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
997 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
998 if (score > score_g)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
999 fprintf(stderr, "[aln_left_core] no suitable bandwidth: %d < %d\n", score_g, score);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1000 score = score_g;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1001 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1002
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1003 end_left_func:
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1004 /* free */
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1005 free(s_array);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1006 if (!_mem) free(mem);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1007 return score;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1008 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1009
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1010 uint32_t *aln_path2cigar32(const path_t *path, int path_len, int *n_cigar)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1011 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1012 int i, n;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1013 uint32_t *cigar;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1014 unsigned char last_type;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1015
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1016 if (path_len == 0 || path == 0) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1017 *n_cigar = 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1018 return 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1019 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1020
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1021 last_type = path->ctype;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1022 for (i = n = 1; i < path_len; ++i) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1023 if (last_type != path[i].ctype) ++n;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1024 last_type = path[i].ctype;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1025 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1026 *n_cigar = n;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1027 cigar = (uint32_t*)malloc(*n_cigar * 4);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1028
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1029 cigar[0] = 1u << 4 | path[path_len-1].ctype;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1030 last_type = path[path_len-1].ctype;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1031 for (i = path_len - 2, n = 0; i >= 0; --i) {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1032 if (path[i].ctype == last_type) cigar[n] += 1u << 4;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1033 else {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1034 cigar[++n] = 1u << 4 | path[i].ctype;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1035 last_type = path[i].ctype;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1036 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1037 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1038
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1039 return cigar;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1040 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1041
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1042 #ifdef STDALN_MAIN
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1043 int main()
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1044 {
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1045 AlnAln *aln_local, *aln_global, *aln_left;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1046 int i;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1047
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1048 aln_local = aln_stdaln("CGTGCGATGCactgCATACGGCTCGCCTAGATCA", "AAGGGATGCTCTGCATCgCTCGGCTAGCTGT", &aln_param_blast, 0, 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1049 aln_global = aln_stdaln("CGTGCGATGCactgCATACGGCTCGCCTAGATCA", "AAGGGATGCTCTGCATCGgCTCGGCTAGCTGT", &aln_param_blast, 1, 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1050 // aln_left = aln_stdaln( "GATGCACTGCATACGGCTCGCCTAGATCA", "GATGCTCTGCATCGgCTCGGCTAGCTGT", &aln_param_blast, 2, 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1051 aln_left = aln_stdaln("CACCTTCGACTCACGTCTCATTCTCGGAGTCGAGTGGACGGTCCCTCATACACGAACAGGTTC",
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1052 "CACCTTCGACTTTCACCTCTCATTCTCGGACTCGAGTGGACGGTCCCTCATCCAAGAACAGGGTCTGTGAAA", &aln_param_blast, 2, 1);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1053
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1054 printf(">%d,%d\t%d,%d\n", aln_local->start1, aln_local->end1, aln_local->start2, aln_local->end2);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1055 printf("%s\n%s\n%s\n", aln_local->out1, aln_local->outm, aln_local->out2);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1056
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1057 printf(">%d,%d\t%d,%d\t", aln_global->start1, aln_global->end1, aln_global->start2, aln_global->end2);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1058 for (i = 0; i != aln_global->n_cigar; ++i)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1059 printf("%d%c", aln_global->cigar32[i]>>4, "MID"[aln_global->cigar32[i]&0xf]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1060 printf("\n%s\n%s\n%s\n", aln_global->out1, aln_global->outm, aln_global->out2);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1061
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1062 printf(">%d\t%d,%d\t%d,%d\t", aln_left->score, aln_left->start1, aln_left->end1, aln_left->start2, aln_left->end2);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1063 for (i = 0; i != aln_left->n_cigar; ++i)
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1064 printf("%d%c", aln_left->cigar32[i]>>4, "MID"[aln_left->cigar32[i]&0xf]);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1065 printf("\n%s\n%s\n%s\n", aln_left->out1, aln_left->outm, aln_left->out2);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1066
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1067 aln_free_AlnAln(aln_local);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1068 aln_free_AlnAln(aln_global);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1069 aln_free_AlnAln(aln_left);
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1070 return 0;
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1071 }
acc2ca1a3ba4 Uploaded
siyuan
parents:
diff changeset
1072 #endif