annotate mrfast-2.1.0.5/MrFAST.c @ 1:d4054b05b015 default tip

Version update to 2.1.0.5
author calkan
date Fri, 09 Mar 2012 07:35:51 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2 * Copyright (c) <2008 - 2012>, University of Washington, Simon Fraser University
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3 * All rights reserved.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4 *
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without modification,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6 * are permitted provided that the following conditions are met:
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7 *
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
8 * Redistributions of source code must retain the above copyright notice, this list
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
9 * of conditions and the following disclaimer.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
10 * - Redistributions in binary form must reproduce the above copyright notice, this
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
11 * list of conditions and the following disclaimer in the documentation and/or other
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
12 * materials provided with the distribution.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
13 * - Neither the names of the University of Washington, Simon Fraser University,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
14 * nor the names of its contributors may be
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
15 * used to endorse or promote products derived from this software without specific
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
16 * prior written permission.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
17 *
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
29 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
30
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
31 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
32 Authors:
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
33 Farhad Hormozdiari
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
34 Faraz Hach
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
35 Can Alkan
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
36 Emails:
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
37 farhadh AT uw DOT edu
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
38 fhach AT cs DOT sfu DOT ca
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
39 calkan AT uw DOT edu
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
40 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
41
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
42 #include <stdio.h>
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
43 #include <stdlib.h>
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
44 #include <string.h>
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
45 #include <math.h>
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
46 #include <dirent.h>
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
47 #include <xmmintrin.h>
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
48 #include <emmintrin.h>
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
49 #include <mmintrin.h>
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
50
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
51
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
52 #include "Common.h"
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
53 #include "Reads.h"
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
54 #include "HashTable.h"
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
55 #include "Output.h"
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
56 #include "MrFAST.h"
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
57 #include "RefGenome.h"
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
58
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
59
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
60 #define min(a,b) ((a)>(b)?(b):(a))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
61 #define min3(a,b,c) ((a)>(b)?(b>c?c:b):(a>c?c:a))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
62 #define CHARCODE(a) (a=='A' ? 0 : (a=='C' ? 1 : (a=='G' ? 2 : (a=='T' ? 3 : 4))))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
63
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
64 #define MAX_REF_SIZE 18
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
65
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
66
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
67 float calculateScore(int index, char *seq, char *qual, char *md);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
68 unsigned char mrFAST = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
69 char *versionNumberF="0.5";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
70
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
71 long long verificationCnt = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
72 long long mappingCnt = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
73 long long mappedSeqCnt = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
74 long long completedSeqCnt = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
75 char *mappingOutput;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
76 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
77 char *_msf_refGen = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
78 int _msf_refGenLength = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
79 int _msf_refGenOffset = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
80 char *_msf_refGenName = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
81
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
82 int _msf_refGenBeg;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
83 int _msf_refGenEnd;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
84
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
85 IHashTable *_msf_hashTable = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
86
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
87 int *_msf_samplingLocs;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
88 int *_msf_samplingLocsEnds;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
89 int _msf_samplingLocsSize;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
90
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
91 Read *_msf_seqList;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
92 int _msf_seqListSize;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
93
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
94 Pair *_msf_sort_seqList = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
95 int *_msf_map_sort_seqList;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
96
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
97 ReadIndexTable *_msf_rIndex = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
98 int _msf_rIndexSize;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
99 int _msf_rIndexMax;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
100
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
101 SAM _msf_output;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
102
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
103 OPT_FIELDS *_msf_optionalFields;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
104
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
105 char *_msf_op;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
106
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
107 int *_msf_verifiedLocs = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
108
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
109 char _msf_numbers[200][3];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
110 char _msf_cigar[5];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
111
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
112 MappingInfo *_msf_mappingInfo;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
113
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
114 int *_msf_seqHits;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
115 int _msf_openFiles = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
116 int _msf_maxLSize=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
117 int _msf_maxRSize=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
118
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
119 BestFullMappingInfo *bestHitMappingInfo;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
120
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
121 /*************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
122 int _msf_maxFile=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
123 char _msf_fileName[4000][200][2][FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
124 int _msf_fileCount[4000];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
125
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
126 char *_msf_readHasConcordantMapping; //boolean if a read has concordant mapping :D
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
127
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
128 int *_msf_oeaMapping;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
129 int *_msf_discordantMapping;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
130
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
131 FILE *bestConcordantFILE;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
132 FILE *bestDiscordantFILE;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
133
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
134 int counter = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
135
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
136 int scoreF[200][200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
137 int scoreB[200][200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
138
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
139 int score[200][200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
140 int direction1[200][200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
141 int direction2[200][200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
142
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
143 __m128i MASK;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
144
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
145 int lookUpTable[15625][15625];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
146
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
147 /**************************************************Methods***************************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
148 int smallEditDistanceF(char *a, int lena, char *b, int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
149 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
150 int matrix[20][20];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
151 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
152 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
153
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
154 for(i = 0; i <= lena; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
155 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
156 matrix[0][i] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
157 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
158
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
159 for(i = 0; i <= lenb; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
160 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
161 matrix[i][0] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
162 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
163
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
164
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
165 for(i = 1; i <= lenb; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
166 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
167 for(j = 1; j <= lena; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
168 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
169 matrix[i][j] = min3(matrix[i-1][j-1]+ (a[j-1] != b[i-1]),matrix[i][j-1]+1 ,matrix[i-1][j]+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
170 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
171 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
172 return (matrix[lenb][lena]>errThreshold?-1:matrix[lenb][lena]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
173 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
174
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
175 int smallEditDistanceB(char *a, int lena, char *b, int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
176 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
177 int matrix[20][20];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
178 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
179 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
180
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
181 for(i = 0; i <= lena; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
182 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
183 matrix[0][i] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
184 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
185
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
186 for(i = 0; i <= lenb; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
187 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
188 matrix[i][0] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
189 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
190
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
191
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
192 for(i = 1; i <= lenb; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
193 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
194 for(j = 1; j <= lena; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
195 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
196 matrix[i][j] = min3(matrix[i-1][j-1]+ (*(a-j+1) != *(b-i+1)),matrix[i][j-1]+1 ,matrix[i-1][j]+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
197 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
198 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
199
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
200 return (matrix[lenb][lena]>errThreshold?-1:matrix[lenb][lena]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
201 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
202
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
203 char fastEditDistance(int per1, int per2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
204 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
205
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
206 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
207 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
208
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
209 char str1[7];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
210 char str2[7];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
211
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
212 int val1 = per1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
213 int val2 = per2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
214
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
215 int index = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
216 int mod = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
217
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
218 int matrix[7][7];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
219
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
220 int min = 20;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
221
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
222 while(index < 6)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
223 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
224 mod = val1%5;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
225 str1[5-index] = (mod==0 ? 'A':(mod==1?'C':mod==2?'G':(mod==3)?'T':'N'));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
226 val1 = val1 /5;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
227 index++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
228 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
229
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
230 str1[6] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
231
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
232 index = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
233 while(index < 6)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
234 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
235 mod=val2%5;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
236 str2[5-index] = (mod==0 ? 'A':(mod==1?'C':mod==2?'G':(mod==3)?'T':'N'));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
237 val2 = val2 / 5;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
238 index++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
239 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
240 str2[6] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
241
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
242 for(i = 0; i < 7; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
243 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
244 matrix[0][i] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
245 matrix[i][0] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
246 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
247
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
248 for(i = 1; i < 7; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
249 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
250 for(j = 1; j < 7; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
251 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
252 matrix[i][j] = min3(matrix[i-1][j-1]+ (str1[i-1] != str2[j-1]),matrix[i][j-1]+1 ,matrix[i-1][j]+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
253 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
254 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
255
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
256 for(i = 0; i < 7; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
257 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
258 if(matrix[i][6] < min)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
259 min = matrix[i][6];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
260 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
261
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
262 for(i = 0; i < 7; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
263 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
264 if(matrix[6][i] < min)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
265 min = matrix[6][i];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
266 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
267 return min;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
268 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
269
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
270 void initLookUpTable()
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
271 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
272 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
273
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
274 MASK = _mm_insert_epi16(MASK,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
275 MASK = _mm_insert_epi16(MASK,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
276 MASK = _mm_insert_epi16(MASK,1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
277 MASK = _mm_insert_epi16(MASK,1,3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
278 MASK = _mm_insert_epi16(MASK,1,4);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
279 MASK = _mm_insert_epi16(MASK,0,5);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
280 MASK = _mm_insert_epi16(MASK,0,6);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
281 MASK = _mm_insert_epi16(MASK,0,7);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
282
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
283 for(i = 0 ; i < errThreshold + 1; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
284 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
285 scoreF[0][i] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
286 scoreF[i][0] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
287 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
288
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
289 for(i = 0 ; i < errThreshold + 1; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
290 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
291 scoreB[0][i] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
292 scoreB[i][0] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
293 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
294
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
295
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
296 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
297
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
298 int backwardEditDistanceSSE2Odd(char *a, int lena, char *b,int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
299 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
300 if(lenb == 0 || lena == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
301 return 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
302
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
303 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
304 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
305 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
306
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
307
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
308 int e = errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
309
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
310 char flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
311
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
312 int minError = 2*e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
313
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
314 __m128i R0, R1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
315 __m128i Diag;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
316 __m128i Side1, Side2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
317 __m128i Down1, Down2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
318 __m128i Error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
319 __m128i tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
320
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
321 /* initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
322 R0 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
323 R1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
324 Diag = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
325 Side1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
326 Side2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
327 Down1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
328 Down2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
329 Error = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
330 tmp = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
331 /* end initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
332
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
333 if(lenb <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
334 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
335 return smallEditDistanceB(a,lena,b,lenb);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
336 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
337
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
338
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
339 R1 = _mm_xor_si128(R1, R1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
340 R0 = _mm_xor_si128(R0, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
341
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
342 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
343 Side1 = _mm_xor_si128(Side1, Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
344 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
345
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
346 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
347
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
348 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
349 Side1 = _mm_insert_epi16(Side1,2*e,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
350
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
351 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
352 Down1 = _mm_insert_epi16(Down1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
353 Down1 = _mm_insert_epi16(Down1,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
354
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
355 R0 = _mm_insert_epi16(R0,0,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
356
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
357 R1 = _mm_insert_epi16(R1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
358 R1 = _mm_insert_epi16(R1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
359
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
360 for(i=2; i <= e; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
361 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
362 //set side
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
363 Side1 = _mm_slli_si128(Side1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
364 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
365
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
366 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
367 Down1 = _mm_slli_si128(Down1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
368 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
369
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
370 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
371 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
372 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
373 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
374
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
375 for(j=1;j<=i-1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
376 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
377 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
378 Diag = _mm_insert_epi16(Diag, *(b-(i/2-1+(i/2-j))) != *(a-(i/2-1-(i/2-j))),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
379 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
380 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
381 Diag = _mm_insert_epi16(Diag, 2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
382
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
383 R0 = _mm_min_epi16(R1+Side1, _mm_slli_si128(R0,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
384 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
385 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
386
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
387 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
388 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
389 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
390 for(j=i/2-1;j>=-i/2;j--)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
391 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
392 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
393 Diag = _mm_insert_epi16(Diag, *(b-((i+1)/2+j-1)) != *(a-((i-1)/2-j-1)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
394 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
395 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
396 Diag = _mm_insert_epi16(Diag, 2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
397
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
398 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
399 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
400 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
401 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
402 Error = _mm_xor_si128(Error, Error);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
403 Side2 = _mm_xor_si128(Side2, Side2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
404 Down2 = _mm_xor_si128(Down2, Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
405 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
406
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
407 Error = _mm_insert_epi16(Error,e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
408 Side1 = _mm_insert_epi16(Side2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
409 Side2 = _mm_insert_epi16(Side2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
410 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
411
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
412
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
413 for(j=0; j < e; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
414 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
415 Side2 = _mm_slli_si128(Side2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
416 Side2 = _mm_insert_epi16(Side2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
417
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
418 Side1 = _mm_slli_si128(Side1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
419 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
420
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
421 Down1 = _mm_slli_si128(Down1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
422 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
423
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
424 Down2 = _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
425 Down2 = _mm_insert_epi16(Down2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
426
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
427 Error = _mm_slli_si128(Error, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
428 Error = _mm_insert_epi16(Error, e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
429 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
430
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
431 Down2= _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
432 Down2 = _mm_insert_epi16(Down2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
433
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
434 for(; i <= 2*lenb-(e-1);i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
435 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
436 flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
437 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
438 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
439 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
440 for(j=e/2;j>=-e/2;j--)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
441 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
442 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
443 Diag = _mm_insert_epi16(Diag, *(b-(i/2-1+j)) != *(a-(i/2-1-j)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
444 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
445
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
446 R0 = _mm_min_epi16(_mm_srli_si128(R1,2)+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
447 R0 = _mm_min_epi16(R0, R1+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
448
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
449
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
450 if(_mm_extract_epi16(R0,0) <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
451 flag = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
452 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
453 for(j=0; j <= e;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
454 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
455 if(_mm_extract_epi16(tmp,0) <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
456 flag = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
457 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
458 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
459
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
460 if(flag == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
461 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
462
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
463 if(i == 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
464 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
465 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
466 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
467 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
468 minError = _mm_extract_epi16(tmp,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
469 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
470
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
471 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
472
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
473 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
474 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
475 for(j=e/2;j>=-e/2-1;j--)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
476 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
477 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
478 Diag = _mm_insert_epi16(Diag, *(b-((i+1)/2+j-1)) != *(a-((i)/2-j-1)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
479 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
480
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
481 // printf("@%d %d %d %d\n", _mm_extract_epi16(Diag,0), _mm_extract_epi16(Diag,1), _mm_extract_epi16(Diag,2),
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
482 // _mm_extract_epi16(Diag,3));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
483
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
484 R1 = _mm_min_epi16(R0+Side2, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
485
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
486 // printf("#~%d %d %d %d\n", _mm_extract_epi16(R1,0), _mm_extract_epi16(R1,1), _mm_extract_epi16(R1,2),
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
487 // _mm_extract_epi16(R1,3));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
488
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
489 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
490
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
491 // printf("$%d %d %d %d\n", _mm_extract_epi16(Side2,0), _mm_extract_epi16(Side2,1), _mm_extract_epi16(Side2,2),
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
492 // _mm_extract_epi16(Side2,3));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
493
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
494 // printf("#%d %d %d %d\n", _mm_extract_epi16(R1,0), _mm_extract_epi16(R1,1), _mm_extract_epi16(R1,2),
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
495 // _mm_extract_epi16(R1,3));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
496
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
497
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
498
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
499 if(i >= 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
500 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
501 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
502 for(k=0; k < e-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
503 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
504 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
505 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
506 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
507 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
508
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
509 //first cell
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
510 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
511 Diag = _mm_insert_epi16(Diag, *(b-(lenb-3)) != *(a-lena), 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
512 Diag = _mm_insert_epi16(Diag, *(b-(lenb-2)) != *(a-(lena-1)), 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
513 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1)) != *(a-(lena-2)), 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
514 Diag = _mm_insert_epi16(Diag, 2*e, 3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
515 R1 = _mm_min_epi16(R0+Side2, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
516 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
517
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
518 minError = min(minError, _mm_extract_epi16(R1,2));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
519
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
520 //second cell
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
521 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
522 Diag = _mm_insert_epi16(Diag, *(b-(lenb-2)) != *(a-(lena)), 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
523 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1)) != *(a-(lena-1)), 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
524 Diag = _mm_insert_epi16(Diag, 2*e, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
525
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
526 R0 = _mm_min_epi16(_mm_srli_si128(R1,2)+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
527 R0 = _mm_min_epi16(R0, R1+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
528
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
529 minError = min(minError, _mm_extract_epi16(R0,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
530
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
531 //third cell
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
532 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
533 Diag = _mm_insert_epi16(Diag, *(b-(lenb-2)) != *(a-(lena+1)), 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
534 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1)) != *(a-(lena)), 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
535 Diag = _mm_insert_epi16(Diag, 2*e, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
536
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
537 R1 = _mm_min_epi16(R0+Side2, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
538 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
539
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
540 minError = min(minError, _mm_extract_epi16(R1,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
541
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
542 //forth
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
543 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
544 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1)) != *(a-(lena+1)), 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
545 Diag = _mm_insert_epi16(Diag, 2*e, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
546
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
547 R0 = _mm_min_epi16(_mm_srli_si128(R1,2)+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
548 R0 = _mm_min_epi16(R0, R1+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
549
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
550 minError = min(minError, _mm_extract_epi16(R0,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
551
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
552 //fifth
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
553 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
554 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1)) != *(a-(lena+2)), 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
555 Diag = _mm_insert_epi16(Diag, 2*e, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
556
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
557 R1 = _mm_min_epi16(R0+Side2, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
558 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
559
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
560 minError = min(minError, _mm_extract_epi16(R0,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
561
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
562 if(minError > e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
563 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
564 return minError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
565 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
566
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
567 int backwardEditDistanceSSE2G(char *a, int lena, char *b,int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
568 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
569 if(lenb == 0 || lena == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
570 return 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
571
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
572 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
573 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
574 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
575
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
576
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
577 int e = errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
578
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
579 char flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
580
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
581 int minError = 2*e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
582
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
583 __m128i R0, R1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
584 __m128i Diag;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
585 __m128i Side1, Side2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
586 __m128i Down1, Down2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
587 __m128i Error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
588 __m128i tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
589
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
590 /* initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
591 R0 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
592 R1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
593 Diag = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
594 Side1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
595 Side2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
596 Down1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
597 Down2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
598 Error = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
599 tmp = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
600 /* end initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
601
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
602 if(lenb <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
603 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
604 return smallEditDistanceB(a,lena,b,lenb);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
605 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
606
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
607
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
608 R1 = _mm_xor_si128(R1, R1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
609 R0 = _mm_xor_si128(R0, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
610
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
611 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
612 Side1 = _mm_xor_si128(Side1, Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
613 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
614
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
615 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
616
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
617 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
618 Side1 = _mm_insert_epi16(Side1,2*e,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
619
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
620 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
621 Down1 = _mm_insert_epi16(Down1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
622 Down1 = _mm_insert_epi16(Down1,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
623
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
624 R0 = _mm_insert_epi16(R0,0,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
625
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
626 R1 = _mm_insert_epi16(R1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
627 R1 = _mm_insert_epi16(R1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
628
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
629 for(i=2; i <= e; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
630 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
631 //set side
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
632 Side1 = _mm_slli_si128(Side1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
633 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
634
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
635 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
636 Down1 = _mm_slli_si128(Down1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
637 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
638
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
639 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
640 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
641 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
642 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
643
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
644 for(j=1;j<=i-1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
645 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
646 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
647 Diag = _mm_insert_epi16(Diag, *(b-(i/2-1+(i/2-j))) != *(a-(i/2-1-(i/2-j))),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
648 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
649 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
650 Diag = _mm_insert_epi16(Diag, 2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
651
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
652 R0 = _mm_min_epi16(R1+Side1, _mm_slli_si128(R0,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
653 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
654 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
655
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
656 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
657 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
658 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
659 for(j=i/2-1;j>=-i/2;j--)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
660 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
661 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
662 Diag = _mm_insert_epi16(Diag, *(b-((i+1)/2+j-1)) != *(a-((i-1)/2-j-1)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
663 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
664 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
665 Diag = _mm_insert_epi16(Diag, 2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
666
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
667 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
668 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
669 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
670 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
671 Error = _mm_xor_si128(Error, Error);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
672 Side2 = _mm_xor_si128(Side2, Side2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
673 Down2 = _mm_xor_si128(Down2, Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
674 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
675
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
676 Error = _mm_insert_epi16(Error,e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
677 Side2 = _mm_insert_epi16(Side2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
678 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
679
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
680
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
681 for(j=0; j < e; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
682 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
683 Side2 = _mm_slli_si128(Side2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
684 Side2 = _mm_insert_epi16(Side2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
685
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
686 Down1 = _mm_slli_si128(Down1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
687 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
688
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
689 Down2 = _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
690 Down2 = _mm_insert_epi16(Down2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
691
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
692 Error = _mm_slli_si128(Error, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
693 Error = _mm_insert_epi16(Error, e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
694 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
695
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
696 Down2= _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
697 Down2 = _mm_insert_epi16(Down2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
698
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
699 for(; i <= 2*lenb-(e-1);i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
700 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
701 flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
702 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
703 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
704 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
705 for(j=e/2;j>=-e/2;j--)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
706 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
707 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
708 Diag = _mm_insert_epi16(Diag, *(b-(i/2-1+j)) != *(a-(i/2-1-j)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
709 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
710
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
711 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
712 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
713
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
714 if(_mm_extract_epi16(R0,0) <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
715 flag = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
716 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
717 for(j=0; j <= e;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
718 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
719 if(_mm_extract_epi16(tmp,0) <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
720 flag = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
721 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
722 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
723
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
724 if(flag == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
725 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
726
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
727 if(i == 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
728 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
729 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
730 for(k=0; k < e-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
731 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
732 minError = _mm_extract_epi16(tmp,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
733 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
734
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
735 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
736
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
737 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
738 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
739 for(j=-e/2+1;j<=e/2;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
740 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
741 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
742 Diag = _mm_insert_epi16(Diag, *(b-((i+1)/2-j-1)) != *(a-((i-1)/2+j-1)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
743 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
744
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
745 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
746 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
747
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
748
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
749 if(i >= 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
750 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
751 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
752 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
753 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
754 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
755 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
756 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
757 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
758
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
759 j=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
760 int tmpE = e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
761 for(;j<2*(e-2)+1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
762 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
763
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
764 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
765 //set the first element
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
766 if(j==0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
767 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
768 for( k=0;k<=e-1;k++ )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
769 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
770 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
771 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1-k)) != *(a-((i-lenb)-1+k)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
772 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
773
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
774 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
775 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
776
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
777
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
778 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
779 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
780 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
781 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
782 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
783 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
784 else if(j%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
785 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
786 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
787 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
788 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
789 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1-k)) != *(a-((i-lenb)-1+k)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
790 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
791
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
792 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
793 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
794
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
795 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
796
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
797 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
798 for(k=0; k < tmpE-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
799 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
800 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
801 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
802
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
803
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
804 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
805 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
806 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
807 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
808 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
809 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1-k)) != *(a-((i-lenb)-1+k)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
810 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
811
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
812 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
813 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
814
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
815 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
816 for(k=0; k < tmpE-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
817 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
818 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
819 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
820 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
821 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
822 //Diag
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
823
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
824 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
825 Diag = _mm_insert_epi16(Diag, 2*e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
826 Diag = _mm_insert_epi16(Diag, *(a-(lenb+e-2)) != *(b-(lenb-1)), 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
827
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
828 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
829 Side1 = _mm_insert_epi16(Side1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
830
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
831 Down1 = _mm_insert_epi16(Down1, 2*e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
832 Down1 = _mm_insert_epi16(Down1, 1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
833
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
834 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
835 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
836
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
837 minError = min(minError, _mm_extract_epi16(R1,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
838
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
839 Diag = _mm_insert_epi16(Diag, *(a-(lenb+e-1)) != *(b-(lenb-1)), 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
840 Down1 = _mm_insert_epi16(Down1, 1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
841
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
842 R0 = _mm_min_epi16(R1+Down1,R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
843 R0 = _mm_min_epi16(R0,_mm_srli_si128(R1,2)+Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
844
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
845 minError = min(minError, _mm_extract_epi16(R0,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
846
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
847 if(minError > e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
848 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
849 return minError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
850 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
851
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
852 inline int backwardEditDistanceSSE2Extention(char *a, int lena, char *b,int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
853 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
854 if(lenb == 0 || lena == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
855 return 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
856
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
857 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
858 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
859 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
860
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
861 int i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
862 int i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
863 int i2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
864 int i4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
865 int i5;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
866
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
867 int e = 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
868 int mismatch = errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
869
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
870 int minError = 2*errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
871 int index = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
872 int tmpValue = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
873
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
874 if(lenb <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
875 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
876 return smallEditDistanceB(a,lena,b,lenb);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
877 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
878
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
879
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
880 __m128i R0, R1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
881 __m128i Diag;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
882 __m128i Side1, Side2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
883 __m128i Down1, Down2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
884 __m128i tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
885 __m128i SeqA, SeqB;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
886 __m128i Result;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
887
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
888 /* initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
889 R0 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
890 R1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
891 Diag = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
892 Side1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
893 Side2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
894 Down1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
895 Down2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
896 SeqA = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
897 SeqB = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
898 Result = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
899 /* end initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
900
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
901 R1 = _mm_xor_si128(R1, R1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
902 R0 = _mm_xor_si128(R0, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
903
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
904 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
905 Diag = _mm_insert_epi16(Diag,minError,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
906
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
907 i0 = (a[0] != b[0]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
908 i1 = min(i0, ( *(a-1)!=*b) )+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
909 i2 = min(i0,( a[0] != *(b-1) ) )+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
910
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
911 i0 = min3( i0+ ( *(a-1)!=*(b-1) ),i1+1,i2+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
912 i4 = min(i1, ( *(a-2)!=b[0] )+1)+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
913 i5 = min(i2, (a[0] != *(b-2))+1)+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
914
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
915 R1 = _mm_insert_epi16(R1, 3, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
916 R1 = _mm_insert_epi16(R1, i1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
917 R1 = _mm_insert_epi16(R1, i2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
918 R1 = _mm_insert_epi16(R1, 3, 3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
919
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
920
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
921 R0 = _mm_insert_epi16(R0, 4, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
922 R0 = _mm_insert_epi16(R0, i4, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
923 R0 = _mm_insert_epi16(R0, i0, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
924 R0 = _mm_insert_epi16(R0, i5, 3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
925 R0 = _mm_insert_epi16(R0, 4, 4);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
926
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
927
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
928 Side2 = _mm_xor_si128(Side2, Side2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
929 Down2 = _mm_xor_si128(Down2, Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
930 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
931 Side1 = _mm_xor_si128(Side1, Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
932
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
933 Side2 = _mm_insert_epi16(Side2,minError,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
934 Down1 = _mm_insert_epi16(Down1,minError,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
935
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
936 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
937
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
938 index = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
939 for(j=0; j < e; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
940 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
941 Side2 = _mm_slli_si128(Side2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
942 Side2 = _mm_insert_epi16(Side2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
943
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
944 Down1 = _mm_slli_si128(Down1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
945 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
946
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
947 Down2 = _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
948 Down2 = _mm_insert_epi16(Down2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
949
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
950 Side1 = _mm_slli_si128(Side1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
951 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
952
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
953 SeqA = _mm_slli_si128(SeqA, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
954 SeqB = _mm_slli_si128(SeqB, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
955 SeqA = _mm_insert_epi16(SeqA,*(a-index),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
956 SeqB = _mm_insert_epi16(SeqB,*(b-index),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
957 index++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
958 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
959
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
960 Down2= _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
961 Down2 = _mm_insert_epi16(Down2,minError,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
962
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
963 index = 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
964 i = 5;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
965
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
966 int loopEnd = 2*lenb-(e-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
967 for(; i <= loopEnd ;i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
968 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
969
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
970 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
971 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
972 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
973 SeqA = _mm_slli_si128(SeqA, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
974 SeqB = _mm_slli_si128(SeqB, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
975 SeqA = _mm_insert_epi16(SeqA,*(a-(index)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
976 SeqB = _mm_insert_epi16(SeqB,*(b-(index)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
977
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
978 index++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
979
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
980 tmp = _mm_shufflelo_epi16(SeqB,27);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
981 tmp = _mm_slli_si128(tmp, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
982 tmpValue = _mm_extract_epi16(tmp, 5);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
983 tmp = _mm_insert_epi16(tmp, tmpValue, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
984
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
985 Result = _mm_cmpeq_epi16(SeqA, tmp);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
986 Diag = _mm_andnot_si128(Result, MASK);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
987
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
988 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
989 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
990
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
991 if(_mm_extract_epi16(R0, 0) > errThreshold && _mm_extract_epi16(R0, 1) > errThreshold && _mm_extract_epi16(R0, 2) > errThreshold
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
992 && _mm_extract_epi16(R0, 3) > errThreshold && _mm_extract_epi16(R0, 4) > errThreshold && _mm_extract_epi16(R1, 0) > errThreshold
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
993 && _mm_extract_epi16(R1, 1) > errThreshold && _mm_extract_epi16(R1, 2) > errThreshold && _mm_extract_epi16(R1, 3) > errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
994 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
995
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
996 if(i == 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
997 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
998 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
999 for(k=0; k < e-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1000 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1001 minError = _mm_extract_epi16(tmp,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1002 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1003
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1004 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1005
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1006 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1007 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1008 Result = _mm_cmpeq_epi16(SeqA, _mm_shufflelo_epi16(SeqB,27));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1009 Diag = _mm_andnot_si128(Result, MASK);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1010
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1011 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1012 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1013
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1014
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1015 if(i >= 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1016 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1017 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1018 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1019 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1020 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1021 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1022 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1023
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1024
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1025 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1026
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1027 j=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1028 int tmpE = e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1029 for(;j<2*(e-2)+1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1030 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1031
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1032 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1033 //set the first element
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1034 if(j==0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1035 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1036 for( k=0;k<=e-1;k++ )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1037 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1038 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1039 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1-k)) != *(a-((i-lenb)-1+k)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1040 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1041
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1042 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1043 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1044
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1045 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1046
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1047 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1048 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1049 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1050 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1051 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1052 else if(j%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1053 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1054 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1055 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1056 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1057 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1-k)) != *(a-((i-lenb)-1+k)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1058 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1059
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1060 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1061 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1062
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1063 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1064
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1065 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1066 for(k=0; k < tmpE-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1067 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1068 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1069 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1070
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1071
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1072 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1073 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1074 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1075 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1076 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1077 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1-k)) != *(a-((i-lenb)-1+k)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1078 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1079
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1080 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1081 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1082
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1083 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1084 for(k=0; k < tmpE-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1085 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1086 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1087 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1088 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1089 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1090 //Diag
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1091
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1092 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1093 Diag = _mm_insert_epi16(Diag, 2*errThreshold, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1094 Diag = _mm_insert_epi16(Diag, *(a-(lenb+e-2)) != *(b-(lenb-1)), 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1095
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1096 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1097 Side1 = _mm_insert_epi16(Side1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1098
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1099 Down1 = _mm_insert_epi16(Down1, 2*errThreshold, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1100 Down1 = _mm_insert_epi16(Down1, 1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1101
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1102 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1103 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1104
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1105 minError = min(minError, _mm_extract_epi16(R1,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1106
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1107 Diag = _mm_insert_epi16(Diag, *(a-(lenb+e-1)) != *(b-(lenb-1)), 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1108 Down1 = _mm_insert_epi16(Down1, 1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1109
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1110 R0 = _mm_min_epi16(R1+Down1,R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1111 R0 = _mm_min_epi16(R0,_mm_srli_si128(R1,2)+Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1112
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1113 minError = min(minError, _mm_extract_epi16(R0,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1114
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1115 if(minError > mismatch)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1116 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1117 return minError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1118 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1119
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1120 int backwardEditDistance4SSE2(char *a, int lena, char *b,int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1121 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1122 if(lenb == 0 || lena == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1123 return 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1124
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1125 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1126 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1127 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1128
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1129 int i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1130 int i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1131 int i2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1132 int i4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1133 int i5;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1134
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1135 int e = errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1136
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1137 int minError = 2*e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1138 int index = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1139 int tmpValue = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1140
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1141 if(lenb <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1142 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1143 return smallEditDistanceB(a,lena,b,lenb);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1144 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1145
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1146 __m128i R0, R1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1147 __m128i Diag;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1148 __m128i Side1, Side2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1149 __m128i Down1, Down2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1150 __m128i tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1151 __m128i SeqA, SeqB;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1152 __m128i Result;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1153
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1154 /* initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1155 R0 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1156 R1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1157 Diag = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1158 Side1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1159 Side2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1160 Down1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1161 Down2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1162 SeqA = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1163 SeqB = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1164 Result = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1165 /* end initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1166
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1167 R1 = _mm_xor_si128(R1, R1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1168 R0 = _mm_xor_si128(R0, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1169
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1170 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1171 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1172
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1173 i0 = (a[0] != b[0]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1174 i1 = min(i0, ( *(a-1)!=*b) )+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1175 i2 = min(i0,( a[0] != *(b-1) ) )+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1176
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1177 i0 = min3( i0+ ( *(a-1)!=*(b-1) ),i1+1,i2+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1178 i4 = min(i1, ( *(a-2)!=b[0] )+1)+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1179 i5 = min(i2, (a[0] != *(b-2))+1)+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1180
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1181 R1 = _mm_insert_epi16(R1, 3, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1182 R1 = _mm_insert_epi16(R1, i1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1183 R1 = _mm_insert_epi16(R1, i2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1184 R1 = _mm_insert_epi16(R1, 3, 3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1185
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1186
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1187 R0 = _mm_insert_epi16(R0, 4, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1188 R0 = _mm_insert_epi16(R0, i4, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1189 R0 = _mm_insert_epi16(R0, i0, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1190 R0 = _mm_insert_epi16(R0, i5, 3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1191 R0 = _mm_insert_epi16(R0, 4, 4);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1192
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1193 Side2 = _mm_xor_si128(Side2, Side2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1194 Down2 = _mm_xor_si128(Down2, Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1195 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1196 Side1 = _mm_xor_si128(Side1, Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1197
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1198 Side2 = _mm_insert_epi16(Side2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1199 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1200
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1201 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1202
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1203 index = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1204 for(j=0; j < e; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1205 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1206 Side2 = _mm_slli_si128(Side2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1207 Side2 = _mm_insert_epi16(Side2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1208
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1209 Down1 = _mm_slli_si128(Down1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1210 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1211
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1212 Down2 = _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1213 Down2 = _mm_insert_epi16(Down2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1214
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1215 Side1 = _mm_slli_si128(Side1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1216 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1217
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1218 SeqA = _mm_slli_si128(SeqA, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1219 SeqB = _mm_slli_si128(SeqB, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1220 SeqA = _mm_insert_epi16(SeqA,*(a-index),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1221 SeqB = _mm_insert_epi16(SeqB,*(b-index),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1222 index++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1223 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1224
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1225 Down2= _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1226 Down2 = _mm_insert_epi16(Down2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1227
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1228 index = 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1229 i = 5;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1230 int loopEnd = 2*lenb-(e-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1231 for(; i <= loopEnd ;i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1232 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1233
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1234 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1235 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1236 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1237 SeqA = _mm_slli_si128(SeqA, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1238 SeqB = _mm_slli_si128(SeqB, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1239 SeqA = _mm_insert_epi16(SeqA,*(a-(index)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1240 SeqB = _mm_insert_epi16(SeqB,*(b-(index)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1241
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1242 index++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1243
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1244 tmp = _mm_shufflelo_epi16(SeqB,27);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1245 tmp = _mm_slli_si128(tmp, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1246 tmpValue = _mm_extract_epi16(tmp, 5);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1247 tmp = _mm_insert_epi16(tmp, tmpValue, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1248
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1249 Result = _mm_cmpeq_epi16(SeqA, tmp);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1250 Diag = _mm_andnot_si128(Result, MASK);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1251
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1252 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1253 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1254
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1255 //tmp = _mm_sub_epi16(Error, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1256 //i0 = _mm_movemask_epi8(tmp);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1257
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1258 if( _mm_extract_epi16(R0, 0) > e && _mm_extract_epi16(R0, 1) > e && _mm_extract_epi16(R0, 2) > e
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1259 && _mm_extract_epi16(R0, 3) > e && _mm_extract_epi16(R0, 4) > e && _mm_extract_epi16(R1, 0) > e &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1260 _mm_extract_epi16(R1, 1) > e && _mm_extract_epi16(R1, 2) > e && _mm_extract_epi16(R1, 3) > e )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1261 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1262
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1263 if(i == 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1264 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1265 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1266 for(k=0; k < e-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1267 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1268 minError = _mm_extract_epi16(tmp,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1269 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1270
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1271 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1272
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1273 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1274 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1275 Result = _mm_cmpeq_epi16(SeqA, _mm_shufflelo_epi16(SeqB,27));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1276 Diag = _mm_andnot_si128(Result, MASK);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1277
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1278 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1279 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1280
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1281 if(i >= 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1282 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1283 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1284 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1285 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1286 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1287 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1288 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1289
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1290
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1291 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1292
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1293 j=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1294
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1295 int tmpE = e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1296
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1297 for(;j<2*(e-2)+1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1298 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1299
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1300 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1301 //set the first element
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1302 if(j==0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1303 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1304 for( k=0;k<=e-1;k++ )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1305 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1306 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1307 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1-k)) != *(a-((i-lenb)-1+k)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1308 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1309
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1310 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1311 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1312
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1313 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1314
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1315 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1316 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1317 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1318 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1319 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1320 else if(j%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1321 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1322 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1323 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1324 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1325 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1-k)) != *(a-((i-lenb)-1+k)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1326 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1327
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1328 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1329 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1330
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1331 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1332
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1333 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1334 for(k=0; k < tmpE-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1335 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1336 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1337 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1338
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1339
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1340 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1341 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1342 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1343 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1344 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1345 Diag = _mm_insert_epi16(Diag, *(b-(lenb-1-k)) != *(a-((i-lenb)-1+k)),0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1346 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1347
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1348 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1349 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1350
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1351 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1352 for(k=0; k < tmpE-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1353 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1354 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1355 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1356 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1357 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1358 //Diag
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1359
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1360 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1361 Diag = _mm_insert_epi16(Diag, 2*e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1362 Diag = _mm_insert_epi16(Diag, *(a-(lenb+e-2)) != *(b-(lenb-1)), 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1363
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1364 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1365 Side1 = _mm_insert_epi16(Side1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1366
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1367 Down1 = _mm_insert_epi16(Down1, 2*e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1368 Down1 = _mm_insert_epi16(Down1, 1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1369
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1370 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1371 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1372
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1373 minError = min(minError, _mm_extract_epi16(R1,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1374
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1375 Diag = _mm_insert_epi16(Diag, *(a-(lenb+e-1)) != *(b-(lenb-1)), 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1376 Down1 = _mm_insert_epi16(Down1, 1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1377
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1378 R0 = _mm_min_epi16(R1+Down1,R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1379 R0 = _mm_min_epi16(R0,_mm_srli_si128(R1,2)+Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1380
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1381 minError = min(minError, _mm_extract_epi16(R0,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1382
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1383 if(minError > e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1384 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1385 return minError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1386 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1387
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1388 inline int forwardEditDistanceSSE2Extention(char *a, int lena, char *b,int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1389 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1390 if(lenb == 0 || lena == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1391 return 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1392
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1393 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1394 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1395 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1396
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1397 int i0=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1398 int i1=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1399 int i2=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1400 int i4=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1401 int i5=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1402
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1403 int mismatch = errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1404 int e = 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1405
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1406 int minError = 4*mismatch+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1407 int index = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1408 int tmpValue = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1409
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1410 if(lenb <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1411 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1412 return smallEditDistanceF(a,lena,b,lenb);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1413 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1414
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1415
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1416 register __m128i R0, R1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1417 __m128i Diag;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1418 __m128i Side1, Side2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1419 __m128i Down1, Down2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1420 __m128i tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1421 register __m128i SeqA, SeqB;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1422 __m128i Result;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1423
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1424 __m128i tmpSeqA;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1425 __m128i tmpSeqB;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1426
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1427 /* initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1428 R0 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1429 R1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1430 Diag = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1431 Side1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1432 Side2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1433 Down1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1434 Down2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1435 SeqA = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1436 SeqB = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1437 Result = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1438 /* end initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1439
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1440
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1441 R1 = _mm_xor_si128(R1, R1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1442 R0 = _mm_xor_si128(R0, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1443
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1444 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1445 Diag = _mm_insert_epi16(Diag,minError,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1446
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1447 i0 = (a[0] != b[0]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1448 i1 = min(i0, (a[1]!=b[0]))+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1449 i2 = min(i0,(a[0]!=b[1]))+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1450
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1451 i0 = min3(i0+(a[1]!=b[1]),i1+1,i2+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1452 i4 = min(i1, (a[2]!=b[0])+1)+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1453 i5 = min(i2, (a[0]!=b[2])+1)+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1454
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1455 R1 = _mm_insert_epi16(R1, 3, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1456 R1 = _mm_insert_epi16(R1, i1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1457 R1 = _mm_insert_epi16(R1, i2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1458 R1 = _mm_insert_epi16(R1, 3, 3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1459
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1460 R0 = _mm_insert_epi16(R0, 4, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1461 R0 = _mm_insert_epi16(R0, i4, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1462 R0 = _mm_insert_epi16(R0, i0, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1463 R0 = _mm_insert_epi16(R0, i5, 3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1464 R0 = _mm_insert_epi16(R0, 4, 4);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1465
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1466 Side2 = _mm_xor_si128(Side2, Side2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1467 Down2 = _mm_xor_si128(Down2, Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1468 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1469 Side1 = _mm_xor_si128(Side1, Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1470
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1471 Side2 = _mm_insert_epi16(Side2,minError,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1472 Down1 = _mm_insert_epi16(Down1,minError,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1473
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1474 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1475
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1476 index = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1477 for(j=0; j < e; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1478 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1479 Side2 = _mm_slli_si128(Side2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1480 Side2 = _mm_insert_epi16(Side2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1481
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1482 Down1 = _mm_slli_si128(Down1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1483 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1484
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1485 Down2 = _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1486 Down2 = _mm_insert_epi16(Down2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1487
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1488 Side1 = _mm_slli_si128(Side1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1489 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1490
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1491 SeqA = _mm_slli_si128(SeqA, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1492 SeqB = _mm_slli_si128(SeqB, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1493 SeqA = _mm_insert_epi16(SeqA,a[index],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1494 SeqB = _mm_insert_epi16(SeqB,b[index],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1495 index++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1496 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1497
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1498 Down2= _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1499 Down2 = _mm_insert_epi16(Down2,minError,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1500
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1501 index = 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1502 i = 5;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1503
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1504 int loopEnd = 2*lenb-(e-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1505 for(; i <= loopEnd ;i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1506 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1507 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1508 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1509 tmpSeqA = _mm_slli_si128(SeqA, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1510 tmpSeqB = _mm_slli_si128(SeqB, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1511 SeqA = _mm_insert_epi16(tmpSeqA,a[index],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1512 SeqB = _mm_insert_epi16(tmpSeqB,b[index],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1513
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1514 index++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1515
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1516 tmp = _mm_shufflelo_epi16(SeqB,27);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1517 tmp = _mm_slli_si128(tmp, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1518 tmpValue = _mm_extract_epi16(tmp, 5);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1519 tmp = _mm_insert_epi16(tmp, tmpValue, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1520
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1521 Result = _mm_cmpeq_epi16(SeqA, tmp);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1522 Diag = _mm_andnot_si128(Result, MASK);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1523
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1524 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1525 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1526
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1527 if(_mm_extract_epi16(R0, 0) > errThreshold && _mm_extract_epi16(R0, 1) > errThreshold && _mm_extract_epi16(R0, 2) > errThreshold
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1528 && _mm_extract_epi16(R0, 3) > errThreshold && _mm_extract_epi16(R0, 4) > errThreshold &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1529 _mm_extract_epi16(R1, 0) > errThreshold && _mm_extract_epi16(R1, 1) > errThreshold &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1530 _mm_extract_epi16(R1, 2) > errThreshold && _mm_extract_epi16(R1, 3) > errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1531 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1532
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1533 if(i == 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1534 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1535 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1536 for(k=0; k < e-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1537 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1538 minError = _mm_extract_epi16(tmp,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1539 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1540
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1541 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1542
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1543 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1544 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1545 Result = _mm_cmpeq_epi16(SeqA, _mm_shufflelo_epi16(SeqB,27));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1546 Diag = _mm_andnot_si128(Result, MASK);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1547
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1548 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1549 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1550
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1551 if(i >= 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1552 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1553 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1554 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1555 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1556 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1557 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1558 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1559 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1560
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1561 j=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1562 int tmpE = e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1563 for(;j<2*(e-2)+1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1564 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1565
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1566 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1567 //set the first element
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1568 if(j==0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1569 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1570 for( k=0;k<=e-1;k++ )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1571 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1572 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1573 Diag = _mm_insert_epi16(Diag, b[lenb-1-k] != a[(i-lenb)-1+k],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1574 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1575
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1576 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1577 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1578
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1579 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1580
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1581 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1582 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1583 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1584 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1585 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1586 else if(j%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1587 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1588 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1589 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1590 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1591 Diag = _mm_insert_epi16(Diag, b[lenb-1-k] != a[(i-lenb)-1+k],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1592 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1593
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1594 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1595 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1596
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1597 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1598
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1599 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1600 for(k=0; k < tmpE-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1601 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1602 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1603 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1604
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1605
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1606 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1607 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1608 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1609 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1610 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1611 Diag = _mm_insert_epi16(Diag, b[lenb-1-k] != a[(i-lenb)-1+k],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1612 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1613
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1614 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1615 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1616
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1617 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1618 for(k=0; k < tmpE-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1619 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1620 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1621 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1622 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1623 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1624 //Diag
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1625
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1626 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1627 Diag = _mm_insert_epi16(Diag, minError, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1628 Diag = _mm_insert_epi16(Diag, a[lenb+e-2] != b[lenb-1], 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1629
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1630 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1631 Side1 = _mm_insert_epi16(Side1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1632
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1633 Down1 = _mm_insert_epi16(Down1, minError, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1634 Down1 = _mm_insert_epi16(Down1, 1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1635
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1636 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1637 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1638
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1639 minError = min(minError, _mm_extract_epi16(R1,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1640
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1641 Diag = _mm_insert_epi16(Diag, a[lenb+e-1] != b[lenb-1], 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1642 Down1 = _mm_insert_epi16(Down1, 1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1643
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1644 R0 = _mm_min_epi16(R1+Down1,R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1645 R0 = _mm_min_epi16(R0,_mm_srli_si128(R1,2)+Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1646
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1647
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1648 minError = min(minError, _mm_extract_epi16(R0,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1649
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1650
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1651 if(minError > mismatch)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1652 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1653 return minError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1654 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1655
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1656
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1657
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1658 int forwardEditDistance4SSE2(char *a, int lena, char *b,int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1659 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1660 if(lenb == 0 || lena == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1661 return 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1662
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1663 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1664 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1665 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1666
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1667 int i0=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1668 int i1=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1669 int i2=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1670 int i4=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1671 int i5=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1672
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1673 int e = errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1674
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1675 int minError = 2*e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1676 int index = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1677 int tmpValue = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1678
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1679 if(lenb <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1680 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1681 return smallEditDistanceF(a,lena,b,lenb);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1682 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1683
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1684
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1685 register __m128i R0, R1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1686 __m128i Diag;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1687 __m128i Side1, Side2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1688 __m128i Down1, Down2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1689 __m128i tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1690 register __m128i SeqA, SeqB;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1691 __m128i Result;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1692
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1693 __m128i tmpSeqA;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1694 __m128i tmpSeqB;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1695
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1696 /* initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1697 R0 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1698 R1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1699 Diag = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1700 Side1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1701 Side2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1702 Down1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1703 Down2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1704 SeqA = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1705 SeqB = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1706 Result = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1707 /* end initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1708
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1709 R1 = _mm_xor_si128(R1, R1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1710 R0 = _mm_xor_si128(R0, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1711
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1712 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1713 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1714
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1715 i0 = (a[0] != b[0]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1716 i1 = min(i0, (a[1]!=b[0]))+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1717 i2 = min(i0,(a[0]!=b[1]))+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1718
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1719 i0 = min3(i0+(a[1]!=b[1]),i1+1,i2+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1720 i4 = min(i1, (a[2]!=b[0])+1)+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1721 i5 = min(i2, (a[0]!=b[2])+1)+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1722
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1723 R1 = _mm_insert_epi16(R1, 3, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1724 R1 = _mm_insert_epi16(R1, i1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1725 R1 = _mm_insert_epi16(R1, i2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1726 R1 = _mm_insert_epi16(R1, 3, 3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1727
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1728 R0 = _mm_insert_epi16(R0, 4, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1729 R0 = _mm_insert_epi16(R0, i4, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1730 R0 = _mm_insert_epi16(R0, i0, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1731 R0 = _mm_insert_epi16(R0, i5, 3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1732 R0 = _mm_insert_epi16(R0, 4, 4);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1733
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1734 Side2 = _mm_xor_si128(Side2, Side2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1735 Down2 = _mm_xor_si128(Down2, Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1736 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1737 Side1 = _mm_xor_si128(Side1, Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1738
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1739 Side2 = _mm_insert_epi16(Side2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1740 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1741
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1742 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1743
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1744 index = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1745 for(j=0; j < e; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1746 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1747 Side2 = _mm_slli_si128(Side2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1748 Side2 = _mm_insert_epi16(Side2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1749
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1750 Down1 = _mm_slli_si128(Down1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1751 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1752
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1753 Down2 = _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1754 Down2 = _mm_insert_epi16(Down2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1755
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1756 Side1 = _mm_slli_si128(Side1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1757 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1758
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1759 SeqA = _mm_slli_si128(SeqA, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1760 SeqB = _mm_slli_si128(SeqB, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1761 SeqA = _mm_insert_epi16(SeqA,a[index],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1762 SeqB = _mm_insert_epi16(SeqB,b[index],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1763 index++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1764 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1765
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1766 Down2= _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1767 Down2 = _mm_insert_epi16(Down2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1768
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1769 index = 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1770 i = 5;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1771
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1772 int loopEnd = 2*lenb-(e-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1773 for(; i <= loopEnd ;i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1774 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1775 //Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1776 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1777 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1778 tmpSeqA = _mm_slli_si128(SeqA, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1779 tmpSeqB = _mm_slli_si128(SeqB, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1780 SeqA = _mm_insert_epi16(tmpSeqA,a[index],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1781 SeqB = _mm_insert_epi16(tmpSeqB,b[index],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1782
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1783 index++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1784
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1785 tmp = _mm_shufflelo_epi16(SeqB,27);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1786 tmp = _mm_slli_si128(tmp, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1787 tmpValue = _mm_extract_epi16(tmp, 5);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1788 tmp = _mm_insert_epi16(tmp, tmpValue, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1789
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1790 Result = _mm_cmpeq_epi16(SeqA, tmp);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1791 Diag = _mm_andnot_si128(Result, MASK);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1792
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1793 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1794 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1795
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1796 if(_mm_extract_epi16(R0, 0) > e && _mm_extract_epi16(R0, 1) > e && _mm_extract_epi16(R0, 2) > e
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1797 && _mm_extract_epi16(R0, 3) > e && _mm_extract_epi16(R0, 4) > e && _mm_extract_epi16(R1, 0) > e &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1798 _mm_extract_epi16(R1, 1) > e && _mm_extract_epi16(R1, 2) > e && _mm_extract_epi16(R1, 3) > e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1799 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1800
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1801 if(i == 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1802 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1803 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1804 for(k=0; k < e-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1805 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1806 minError = _mm_extract_epi16(tmp,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1807 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1808
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1809 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1810
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1811 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1812 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1813 Result = _mm_cmpeq_epi16(SeqA, _mm_shufflelo_epi16(SeqB,27));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1814 Diag = _mm_andnot_si128(Result, MASK);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1815
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1816 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1817 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1818
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1819 if(i >= 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1820 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1821 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1822 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1823 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1824 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1825 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1826 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1827
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1828
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1829 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1830 j=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1831 int tmpE = e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1832 for(;j<2*(e-2)+1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1833 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1834
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1835 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1836 //set the first element
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1837 if(j==0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1838 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1839 for( k=0;k<=e-1;k++ )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1840 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1841 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1842 Diag = _mm_insert_epi16(Diag, b[lenb-1-k] != a[(i-lenb)-1+k],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1843 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1844
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1845 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1846 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1847
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1848 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1849
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1850 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1851 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1852 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1853 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1854 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1855 else if(j%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1856 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1857 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1858 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1859 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1860 Diag = _mm_insert_epi16(Diag, b[lenb-1-k] != a[(i-lenb)-1+k],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1861 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1862
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1863 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1864 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1865
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1866 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1867
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1868 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1869 for(k=0; k < tmpE-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1870 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1871 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1872 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1873
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1874
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1875 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1876 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1877 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1878 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1879 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1880 Diag = _mm_insert_epi16(Diag, b[lenb-1-k] != a[(i-lenb)-1+k],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1881 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1882
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1883 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1884 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1885
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1886 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1887 for(k=0; k < tmpE-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1888 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1889 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1890 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1891 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1892 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1893 //Diag
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1894
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1895 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1896 Diag = _mm_insert_epi16(Diag, 2*e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1897 Diag = _mm_insert_epi16(Diag, a[lenb+e-2] != b[lenb-1], 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1898
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1899 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1900 Side1 = _mm_insert_epi16(Side1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1901
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1902 Down1 = _mm_insert_epi16(Down1, 2*e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1903 Down1 = _mm_insert_epi16(Down1, 1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1904
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1905 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1906 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1907
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1908 minError = min(minError, _mm_extract_epi16(R1,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1909
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1910 Diag = _mm_insert_epi16(Diag, a[lenb+e-1] != b[lenb-1], 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1911 Down1 = _mm_insert_epi16(Down1, 1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1912
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1913 R0 = _mm_min_epi16(R1+Down1,R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1914 R0 = _mm_min_epi16(R0,_mm_srli_si128(R1,2)+Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1915
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1916 minError = min(minError, _mm_extract_epi16(R0,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1917
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1918 if(minError > e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1919 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1920 return minError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1921 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1922
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1923 int forwardEditDistanceSSE2Odd(char *a, int lena, char *b,int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1924 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1925 if(lenb == 0 || lena == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1926 return 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1927
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1928 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1929 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1930 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1931
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1932 int e = errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1933
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1934 int minError = 2*e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1935
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1936 char flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1937
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1938 if(lenb <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1939 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1940 return smallEditDistanceF(a,lena,b,lenb);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1941 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1942
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1943
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1944 __m128i R0, R1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1945 __m128i Diag;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1946 __m128i Side1, Side2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1947 __m128i Down1, Down2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1948 __m128i Error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1949 __m128i tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1950
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1951 /* initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1952 R0 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1953 R1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1954 Diag = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1955 Side1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1956 Side2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1957 Down1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1958 Down2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1959 Error = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1960 tmp = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1961 /* end initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1962
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1963 R1 = _mm_xor_si128(R1, R1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1964 R0 = _mm_xor_si128(R0, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1965
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1966 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1967 Side1 = _mm_xor_si128(Side1, Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1968 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1969
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1970 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1971
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1972 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1973 Side1 = _mm_insert_epi16(Side1,2*e,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1974
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1975 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1976 Down1 = _mm_insert_epi16(Down1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1977 Down1 = _mm_insert_epi16(Down1,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1978
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1979 R0 = _mm_insert_epi16(R0,0,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1980
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1981 R1 = _mm_insert_epi16(R1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1982 R1 = _mm_insert_epi16(R1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1983
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1984 for(i=2; i <= e; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1985 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1986 //set side
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1987 Side1 = _mm_slli_si128(Side1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1988 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1989
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1990 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1991 Down1 = _mm_slli_si128(Down1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1992 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1993
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1994 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1995 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1996 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1997 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1998
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
1999 for(j=1;j<=i-1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2000 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2001 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2002 Diag = _mm_insert_epi16(Diag, b[i/2-1+(i/2-j)] != a[i/2-1-(i/2-j)],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2003 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2004 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2005 Diag = _mm_insert_epi16(Diag, 2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2006
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2007 R0 = _mm_min_epi16(R1+Side1, _mm_slli_si128(R0,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2008 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2009
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2010 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2011
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2012 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2013 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2014 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2015 for(j=i/2-1;j>=-i/2;j--)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2016 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2017 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2018 Diag = _mm_insert_epi16(Diag, b[(i+1)/2+j-1] != a[(i-1)/2-j-1],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2019 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2020 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2021 Diag = _mm_insert_epi16(Diag, 2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2022
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2023 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2024 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2025
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2026 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2027 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2028 Error = _mm_xor_si128(Error, Error);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2029 Side2 = _mm_xor_si128(Side2, Side2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2030 Side1 = _mm_xor_si128(Side1, Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2031 Down2 = _mm_xor_si128(Down2, Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2032 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2033
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2034
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2035 Error = _mm_insert_epi16(Error,e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2036 Side2 = _mm_insert_epi16(Side2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2037 Side1 = _mm_insert_epi16(Side2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2038 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2039
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2040
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2041 for(j=0; j < e; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2042 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2043 Side2 = _mm_slli_si128(Side2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2044 Side2 = _mm_insert_epi16(Side2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2045
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2046 Side1 = _mm_slli_si128(Side1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2047 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2048
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2049 Down1 = _mm_slli_si128(Down1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2050 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2051
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2052 Down2 = _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2053 Down2 = _mm_insert_epi16(Down2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2054
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2055 Error = _mm_slli_si128(Error, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2056 Error = _mm_insert_epi16(Error, e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2057 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2058
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2059 Down2= _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2060 Down2 = _mm_insert_epi16(Down2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2061
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2062 for(; i <= 2*lenb-(e-1);i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2063 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2064 flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2065 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2066 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2067 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2068 for(j=e/2;j>=-e/2;j--)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2069 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2070 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2071 Diag = _mm_insert_epi16(Diag, b[i/2-1+j] != a[i/2-1-j],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2072 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2073
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2074
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2075 R0 = _mm_min_epi16(_mm_srli_si128(R1,2)+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2076 R0 = _mm_min_epi16(R0, R1+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2077
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2078 if(_mm_extract_epi16(R0,0) <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2079 flag = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2080
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2081 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2082 for(j=0; j < e-1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2083 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2084 if(_mm_extract_epi16(tmp,0) <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2085 flag = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2086 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2087 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2088 // printf("#%d %d %d\n", _mm_extract_epi16(R0,0), _mm_extract_epi16(R0,1), _mm_extract_epi16(R0,2));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2089 if(flag == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2090 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2091
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2092 if(i == 2*lenb-(e-1))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2093 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2094 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2095 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2096 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2097 minError = _mm_extract_epi16(tmp,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2098 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2099
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2100 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2101
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2102 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2103 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2104 for(j=e/2;j>=-e/2-1;j--)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2105 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2106 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2107 Diag = _mm_insert_epi16(Diag, b[(i+1)/2+j-1] != a[(i)/2-j-1],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2108 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2109
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2110 R1 = _mm_min_epi16(R0+Side2, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2111 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2112
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2113 //printf("#%d %d %d %d\n", _mm_extract_epi16(R1,0), _mm_extract_epi16(R1,1), _mm_extract_epi16(R1,2),
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2114 // _mm_extract_epi16(R1,3));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2115
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2116 if(i >= 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2117 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2118 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2119 for(k=0; k < e-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2120 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2121 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2122 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2123 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2124 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2125
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2126 //first cell
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2127 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2128 Diag = _mm_insert_epi16(Diag, b[lenb-3] != a[lena], 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2129 Diag = _mm_insert_epi16(Diag, b[lenb-2] != a[lena-1], 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2130 Diag = _mm_insert_epi16(Diag, b[lenb-1] != a[lena-2], 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2131 Diag = _mm_insert_epi16(Diag, 2*e, 3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2132 R1 = _mm_min_epi16(R0+Side2, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2133 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2134
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2135
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2136 minError = min(minError, _mm_extract_epi16(R1,2));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2137
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2138 //second cell
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2139 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2140 Diag = _mm_insert_epi16(Diag, b[lenb-2] != a[lena], 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2141 Diag = _mm_insert_epi16(Diag, b[lenb-1] != a[lena-1], 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2142 Diag = _mm_insert_epi16(Diag, 2*e, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2143
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2144 R0 = _mm_min_epi16(_mm_srli_si128(R1,2)+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2145 R0 = _mm_min_epi16(R0, R1+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2146
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2147
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2148 minError = min(minError, _mm_extract_epi16(R0,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2149
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2150 //third cell
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2151 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2152 Diag = _mm_insert_epi16(Diag, b[lenb-2] != a[lena+1], 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2153 Diag = _mm_insert_epi16(Diag, b[lenb-1] != a[lena], 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2154 Diag = _mm_insert_epi16(Diag, 2*e, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2155
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2156 R1 = _mm_min_epi16(R0+Side2, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2157 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2158
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2159
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2160 minError = min(minError, _mm_extract_epi16(R1,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2161
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2162 //forth
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2163 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2164 Diag = _mm_insert_epi16(Diag, b[lenb-1] != a[lena+1], 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2165 Diag = _mm_insert_epi16(Diag, 2*e, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2166
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2167 R0 = _mm_min_epi16(_mm_srli_si128(R1,2)+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2168 R0 = _mm_min_epi16(R0, R1+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2169
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2170 minError = min(minError, _mm_extract_epi16(R0,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2171
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2172 //fifth
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2173 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2174 Diag = _mm_insert_epi16(Diag, b[lenb-1] != a[lena+2], 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2175 Diag = _mm_insert_epi16(Diag, 2*e, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2176
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2177 R1 = _mm_min_epi16(R0+Side2, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2178 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2179
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2180
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2181 minError = min(minError, _mm_extract_epi16(R1,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2182
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2183 if(minError > e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2184 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2185 return minError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2186
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2187 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2188
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2189 int forwardEditDistanceSSE2G(char *a, int lena, char *b,int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2190 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2191 if(lenb == 0 || lena == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2192 return 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2193
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2194 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2195 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2196 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2197
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2198 int e = errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2199
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2200 int minError = 2*e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2201
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2202 char flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2203
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2204 if(lenb <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2205 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2206 return smallEditDistanceF(a,lena,b,lenb);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2207 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2208
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2209
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2210 __m128i R0, R1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2211 __m128i Diag;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2212 __m128i Side1, Side2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2213 __m128i Down1, Down2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2214 __m128i Error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2215 __m128i tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2216
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2217 /* initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2218 R0 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2219 R1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2220 Diag = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2221 Side1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2222 Side2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2223 Down1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2224 Down2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2225 Error = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2226 tmp = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2227 /* end initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2228
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2229 R1 = _mm_xor_si128(R1, R1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2230 R0 = _mm_xor_si128(R0, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2231
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2232 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2233 Side1 = _mm_xor_si128(Side1, Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2234 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2235
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2236 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2237
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2238 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2239 Side1 = _mm_insert_epi16(Side1,2*e,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2240
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2241 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2242 Down1 = _mm_insert_epi16(Down1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2243 Down1 = _mm_insert_epi16(Down1,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2244
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2245 R0 = _mm_insert_epi16(R0,0,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2246
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2247 R1 = _mm_insert_epi16(R1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2248 R1 = _mm_insert_epi16(R1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2249
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2250 for(i=2; i <= e; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2251 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2252 //set side
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2253 Side1 = _mm_slli_si128(Side1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2254 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2255
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2256 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2257 Down1 = _mm_slli_si128(Down1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2258 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2259
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2260 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2261 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2262 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2263 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2264
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2265 for(j=1;j<=i-1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2266 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2267 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2268 Diag = _mm_insert_epi16(Diag, b[i/2-1+(i/2-j)] != a[i/2-1-(i/2-j)],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2269 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2270 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2271 Diag = _mm_insert_epi16(Diag, 2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2272
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2273 R0 = _mm_min_epi16(R1+Side1, _mm_slli_si128(R0,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2274 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2275 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2276
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2277 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2278 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2279 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2280 for(j=i/2-1;j>=-i/2;j--)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2281 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2282 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2283 Diag = _mm_insert_epi16(Diag, b[(i+1)/2+j-1] != a[(i-1)/2-j-1],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2284 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2285 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2286 Diag = _mm_insert_epi16(Diag, 2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2287
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2288 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2289 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2290 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2291 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2292 Error = _mm_xor_si128(Error, Error);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2293 Side2 = _mm_xor_si128(Side2, Side2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2294 Down2 = _mm_xor_si128(Down2, Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2295 Down1 = _mm_xor_si128(Down1, Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2296
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2297 Error = _mm_insert_epi16(Error,e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2298 Side2 = _mm_insert_epi16(Side2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2299 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2300
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2301
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2302 for(j=0; j < e; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2303 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2304 Side2 = _mm_slli_si128(Side2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2305 Side2 = _mm_insert_epi16(Side2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2306
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2307 Down1 = _mm_slli_si128(Down1, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2308 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2309
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2310 Down2 = _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2311 Down2 = _mm_insert_epi16(Down2,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2312
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2313 Error = _mm_slli_si128(Error, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2314 Error = _mm_insert_epi16(Error, e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2315 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2316
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2317 Down2= _mm_slli_si128(Down2, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2318 Down2 = _mm_insert_epi16(Down2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2319
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2320 for(; i <= 2*lenb-(e-1);i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2321 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2322 flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2323 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2324 if( i%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2325 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2326 for(j=e/2;j>=-e/2;j--)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2327 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2328 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2329 Diag = _mm_insert_epi16(Diag, b[i/2-1+j] != a[i/2-1-j],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2330 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2331
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2332 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2333 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2334
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2335
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2336 if(_mm_extract_epi16(R0,0) <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2337 flag = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2338
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2339 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2340 for(j=0; j < e-1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2341 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2342 if(_mm_extract_epi16(tmp,0) <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2343 flag = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2344 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2345 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2346
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2347
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2348 if(flag == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2349 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2350
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2351 if(i == 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2352 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2353 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2354 for(k=0; k < e-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2355 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2356 minError = _mm_extract_epi16(tmp,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2357 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2358
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2359 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2360
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2361 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2362 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2363 for(j=-e/2+1;j<=e/2;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2364 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2365 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2366 Diag = _mm_insert_epi16(Diag, b[(i+1)/2-j-1] != a[(i-1)/2+j-1],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2367 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2368
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2369 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2370 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2371
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2372 if(i >= 2*lenb-e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2373 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2374 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2375 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2376 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2377 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2378 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2379 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2380 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2381
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2382 j=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2383 int tmpE = e;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2384 for(;j<2*(e-2)+1;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2385 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2386
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2387 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2388 //set the first element
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2389 if(j==0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2390 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2391 for( k=0;k<=e-1;k++ )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2392 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2393 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2394 Diag = _mm_insert_epi16(Diag, b[lenb-1-k] != a[(i-lenb)-1+k],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2395 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2396
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2397 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2398 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2399
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2400 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2401
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2402 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2403 for(k=0; k < e-2;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2404 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2405 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2406 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2407 else if(j%2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2408 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2409 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2410 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2411 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2412 Diag = _mm_insert_epi16(Diag, b[lenb-1-k] != a[(i-lenb)-1+k],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2413 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2414
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2415 R0 = _mm_min_epi16(R1+Side2, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2416 R0 = _mm_min_epi16(R0, _mm_slli_si128(R1,2)+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2417
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2418 tmpE--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2419
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2420 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2421 for(k=0; k < tmpE-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2422 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2423 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2424 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2425
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2426
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2427 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2428 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2429 for(k=0;k<tmpE;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2430 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2431 Diag = _mm_slli_si128(Diag, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2432 Diag = _mm_insert_epi16(Diag, b[lenb-1-k] != a[(i-lenb)-1+k],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2433 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2434
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2435 R1 = _mm_min_epi16(_mm_srli_si128(R0,2)+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2436 R1 = _mm_min_epi16(R1, R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2437
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2438 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2439 for(k=0; k < tmpE-1;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2440 tmp = _mm_srli_si128(tmp,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2441 minError = min(minError, _mm_extract_epi16(tmp,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2442 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2443 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2444 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2445 //Diag
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2446
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2447 Diag = _mm_xor_si128(Diag,Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2448 Diag = _mm_insert_epi16(Diag, 2*e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2449 Diag = _mm_insert_epi16(Diag, a[lenb+e-2] != b[lenb-1], 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2450
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2451 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2452 Side1 = _mm_insert_epi16(Side1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2453
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2454 Down1 = _mm_insert_epi16(Down1, 2*e, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2455 Down1 = _mm_insert_epi16(Down1, 1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2456
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2457 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2458 R1 = _mm_min_epi16(R1, _mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2459
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2460 minError = min(minError, _mm_extract_epi16(R1,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2461
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2462 Diag = _mm_insert_epi16(Diag, a[lenb+e-1] != b[lenb-1], 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2463 Down1 = _mm_insert_epi16(Down1, 1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2464
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2465 R0 = _mm_min_epi16(R1+Down1,R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2466 R0 = _mm_min_epi16(R0,_mm_srli_si128(R1,2)+Side1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2467
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2468 minError = min(minError, _mm_extract_epi16(R0,0));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2469
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2470 if(minError > e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2471 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2472 return minError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2473 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2474
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2475
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2476 int forwardEditDistance2SSE2(char *a, int lena, char *b,int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2477 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2478 if(lenb == 0 || lena == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2479 return 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2480
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2481
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2482
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2483 int i0 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2484 int i1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2485
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2486
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2487 int error; //0: if the two character are equal 1: if not
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2488
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2489 int i = 0; //loop index
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2490
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2491 int e = 2; //error bound
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2492
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2493 int totalError = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2494
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2495 __m128i R0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2496 __m128i R1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2497
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2498 __m128i Side1, Side2,Side; //side matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2499 __m128i Down1, Down2,Down; //down matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2500 __m128i Diag;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2501
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2502 __m128i tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2503 __m128i ERROR_REACH;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2504
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2505 /* initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2506 R0 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2507 R1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2508 Diag = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2509 Side1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2510 Side2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2511 Down1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2512 Down2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2513 Side = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2514 Down = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2515 tmp = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2516 ERROR_REACH = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2517 /* end initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2518
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2519
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2520 if(lenb <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2521 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2522 return smallEditDistanceF(a,lena,b,lenb);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2523 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2524
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2525 ERROR_REACH = _mm_set_epi16(0,0,0,0,0,e,e,e);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2526
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2527 R0 = _mm_insert_epi16(R0,0,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2528
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2529 R1 = _mm_insert_epi16(R1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2530 R1 = _mm_insert_epi16(R1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2531
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2532 // error = ((a[0]) != (b[0]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2533
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2534 Diag = _mm_set_epi16(0,0,0,0,0,2*e,((a[0]) != (b[0])),2*e);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2535 Side1 = _mm_set_epi16(0,0,0,0,0,2*e,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2536 Side2 = _mm_set_epi16(0,0,0,0,0,1,1,2*e);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2537 Down1 = _mm_set_epi16(0,0,0,0,0,2*e,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2538 Down2 = _mm_set_epi16(0,0,0,0,0,1,1,2*e);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2539
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2540 tmp = _mm_slli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2541
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2542 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2543 R0 = _mm_min_epi16(R0,tmp+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2544
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2545 for (i = 3; i < 2*lena; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2546 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2547 if(i % 2 ==1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2548 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2549
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2550 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2551 error = ((a[(i+1)/2-1]) != (b[(i-1)/2-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2552 Diag = _mm_insert_epi16(Diag,error,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2553 error = ((a[(i-1)/2-1]) != (b[(i+1)/2-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2554 Diag = _mm_insert_epi16(Diag,error,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2555 // Diag = _mm_set_epi16(0, 0, 0, 0, 0, 0, ((a[(i-1)/2-1]) != (b[(i+1)/2-1])) ,((a[(i+1)/2-1]) != (b[(i-1)/2-1])));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2556
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2557
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2558 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2559
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2560 R1 = _mm_min_epi16(tmp+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2561 R1 = _mm_min_epi16(R1,R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2562
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2563 if(i > 2 * lenb - 2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2564 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2565 i1 = _mm_extract_epi16(R1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2566 totalError = min(totalError, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2567 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2568 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2569
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2570 else if(i % 2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2571 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2572 error = ((a[i/2]) != (b[i/2-2]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2573 Diag = _mm_insert_epi16(Diag,error,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2574 error = ((a[i/2-1]) != (b[i/2-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2575 Diag = _mm_insert_epi16(Diag,error,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2576 error = ((a[i/2-2]) != (b[i/2]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2577 Diag = _mm_insert_epi16(Diag,error,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2578
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2579 // Diag = _mm_set_epi16(0, 0, 0, 0, 0, ((a[i/2-2]) != (b[i/2])) , ((a[i/2-1]) != (b[i/2-1])) , ((a[i/2]) != (b[i/2-2])) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2580
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2581 tmp = _mm_slli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2582
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2583 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2584 R0 = _mm_min_epi16(R0,tmp+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2585
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2586 tmp = _mm_sub_epi16(ERROR_REACH, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2587 i0 = _mm_movemask_epi8(tmp);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2588
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2589 if(i0 == 63 && _mm_extract_epi16(R1,0) > errThreshold && _mm_extract_epi16(R1,1) > errThreshold && i < 2 * lenb - 2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2590 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2591 if(i == 2 * lenb - 2) {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2592 totalError = _mm_extract_epi16(R0, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2593 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2594 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2595 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2596
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2597 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2598
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2599 //fill the first part of the error
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2600 error = ((a[i/2]) != (b[i/2-2]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2601 Diag = _mm_insert_epi16(Diag,error,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2602 error = ((a[i/2-1]) != (b[i/2-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2603 Diag = _mm_insert_epi16(Diag,error,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2604 Diag = _mm_insert_epi16(Diag,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2605 // Diag = _mm_set_epi16(0, 0, 0, 0, 0, 2*e , ((a[i/2-1]) != (b[i/2-1])) , ((a[i/2]) != (b[i/2-2])) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2606
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2607 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2608 R0 = _mm_min_epi16(R0,_mm_slli_si128(R1,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2609
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2610 // i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2611 i1 = _mm_extract_epi16(R0, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2612
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2613 totalError = min(totalError, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2614
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2615 //fill the second part of the error
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2616 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2617
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2618 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2619 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2620 error = ((a[i/2]) != (b[lenb-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2621 Diag = _mm_insert_epi16(Diag,error,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2622 Diag = _mm_insert_epi16(Diag,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2623 // Diag = _mm_set_epi16(0, 0, 0, 0, 0, 2*e , ((a[i/2]) != (b[lenb-1])) , 2*e );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2624
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2625
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2626 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2627 R1 = _mm_min_epi16(R1,_mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2628
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2629 // i0 = _mm_extract_epi16(R1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2630 i1 = _mm_extract_epi16(R1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2631
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2632 totalError = min(totalError, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2633 //fill the last the last element of the matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2634 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2635
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2636 Diag = _mm_xor_si128(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2637 error = ((a[i/2]) != (b[lenb-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2638 Diag = _mm_insert_epi16(Diag,error,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2639
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2640 // Diag = _mm_set_epi16(0, 0, 0, 0, 0, 0 , 0 , ((a[i/2]) != (b[lenb-1])) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2641
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2642
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2643 Down = _mm_insert_epi16(Down,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2644
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2645 Side = _mm_insert_epi16(Side,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2646
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2647 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2648
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2649 R0 = _mm_min_epi16(R1+Down, _mm_srli_si128(R0,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2650 R0 = _mm_min_epi16(R0,tmp+Side);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2651
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2652 i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2653
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2654 totalError = min(totalError, i0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2655
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2656 if(totalError > e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2657 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2658
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2659 return totalError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2660
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2661 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2662
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2663 int backwardEditDistance2SSE2(char *a, int lena, char *b,int lenb)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2664 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2665 if(lenb == 0 || lena == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2666 return 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2667
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2668 int i0 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2669 int i1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2670
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2671 int error; //0: if the two character are equal 1: if not
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2672
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2673 int i = 0; //loop index
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2674
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2675 int e = 2; //error bound
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2676
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2677 int totalError = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2678
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2679 __m128i R0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2680 __m128i R1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2681
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2682 __m128i Side1, Side2,Side; //side matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2683 __m128i Down1, Down2,Down; //down matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2684 __m128i Diag; //diag matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2685
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2686 __m128i tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2687 __m128i ERROR_REACH;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2688
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2689 /* initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2690 R0 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2691 R1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2692 Diag = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2693 Side1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2694 Side2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2695 Side = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2696 Down1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2697 Down2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2698 Down = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2699 ERROR_REACH = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2700 tmp = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2701 /* end initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2702
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2703 if(lenb <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2704 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2705 return smallEditDistanceB(a,lena,b,lenb);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2706 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2707
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2708
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2709 ERROR_REACH = _mm_set_epi16(0,0,0,0,0,e,e,e);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2710
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2711 R0 = _mm_insert_epi16(R0,0,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2712
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2713 R1 = _mm_insert_epi16(R1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2714 R1 = _mm_insert_epi16(R1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2715
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2716 error = ((a[0]) != (b[0]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2717
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2718 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2719 Diag = _mm_insert_epi16(Diag,error,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2720 Diag = _mm_insert_epi16(Diag,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2721
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2722 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2723 Side1 = _mm_insert_epi16(Side1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2724 Side1 = _mm_insert_epi16(Side1,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2725
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2726 Side2 = _mm_insert_epi16(Side2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2727 Side2 = _mm_insert_epi16(Side2,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2728 Side2 = _mm_insert_epi16(Side2,1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2729
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2730 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2731 Down1 = _mm_insert_epi16(Down1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2732 Down1 = _mm_insert_epi16(Down1,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2733
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2734 Down2 = _mm_insert_epi16(Down2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2735 Down2 = _mm_insert_epi16(Down2,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2736 Down2 = _mm_insert_epi16(Down2,1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2737
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2738 tmp = _mm_slli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2739
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2740 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2741 R0 = _mm_min_epi16(R0,tmp+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2742
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2743 // printf("%d %d %d\n", _mm_extract_epi16(R0,0), _mm_extract_epi16(R0,1), _mm_extract_epi16(R0,2));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2744 for (i = 3; i < 2*lena; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2745 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2746 if(i % 2 ==1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2747 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2748 Diag = _mm_sub_epi8(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2749 error = ( *(a-((i+1)/2-1)) != *(b-((i-1)/2-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2750 Diag = _mm_insert_epi16(Diag,error,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2751 error = ( *(a-((i-1)/2-1)) != *(b-((i+1)/2-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2752 Diag = _mm_insert_epi16(Diag,error,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2753 //printf("#%d #%d\n", _mm_extract_epi16(Diag,0), _mm_extract_epi16(Diag,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2754 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2755
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2756 R1 = _mm_min_epi16(tmp+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2757 R1 = _mm_min_epi16(R1,R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2758
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2759 if(i > 2 * lenb - 2) {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2760 i1 = _mm_extract_epi16(R1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2761 totalError = min(totalError, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2762 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2763 // printf("%d %d\n", _mm_extract_epi16(R1,0), _mm_extract_epi16(R1,1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2764 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2765
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2766 else if(i % 2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2767 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2768 error = ( *(a-(i/2)) != *(b-(i/2-2)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2769 Diag = _mm_insert_epi16(Diag,error,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2770 error = ( *(a-(i/2-1)) != *(b-(i/2-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2771 Diag = _mm_insert_epi16(Diag,error,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2772 error = ( *(a-(i/2-2)) != *(b-(i/2)));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2773 Diag = _mm_insert_epi16(Diag,error,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2774
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2775 tmp = _mm_slli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2776
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2777 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2778 R0 = _mm_min_epi16(R0,tmp+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2779
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2780 tmp = _mm_sub_epi16(ERROR_REACH, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2781 i0 = _mm_movemask_epi8(tmp);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2782
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2783 if(i0 == 63 && _mm_extract_epi16(R1,0) > errThreshold && _mm_extract_epi16(R1,1) > errThreshold && i < 2 * lenb - 2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2784 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2785
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2786 if(i == 2 * lenb - 2) {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2787 totalError = _mm_extract_epi16(R0, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2788 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2789 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2790 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2791 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2792
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2793 //fill the first part of the error
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2794 error = ( *(a-(i/2)) != *(b-(i/2-2)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2795 Diag = _mm_insert_epi16(Diag,error,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2796 error = ( *(a-(i/2-1)) != *(b-(i/2-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2797 Diag = _mm_insert_epi16(Diag,error,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2798 Diag = _mm_insert_epi16(Diag,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2799
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2800 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2801 R0 = _mm_min_epi16(R0,_mm_slli_si128(R1,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2802
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2803 i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2804 i1 = _mm_extract_epi16(R0, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2805
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2806 totalError = min(totalError, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2807
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2808 //fill the second part of the error
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2809 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2810 Diag = _mm_sub_epi8(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2811 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2812 error = ( *(a-(i/2)) != *(b-(lenb-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2813 Diag = _mm_insert_epi16(Diag,error,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2814 Diag = _mm_insert_epi16(Diag,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2815
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2816 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2817 R1 = _mm_min_epi16(R1,_mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2818
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2819 i0 = _mm_extract_epi16(R1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2820 i1 = _mm_extract_epi16(R1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2821
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2822 totalError = min(totalError, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2823
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2824 //fill the last the last element of the matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2825 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2826 Diag = _mm_sub_epi8(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2827 error = ( *(a-(i/2)) != *(b-(lenb-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2828 Diag = _mm_insert_epi16(Diag,error,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2829
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2830 Down = _mm_insert_epi16(Down,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2831
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2832 Side = _mm_insert_epi16(Side,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2833
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2834 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2835
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2836 R0 = _mm_min_epi16(R1+Down, _mm_srli_si128(R0,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2837 R0 = _mm_min_epi16(R0,tmp+Side);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2838
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2839 i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2840
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2841 totalError = min(totalError, i0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2842
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2843 if(totalError > e || totalError == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2844 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2845 return totalError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2846 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2847
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2848 void initBestMapping(int totalReadNumber)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2849 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2850 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2851 bestHitMappingInfo = getMem(totalReadNumber * sizeof(BestFullMappingInfo));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2852 for(i = 0; i < totalReadNumber; i++) {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2853 bestHitMappingInfo[i].loc = -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2854 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2855 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2856
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2857
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2858 void finalizeBestSingleMapping()
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2859 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2860 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2861 char *_tmpQual, *_tmpSeq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2862 char rqual[SEQ_LENGTH + 1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2863 rqual[SEQ_LENGTH]='\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2864
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2865 for(i = 0; i < _msf_seqListSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2866 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2867 if(_msf_seqList[i].hits[0] != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2868 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2869 if (bestHitMappingInfo[i].dir)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2870 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2871 reverse(_msf_seqList[i].qual, rqual, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2872 _tmpQual = rqual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2873 _tmpSeq = _msf_seqList[i].rseq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2874 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2875 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2876 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2877 _tmpQual = _msf_seqList[i].qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2878 _tmpSeq = _msf_seqList[i].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2879 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2880
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2881
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2882 _msf_output.QNAME = _msf_seqList[i].name;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2883 _msf_output.FLAG = 16 * bestHitMappingInfo[i].dir;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2884 _msf_output.RNAME = bestHitMappingInfo[i].chr;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2885
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2886 _msf_output.POS = bestHitMappingInfo[i].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2887 _msf_output.MAPQ = 255;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2888 _msf_output.CIGAR = bestHitMappingInfo[i].cigar ;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2889 _msf_output.MRNAME = "*";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2890 _msf_output.MPOS = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2891 _msf_output.ISIZE = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2892
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2893
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2894 _msf_output.SEQ = _tmpSeq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2895 _msf_output.QUAL = _tmpQual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2896
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2897 _msf_output.optSize = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2898 _msf_output.optFields = _msf_optionalFields;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2899
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2900 _msf_optionalFields[0].tag = "NM";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2901 _msf_optionalFields[0].type = 'i';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2902 _msf_optionalFields[0].iVal = bestHitMappingInfo[i].err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2903
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2904 _msf_optionalFields[1].tag = "MD";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2905 _msf_optionalFields[1].type = 'Z';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2906 _msf_optionalFields[1].sVal = bestHitMappingInfo[i].md;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2907
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2908 output(_msf_output);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2909 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2910 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2911 freeMem(bestHitMappingInfo, _msf_seqListSize * sizeof(FullMappingInfo));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2912 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2913 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2914 int compare (const void *a, const void *b)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2915 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2916 return ((Pair *)a)->hv - ((Pair *)b)->hv;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2917 /*char *s1 = ((Pair *)a)->hv;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2918 char *s2 = ((Pair *)b)->hv;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2919 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2920
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2921 int diff = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2922 int sign = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2923
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2924 for(i = 0; i < SEQ_LENGTH; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2925 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2926 diff += (s1[i] != s2[i]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2927 if(s1[i] > s2[i])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2928 sign++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2929 else if(s1[i] < s2[i])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2930 sign--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2931 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2932
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2933 return diff*sign;*/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2934 // return strncmp(s1, s2,SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2935
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2936 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2937 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2938 void preProcessReads()
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2939 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2940 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2941
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2942 _msf_sort_seqList = getMem(_msf_seqListSize * sizeof(Pair));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2943 for(i = 0; i < _msf_seqListSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2944 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2945 _msf_sort_seqList[i].hv = hashVal(_msf_seqList[i].seq);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2946
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2947 _msf_sort_seqList[i].readNumber = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2948 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2949
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2950 qsort(_msf_sort_seqList, _msf_seqListSize, sizeof(Pair), compare);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2951
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2952 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2953 for(i = 0; i < _msf_seqListSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2954 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2955 //printf("%s\n", _msf_sort_seqList[i].hv);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2956 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2957 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2958
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2959 _msf_map_sort_seqList = getMem(_msf_seqListSize * sizeof(int));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2960
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2961 for(i = 0; i < _msf_seqListSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2962 _msf_map_sort_seqList[_msf_seqList[i].readNumber] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2963
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2964 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2965 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2966
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2967 int verifySingleEnd(int index, char* seq, int offset)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2968 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2969 int curOff = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2970 int i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2971
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2972 char *ref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2973
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2974 int err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2975 int errCnt =0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2976 int errCntOff = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2977 int NCntOff = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2978
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2979 ref = _msf_refGen + index - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2980
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2981 verificationCnt++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2982
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2983 for (i = 0; i < SEQ_LENGTH; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2984 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2985 err = *ref != *seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2986 errCnt += err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2987 if (errCnt > errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2988 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2989
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2990 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2991 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2992
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2993 if (i >= _msf_samplingLocs[curOff] && i <= _msf_samplingLocsEnds[curOff])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2994 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2995 errCntOff += err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2996 NCntOff += (*seq == 'N');
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2997 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2998 else if (curOff < _msf_samplingLocsSize && i>=_msf_samplingLocs[curOff+1])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
2999 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3000
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3001 if (errCntOff == 0 && NCntOff == 0 && offset > curOff)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3002 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3003 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3004 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3005
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3006 errCntOff = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3007 NCntOff = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3008 curOff++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3009
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3010 if ( i >= _msf_samplingLocs[curOff])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3011 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3012 errCntOff += err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3013 NCntOff += (*seq == 'N');
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3014 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3015 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3016
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3017 ref++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3018 seq++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3019 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3020 return errCnt;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3021 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3022
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3023 /*********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3024 void initFAST(Read *seqList, int seqListSize, int *samplingLocs, int samplingLocsSize, char *genFileName)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3025 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3026 int i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3027
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3028 if (_msf_optionalFields == NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3029 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3030 _msf_op = getMem(SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3031 if (pairedEndMode)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3032 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3033 _msf_optionalFields = getMem(8*sizeof(OPT_FIELDS));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3034 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3035 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3036 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3037 _msf_optionalFields = getMem(2*sizeof(OPT_FIELDS));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3038 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3039
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3040 for (i=0; i<200;i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3041 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3042 sprintf(_msf_numbers[i],"%d%c",i, '\0');
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3043 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3044 sprintf(_msf_cigar, "%dM", SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3045 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3046
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3047 if (_msf_samplingLocsEnds == NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3048 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3049 _msf_samplingLocs = samplingLocs;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3050 _msf_samplingLocsSize = samplingLocsSize;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3051
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3052 _msf_samplingLocsEnds = getMem(sizeof(int)*_msf_samplingLocsSize);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3053 for (i=0; i<_msf_samplingLocsSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3054 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3055 _msf_samplingLocsEnds[i]=_msf_samplingLocs[i]+WINDOW_SIZE-1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3056 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3057
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3058 _msf_seqList = seqList;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3059 _msf_seqListSize = seqListSize;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3060
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3061 preProcessReads();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3062
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3063 _msf_oeaMapping = getMem(_msf_seqListSize * sizeof(int));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3064 for(i = 0; i < _msf_seqListSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3065 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3066 _msf_oeaMapping[i] = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3067 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3068
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3069 _msf_discordantMapping = getMem(_msf_seqListSize * sizeof(int));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3070 for(i = 0; i < _msf_seqListSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3071 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3072 _msf_discordantMapping[i] = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3073 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3074
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3075 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3076
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3077 if (_msf_refGenName == NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3078 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3079 _msf_refGenName = getMem(4*SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3080 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3081 _msf_refGen = getRefGenome();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3082 _msf_refGenLength = strlen(_msf_refGen);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3083
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3084 _msf_refGenOffset = getRefGenomeOffset();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3085 snprintf(_msf_refGenName, 4*SEQ_LENGTH,"%s%c", getRefGenomeName(), '\0');
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3086 _msf_refGenName[strlen(getRefGenomeName())] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3087
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3088
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3089 if (_msf_verifiedLocs != NULL){
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3090 freeMem(_msf_verifiedLocs, sizeof(int) * (_msf_refGenLength+1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3091 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3092
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3093 _msf_verifiedLocs = (int *) getMem(sizeof(int)*(_msf_refGenLength+1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3094
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3095 for (i=0; i<=_msf_refGenLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3096 _msf_verifiedLocs[i] = _msf_seqListSize*10+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3097
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3098
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3099
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3100 if (pairedEndMode && _msf_seqHits == NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3101 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3102
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3103 _msf_mappingInfo = getMem(seqListSize * sizeof (MappingInfo));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3104
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3105 for (i=0; i<seqListSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3106 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3107 //_msf_mappingInfo[i].next = getMem(sizeof(MappingLocations));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3108 _msf_mappingInfo[i].next = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3109 _msf_mappingInfo[i].size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3110 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3111
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3112 _msf_seqHits = getMem((_msf_seqListSize) * sizeof(int));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3113
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3114
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3115 for (i=0; i<_msf_seqListSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3116 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3117 _msf_seqHits[i] = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3118 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3119
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3120 _msf_readHasConcordantMapping = getMem(_msf_seqListSize / 2 * sizeof(char));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3121 for(i = 0; i < _msf_seqListSize/2; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3122 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3123 _msf_readHasConcordantMapping[i] = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3124 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3125
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3126 initLoadingRefGenome(genFileName);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3127 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3128
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3129 if (_msf_refGenOffset == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3130 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3131 _msf_refGenBeg = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3132 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3133 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3134 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3135 _msf_refGenBeg = CONTIG_OVERLAP - SEQ_LENGTH + 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3136 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3137 _msf_refGenEnd = _msf_refGenLength - SEQ_LENGTH + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3138
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3139
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3140 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3141 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3142 void finalizeFAST()
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3143 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3144 freeMem(_msf_seqHits, (_msf_seqListSize) * sizeof(int));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3145 freeMem(_msf_refGenName, 4*SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3146
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3147
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3148 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3149 int i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3150 for (i=0; i<_msf_rIndexSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3151 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3152 freeMem(_msf_rIndex[i].seqInfo, _msf_rIndex[i].seqInfo[0]+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3153 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3154 freeMem(_msf_rIndex, _msf_rIndexSize);*/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3155
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3156
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3157 freeMem(_msf_map_sort_seqList, sizeof(Pair) * _msf_seqListSize);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3158 freeMem(_msf_sort_seqList, sizeof(int) * _msf_seqListSize);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3159
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3160 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3161
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3162 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3163 Will apply the Levenshtein Dynamic programming.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3164 Different from verifySingleEndEditDistance fucntion
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3165 as in this fucntion only one dynamic table is made while
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3166 in verifySingleEndEditDistance two dynamic table is made
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3167 for each right and left string
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3168 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3169 int editDistance(int refIndex, char *seq, int seqLength, char *matrix)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3170 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3171 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3172 int size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3173 int error = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3174 int rIndex = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3175 int directionIndex = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3176
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3177 int min = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3178 int minIndex =0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3179
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3180 int tempUp = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3181 int tempDown = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3182
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3183 char *ref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3184
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3185 int errorString = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3186 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3187 1: Up
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3188 2: Side
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3189 3: Diagnoal Match
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3190 4: Diagnoal Mismatch
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3191 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3192
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3193 int upValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3194 int diagValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3195 int sideValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3196
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3197 ref = _msf_refGen + refIndex - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3198
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3199 rIndex = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3200
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3201 for(i=0; i <= errThreshold; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3202 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3203 score[0][i] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3204 score[i][0] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3205 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3206
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3207 while(rIndex <= seqLength +errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3208 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3209 tempUp = ((rIndex - errThreshold) > 0 ? ((rIndex > seqLength) ? seqLength - errThreshold :rIndex - errThreshold) : 1 );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3210 tempDown = ((rIndex >= seqLength-errThreshold ) ? seqLength+1 :rIndex + errThreshold + 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3211 for(i = tempUp ; i < tempDown ; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3212 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3213 errorString = (*(ref+rIndex-1) == *(seq+i-1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3214
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3215 upValue = score[i-1][rIndex]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3216 diagValue = score[i-1][rIndex-1]+ !errorString;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3217 sideValue = score[i][rIndex-1]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3218
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3219 if(i != tempUp && i != tempDown-1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3220 score[i][rIndex] = min3(sideValue, diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3221
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3222 else if( (i == ((rIndex - errThreshold) > 0 ? rIndex - errThreshold : 1)) && rIndex <= seqLength )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3223 score[i][rIndex] = min(sideValue, diagValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3224 else if(rIndex > seqLength && (i == seqLength - errThreshold) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3225 score[i][rIndex] = sideValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3226 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3227 score[i][rIndex] = min(diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3228
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3229 if(i == tempUp)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3230 error = score[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3231 else if(error > score[i][rIndex])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3232 error = score[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3233 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3234 rIndex++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3235 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3236
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3237 min = score[seqLength][seqLength+errThreshold];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3238 minIndex = seqLength + errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3239
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3240 // Find the Best error for all the possible ways.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3241 for(i = 1; i <= 2*errThreshold; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3242 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3243 if(min >= score[seqLength][seqLength+errThreshold-i] && seqLength+errThreshold-i > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3244 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3245 min = score[seqLength][seqLength+errThreshold-i];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3246 minIndex = seqLength+errThreshold-i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3247 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3248 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3249
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3250 error = score[seqLength][minIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3251
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3252 directionIndex = seqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3253 rIndex = minIndex;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3254 while(directionIndex != 0 || rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3255 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3256
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3257 if(rIndex == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3258 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3259 if(score[directionIndex][rIndex] - score[directionIndex-1][rIndex] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3260 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3261 matrix[size] = *(seq+directionIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3262 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3263 matrix[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3264 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3265 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3266 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3267 else if(directionIndex == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3268 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3269 if(score[directionIndex][rIndex] - score[directionIndex][rIndex-1] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3270 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3271 matrix[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3272 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3273 matrix[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3274 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3275 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3276 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3277 else if(directionIndex-rIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3278 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3279 if(score[directionIndex][rIndex] - score[directionIndex-1][rIndex] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3280 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3281 matrix[size] = *(seq+directionIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3282 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3283 matrix[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3284 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3285 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3286 else if( score[directionIndex][rIndex] - score[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3287 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3288 matrix[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3289 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3290 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3291 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3292 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3293 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3294 matrix[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3295 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3296 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3297 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3298
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3299 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3300 else if(rIndex - directionIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3301 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3302 if(score[directionIndex][rIndex] - score[directionIndex][rIndex-1] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3303 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3304 matrix[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3305 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3306 matrix[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3307 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3308 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3309 else if( score[directionIndex][rIndex] - score[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3310 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3311 matrix[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3312 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3313 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3314 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3315 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3316 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3317 matrix[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3318 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3319 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3320 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3321 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3322 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3323 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3324 if(score[directionIndex][rIndex] - score[directionIndex-1][rIndex] == 1 && directionIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3325 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3326 matrix[size] = *(seq+directionIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3327 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3328 matrix[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3329 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3330 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3331 else if(score[directionIndex][rIndex] - score[directionIndex][rIndex-1] == 1 && rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3332 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3333 matrix[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3334 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3335 matrix[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3336 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3337 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3338 else if( score[directionIndex][rIndex] - score[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3339 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3340 matrix[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3341 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3342 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3343 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3344 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3345 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3346 matrix[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3347 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3348 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3349 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3350 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3351 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3352 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3353
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3354 matrix[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3355
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3356 char returnString[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3357
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3358 returnString[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3359 reverse(matrix, returnString, size);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3360 sprintf(matrix, "%s", returnString);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3361
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3362 return error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3363 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3364
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3365 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3366 Will apply the Levenshtein Dynamic programming.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3367 in both right and left direction as long as the
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3368 threshould error is reached or end of string length
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3369
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3370 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3371 int msfHashVal(char *seq)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3372 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3373 int i=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3374 int val=0, numericVal=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3375
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3376 while(i<6)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3377 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3378 switch (seq[i])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3379 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3380 case 'A':
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3381 numericVal = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3382 break;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3383 case 'C':
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3384 numericVal = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3385 break;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3386 case 'G' :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3387 numericVal = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3388 break;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3389 case 'T':
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3390 numericVal = 3;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3391 break;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3392 default:
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3393 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3394 break;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3395 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3396 val = (val << 2)|numericVal;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3397 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3398 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3399 return val;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3400 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3401
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3402
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3403
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3404 int verifySingleEndEditDistance2(int refIndex, char *lSeq, int lSeqLength, char *rSeq, int rSeqLength, int segLength, char *matrix, int *map_location, short *seqHashValue)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3405 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3406 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3407
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3408 char * ref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3409 char * tempref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3410
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3411 int rIndex = 0; //reference Index
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3412
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3413 int e = errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3414 int error = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3415 int error1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3416 int totalError = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3417
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3418
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3419 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3420 1: Up
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3421 2: Side
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3422 3: Diagnoal Match
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3423 4: Diagnoal Mismatch
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3424 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3425
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3426
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3427 int minIndex1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3428 int minIndex2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3429
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3430
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3431 int directionIndex = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3432
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3433 int size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3434
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3435 int startIndex1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3436
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3437 rIndex = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3438
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3439
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3440 char matrixR[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3441 char matrixL[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3442
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3443 ref = _msf_refGen + refIndex - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3444 tempref = _msf_refGen + refIndex - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3445
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3446 int jumpIndex = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3447
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3448 if(rSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3449 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3450 error1 = forwardEditDistance2SSE2(ref+segLength+jumpIndex, rSeqLength-jumpIndex, rSeq+jumpIndex, rSeqLength-jumpIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3451 if(error1 == -1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3452 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3453 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3454
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3455
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3456 if(lSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3457 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3458 error = backwardEditDistance2SSE2(ref-1, lSeqLength, lSeq+lSeqLength-1, lSeqLength);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3459 if(error == -1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3460 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3461 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3462 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3463 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3464
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3465 matrixL[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3466 matrixR[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3467
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3468
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3469 ref = _msf_refGen + refIndex - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3470
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3471 if(error1+error > errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3472 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3473
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3474 ref = _msf_refGen + refIndex - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3475
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3476 rIndex = startIndex1+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3477
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3478 int i0 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3479 int i1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3480 int i2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3481
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3482 __m128i R0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3483 __m128i R1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3484
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3485 __m128i Side1, Side2,Side; //side matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3486 __m128i Down1, Down2,Down; //down matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3487 __m128i Diag; //
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3488
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3489 __m128i tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3490
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3491 /* initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3492 R0 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3493 R1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3494 Diag = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3495 Side1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3496 Side2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3497 Down1 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3498 Down2 = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3499 Down = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3500 Side = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3501 tmp = _mm_setzero_si128 ();
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3502 /* end initialize */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3503
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3504 int mismatch[3] = {0,0,0};
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3505
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3506 if(lSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3507 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3508 char *a;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3509 char *b;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3510
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3511 a = ref-1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3512 b = lSeq+lSeqLength-1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3513
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3514 R0 = _mm_insert_epi16(R0,0,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3515
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3516 score[0][0] = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3517
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3518 R1 = _mm_insert_epi16(R1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3519 R1 = _mm_insert_epi16(R1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3520
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3521 score[1][0] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3522 direction1[1][0] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3523 score[0][1] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3524 direction1[0][1] = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3525
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3526 mismatch[0] = ((a[0]) != (b[0]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3527
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3528 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3529 Diag = _mm_insert_epi16(Diag,mismatch[0],1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3530 Diag = _mm_insert_epi16(Diag,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3531
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3532 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3533 Side1 = _mm_insert_epi16(Side1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3534 Side1 = _mm_insert_epi16(Side1,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3535
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3536 Side2 = _mm_insert_epi16(Side2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3537 Side2 = _mm_insert_epi16(Side2,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3538 Side2 = _mm_insert_epi16(Side2,1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3539
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3540 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3541 Down1 = _mm_insert_epi16(Down1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3542 Down1 = _mm_insert_epi16(Down1,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3543
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3544 Down2 = _mm_insert_epi16(Down2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3545 Down2 = _mm_insert_epi16(Down2,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3546 Down2 = _mm_insert_epi16(Down2,1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3547
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3548 tmp = _mm_slli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3549
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3550 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3551 R0 = _mm_min_epi16(R0,tmp+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3552
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3553 i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3554 i1 = _mm_extract_epi16(R0, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3555 i2 = _mm_extract_epi16(R0, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3556
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3557 score[0][2] = i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3558 score[1][1] = i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3559 score[2][0] = i2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3560
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3561 direction1[0][2] = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3562 direction1[1][1] = ((mismatch[0] == 0)? 3 : 4);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3563 direction1[2][0] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3564
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3565 for (i = 3; i < 2*lSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3566 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3567 if(i % 2 ==1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3568 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3569 Diag = _mm_sub_epi8(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3570 mismatch[0] = ( *(a-((i+1)/2-1)) != *(b-((i-1)/2-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3571 Diag = _mm_insert_epi16(Diag,mismatch[0],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3572 mismatch[1] = ( *(a-((i-1)/2-1)) != *(b-((i+1)/2-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3573 Diag = _mm_insert_epi16(Diag,mismatch[1],1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3574
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3575 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3576
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3577 R1 = _mm_min_epi16(tmp+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3578 R1 = _mm_min_epi16(R1,R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3579
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3580 i0 = _mm_extract_epi16(R1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3581 i1 = _mm_extract_epi16(R1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3582
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3583 score[i/2][i/2+1] = i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3584 score[i/2+1][i/2] = i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3585
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3586 direction1[i/2][i/2+1] = (score[i/2][i/2+1]==score[i/2-1][i/2] && mismatch[0] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3587 (score[i/2][i/2+1]-score[i/2-1][i/2+1]==1)? 1 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3588 (score[i/2][i/2+1]-score[i/2][i/2]==1) ? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3589
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3590 direction1[i/2+1][i/2] = (score[i/2+1][i/2]==score[i/2][i/2-1] && mismatch[1] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3591 (score[i/2+1][i/2]-score[i/2][i/2]==1) ? 1 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3592 (score[i/2+1][i/2]-score[i/2+1][i/2-1]==1)? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3593
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3594 if(i > 2 * lSeqLength - 2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3595 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3596 error = min(error, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3597 if(error == i1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3598 minIndex1 = i-lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3599 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3600 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3601
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3602 else if(i % 2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3603 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3604 mismatch[0] = ( *(a-(i/2)) != *(b-(i/2-2)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3605 Diag = _mm_insert_epi16(Diag,mismatch[0],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3606 mismatch[1] = ( *(a-(i/2-1)) != *(b-(i/2-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3607 Diag = _mm_insert_epi16(Diag,mismatch[1],1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3608 mismatch[2] = ( *(a-(i/2-2)) != *(b-(i/2)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3609 Diag = _mm_insert_epi16(Diag,mismatch[2],2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3610
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3611 tmp = _mm_slli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3612
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3613 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3614 R0 = _mm_min_epi16(R0,tmp+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3615
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3616 i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3617 i1 = _mm_extract_epi16(R0, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3618 i2 = _mm_extract_epi16(R0, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3619
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3620 score[i/2-1][i/2+1] = i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3621 score[i/2][i/2] = i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3622 score[i/2+1][i/2-1] = i2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3623
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3624 direction1[i/2-1][i/2+1] = (score[i/2-1][i/2+1]==score[i/2-2][i/2] && mismatch[0] == 0) ? 3 : (score[i/2-1][i/2+1]-score[i/2-1][i/2]==1) ? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3625
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3626 direction1[i/2][i/2] = (score[i/2][i/2]==score[i/2-1][i/2-1] && mismatch[1] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3627 (score[i/2][i/2]-score[i/2-1][i/2]==1) ? 1 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3628 (score[i/2][i/2]-score[i/2][i/2-1]==1) ? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3629
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3630 direction1[i/2+1][i/2-1] = (score[i/2+1][i/2-1]==score[i/2][i/2-2] && mismatch[2] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3631 (score[i/2+1][i/2-1]-score[i/2][i/2-1]==1) ? 1 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3632
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3633 if( (i/2) % segLength == 0 && i1 == 0) // the segment has been processed no need to process it again
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3634 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3635 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3636 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3637
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3638 if(i == 2 * lSeqLength - 2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3639 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3640 error = i2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3641 minIndex1 = i-lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3642 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3643 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3644 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3645
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3646 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3647
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3648 //fill the first part of the error
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3649 mismatch[0] = ( *(a-(i/2)) != *(b-(i/2-2)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3650 Diag = _mm_insert_epi16(Diag,mismatch[0],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3651 mismatch[1] = ( *(a-(i/2-1)) !=*(b-(i/2-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3652 Diag = _mm_insert_epi16(Diag,mismatch[1],1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3653 Diag = _mm_insert_epi16(Diag,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3654
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3655 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3656 R0 = _mm_min_epi16(R0,_mm_slli_si128(R1,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3657
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3658 i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3659 i1 = _mm_extract_epi16(R0, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3660
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3661 error = min(error, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3662 if(error == i1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3663 minIndex1 = i-lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3664
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3665 score[i/2-1][i/2+1] = i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3666 score[i/2][i/2] = i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3667
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3668 direction1[i/2-1][i/2+1] = (score[i/2-1][i/2+1]==score[i/2-2][i/2] && mismatch[0] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3669 (score[i/2-1][i/2+1]-score[i/2-1][i/2]) ? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3670
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3671 direction1[i/2][i/2] = (score[i/2][i/2]==score[i/2-1][i/2-1] && mismatch[1] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3672 (score[i/2][i/2]-score[i/2-1][i/2]==1) ? 1 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3673 (score[i/2][i/2]-score[i/2][i/2-1]==1)? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3674
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3675 //fill the second part of the error
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3676 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3677 Diag = _mm_sub_epi8(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3678 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3679 mismatch[0] = ( *(a-(i/2)) != *(b-(lSeqLength-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3680 Diag = _mm_insert_epi16(Diag,mismatch[0],1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3681 Diag = _mm_insert_epi16(Diag,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3682
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3683 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3684 R1 = _mm_min_epi16(R1,_mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3685
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3686 i0 = _mm_extract_epi16(R1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3687 i1 = _mm_extract_epi16(R1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3688
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3689 error = min(error, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3690 if(error == i1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3691 minIndex1 = i-lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3692
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3693 score[i/2-1][i/2+2] = i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3694 score[i/2][i/2+1] = i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3695
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3696 direction1[i/2-1][i/2+2] = (score[i/2-1][i/2+2]==score[i/2-2][i/2+1] && mismatch[0] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3697 (score[i/2-1][i/2+2]-score[i/2-1][i/2+1]==1) ? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3698
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3699 direction1[i/2][i/2+1] = (score[i/2][i/2+1]==score[i/2-1][i/2]) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3700 (score[i/2][i/2+1]-score[i/2-1][i/2+1]==1)? 1 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3701 (score[i/2][i/2+1]-score[i/2][i/2]==1)? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3702
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3703 //fill the last the last element of the matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3704 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3705 Diag = _mm_sub_epi8(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3706 mismatch[0] = ( *(a-(i/2)) != *(b-(lSeqLength-1)) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3707 Diag = _mm_insert_epi16(Diag,mismatch[0],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3708
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3709 Down = _mm_insert_epi16(Down,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3710
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3711 Side = _mm_insert_epi16(Side,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3712
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3713 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3714
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3715 R0 = _mm_min_epi16(R1+Down, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3716 R0 = _mm_min_epi16(R0,tmp+Side);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3717
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3718 i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3719
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3720 error = min(error, i0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3721 if(error == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3722 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3723 if(error == i0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3724 minIndex1 = i-lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3725 if(mismatch[0] == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3726 direction1[lSeqLength][lSeqLength+errThreshold] = 3;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3727 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3728 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3729 if(score[lSeqLength][lSeqLength+errThreshold] - score[lSeqLength][lSeqLength+errThreshold-1] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3730 direction1[lSeqLength][lSeqLength+errThreshold] = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3731 else if(score[lSeqLength][lSeqLength+errThreshold] - score[lSeqLength-1][lSeqLength+errThreshold] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3732 direction1[lSeqLength][lSeqLength+errThreshold] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3733 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3734 direction1[lSeqLength][lSeqLength+errThreshold] = 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3735 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3736 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3737 error1 = error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3738 error = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3739
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3740 directionIndex = lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3741 rIndex = minIndex1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3742
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3743
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3744 *map_location = ((lSeqLength == 0) ? refIndex : refIndex - rIndex) ;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3745
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3746 ref = ref + segLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3747
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3748 if(rSeqLength <= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3749 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3750 char *a;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3751 char *b;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3752
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3753 int tmp_index = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3754
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3755 a = ref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3756 b = rSeq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3757
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3758 for(tmp_index = 0; tmp_index < rSeqLength; tmp_index++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3759 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3760 matrixR[tmp_index] = (a[tmp_index]==b[tmp_index]) ? 'M' : a[tmp_index] ;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3761 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3762 matrixR[tmp_index] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3763 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3764 else if(rSeqLength != 0 && rSeqLength >= e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3765 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3766 char *a;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3767 char *b;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3768
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3769 a = ref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3770 b = rSeq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3771
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3772 R0 = _mm_sub_epi8(R0, R0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3773 R1 = _mm_sub_epi8(R1, R1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3774
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3775 R0 = _mm_insert_epi16(R0,0,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3776
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3777 score[0][0] = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3778
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3779 R1 = _mm_insert_epi16(R1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3780 R1 = _mm_insert_epi16(R1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3781
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3782 score[1][0] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3783 direction2[1][0] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3784 score[0][1] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3785 direction2[0][1] = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3786
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3787 mismatch[0] = ((a[0]) != (b[0]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3788
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3789 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3790 Diag = _mm_insert_epi16(Diag,mismatch[0],1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3791 Diag = _mm_insert_epi16(Diag,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3792
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3793 Side1 = _mm_insert_epi16(Side1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3794 Side1 = _mm_insert_epi16(Side1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3795 Side1 = _mm_insert_epi16(Side1,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3796
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3797 Side2 = _mm_insert_epi16(Side2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3798 Side2 = _mm_insert_epi16(Side2,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3799 Side2 = _mm_insert_epi16(Side2,1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3800
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3801 Down1 = _mm_insert_epi16(Down1,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3802 Down1 = _mm_insert_epi16(Down1,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3803 Down1 = _mm_insert_epi16(Down1,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3804
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3805 Down2 = _mm_insert_epi16(Down2,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3806 Down2 = _mm_insert_epi16(Down2,1,1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3807 Down2 = _mm_insert_epi16(Down2,1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3808
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3809 tmp = _mm_slli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3810
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3811 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3812 R0 = _mm_min_epi16(R0,tmp+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3813
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3814 i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3815 i1 = _mm_extract_epi16(R0, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3816 i2 = _mm_extract_epi16(R0, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3817
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3818 score[0][2] = i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3819 score[1][1] = i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3820 score[2][0] = i2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3821
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3822 direction2[0][2] = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3823 direction2[1][1] = ((mismatch[0] == 0)? 3 : 4);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3824 direction2[2][0] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3825
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3826
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3827 for (i = 3; i < 2*rSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3828 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3829 if(i % 2 ==1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3830 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3831 Diag = _mm_sub_epi8(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3832 mismatch[0] = ((a[(i+1)/2-1]) != (b[(i-1)/2-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3833 Diag = _mm_insert_epi16(Diag,mismatch[0],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3834 mismatch[1] = ((a[(i-1)/2-1]) != (b[(i+1)/2-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3835 Diag = _mm_insert_epi16(Diag,mismatch[1],1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3836
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3837 tmp = _mm_srli_si128(R0,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3838
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3839 R1 = _mm_min_epi16(tmp+Side1, R1+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3840 R1 = _mm_min_epi16(R1,R0+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3841
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3842 i0 = _mm_extract_epi16(R1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3843 i1 = _mm_extract_epi16(R1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3844
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3845 score[i/2][i/2+1] = i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3846 score[i/2+1][i/2] = i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3847
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3848 direction2[i/2][i/2+1] = (score[i/2][i/2+1]==score[i/2-1][i/2] && mismatch[0] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3849 (score[i/2][i/2+1]-score[i/2-1][i/2+1]==1)? 1 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3850 (score[i/2][i/2+1]-score[i/2][i/2]==1) ? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3851
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3852 direction2[i/2+1][i/2] = (score[i/2+1][i/2]==score[i/2][i/2-1] && mismatch[1] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3853 (score[i/2+1][i/2]-score[i/2][i/2]==1) ? 1 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3854 (score[i/2+1][i/2]-score[i/2+1][i/2-1]==1)? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3855
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3856
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3857 if(i > 2 * rSeqLength - 2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3858 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3859 error = min(error, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3860 if(error == i1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3861 minIndex2 = i-rSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3862 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3863 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3864
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3865 else if(i % 2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3866 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3867 mismatch[0] = ((a[i/2]) != (b[i/2-2]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3868 Diag = _mm_insert_epi16(Diag,mismatch[0],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3869 mismatch[1] = ((a[i/2-1]) != (b[i/2-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3870 Diag = _mm_insert_epi16(Diag,mismatch[1],1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3871 mismatch[2] = ((a[i/2-2]) != (b[i/2]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3872 Diag = _mm_insert_epi16(Diag,mismatch[2],2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3873
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3874 tmp = _mm_slli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3875
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3876 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3877 R0 = _mm_min_epi16(R0,tmp+Down2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3878
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3879 i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3880 i1 = _mm_extract_epi16(R0, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3881 i2 = _mm_extract_epi16(R0, 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3882
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3883 score[i/2-1][i/2+1] = i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3884 score[i/2][i/2] = i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3885 score[i/2+1][i/2-1] = i2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3886
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3887 direction2[i/2-1][i/2+1] = (score[i/2-1][i/2+1]==score[i/2-2][i/2] && mismatch[0] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3888 (score[i/2-1][i/2+1]-score[i/2-1][i/2]==1) ? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3889
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3890 direction2[i/2][i/2] = (score[i/2][i/2]==score[i/2-1][i/2-1] && mismatch[1] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3891 (score[i/2][i/2]-score[i/2-1][i/2]==1) ? 1 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3892 (score[i/2][i/2]-score[i/2][i/2-1]==1) ? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3893
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3894 direction2[i/2+1][i/2-1] = (score[i/2+1][i/2-1]==score[i/2][i/2-2] && mismatch[2]==0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3895 (score[i/2+1][i/2-1]-score[i/2][i/2-1]==1) ? 1 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3896
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3897
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3898 if(i == 2 * rSeqLength - 2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3899 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3900 error = i2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3901 minIndex2 = i-rSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3902 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3903 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3904 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3905
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3906 Down1 = _mm_insert_epi16(Down1,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3907
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3908 //fill the first part of the error
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3909 mismatch[0] = ((a[i/2]) != (b[i/2-2]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3910 Diag = _mm_insert_epi16(Diag,mismatch[0],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3911 mismatch[1] = ((a[i/2-1]) != (b[i/2-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3912 Diag = _mm_insert_epi16(Diag,mismatch[1],1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3913 Diag = _mm_insert_epi16(Diag,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3914
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3915 R0 = _mm_min_epi16(R1+Side1, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3916 R0 = _mm_min_epi16(R0,_mm_slli_si128(R1,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3917
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3918 i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3919 i1 = _mm_extract_epi16(R0, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3920
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3921 error = min(error, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3922 if(error == i1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3923 minIndex2 = i-rSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3924
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3925 score[i/2-1][i/2+1] = i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3926 score[i/2][i/2] = i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3927
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3928 direction2[i/2-1][i/2+1] = (score[i/2-1][i/2+1]==score[i/2-2][i/2] && mismatch[0] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3929 (score[i/2-1][i/2+1]-score[i/2-1][i/2]==1) ? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3930
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3931 direction2[i/2][i/2] = (score[i/2][i/2]==score[i/2-1][i/2-1] && mismatch[1] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3932 (score[i/2][i/2]-score[i/2-1][i/2]==1) ? 1 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3933 (score[i/2][i/2]-score[i/2][i/2-1]==1)? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3934
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3935
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3936 //fill the second part of the error
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3937 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3938 Diag = _mm_sub_epi8(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3939 Diag = _mm_insert_epi16(Diag,2*e,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3940 mismatch[0] = ((a[i/2]) != (b[rSeqLength-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3941 Diag = _mm_insert_epi16(Diag,mismatch[0],1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3942 Diag = _mm_insert_epi16(Diag,2*e,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3943
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3944 R1 = _mm_min_epi16(R0+Side1, _mm_slli_si128(R1,2)+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3945 R1 = _mm_min_epi16(R1,_mm_slli_si128(R0,2)+Down1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3946
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3947 i0 = _mm_extract_epi16(R1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3948 i1 = _mm_extract_epi16(R1, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3949
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3950 error = min(error, i1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3951 if(error == i1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3952 minIndex2 = i-rSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3953
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3954 score[i/2-1][i/2+2] = i0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3955 score[i/2][i/2+1] = i1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3956
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3957 direction2[i/2-1][i/2+2] = (score[i/2-1][i/2+2]==score[i/2-2][i/2+1] && mismatch[0] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3958 (score[i/2-1][i/2+2]-score[i/2-1][i/2+1]==1) ? 2 : 3;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3959
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3960 direction2[i/2][i/2+1] = (score[i/2][i/2+1]==score[i/2-1][i/2] && mismatch[0] == 0) ? 3 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3961 (score[i/2][i/2+1]-score[i/2-1][i/2+1]==1)? 1 :
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3962 (score[i/2][i/2+1]-score[i/2][i/2]==1)? 2 : 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3963
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3964
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3965 //fill the last the last element of the matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3966 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3967 Diag = _mm_sub_epi8(Diag, Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3968 mismatch[0] = ((a[i/2]) != (b[rSeqLength-1]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3969 Diag = _mm_insert_epi16(Diag,mismatch[0],0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3970
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3971 Down = _mm_sub_epi8(Down, Down);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3972 Down = _mm_insert_epi16(Down,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3973
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3974 Side = _mm_sub_epi8(Side, Side);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3975 Side = _mm_insert_epi16(Side,1,0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3976
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3977 tmp = _mm_srli_si128(R1,2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3978
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3979 R0 = _mm_min_epi16(R1+Down, R0+Diag);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3980 R0 = _mm_min_epi16(R0,tmp+Side);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3981
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3982 i0 = _mm_extract_epi16(R0, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3983
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3984 error = min(error, i0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3985 if(error == i0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3986 minIndex2 = i-rSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3987
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3988 if(mismatch[0] == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3989 direction2[rSeqLength][rSeqLength+errThreshold] = 3;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3990 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3991 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3992 if(score[rSeqLength][rSeqLength+errThreshold] - score[rSeqLength][rSeqLength+errThreshold-1] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3993 direction2[lSeqLength][lSeqLength+errThreshold] = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3994 else if(score[rSeqLength][rSeqLength+errThreshold] - score[rSeqLength-1][rSeqLength+errThreshold] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3995 direction2[rSeqLength][rSeqLength+errThreshold] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3996 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3997 direction2[rSeqLength][rSeqLength+errThreshold] = 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3998 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
3999
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4000 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4001
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4002 totalError = error1 + error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4003
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4004 size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4005 directionIndex = rSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4006 rIndex = minIndex2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4007
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4008
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4009 if(rSeqLength > e)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4010 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4011 while(directionIndex != 0 || rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4012 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4013
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4014 if(direction2[directionIndex][rIndex] == 3)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4015 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4016 matrixR[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4017 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4018 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4019 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4020 else if(direction2[directionIndex][rIndex] == 4)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4021 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4022 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4023 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4024 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4025 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4026 else if(direction2[directionIndex][rIndex] == 2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4027 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4028 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4029 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4030 matrixR[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4031 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4032 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4033 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4034 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4035 matrixR[size] = *(rSeq+directionIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4036 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4037 matrixR[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4038 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4039 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4040 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4041 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4042 matrixR[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4043 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4044 size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4045 directionIndex = lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4046 rIndex = minIndex1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4047
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4048 while(directionIndex != 0 || rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4049 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4050
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4051 if(direction1[directionIndex][rIndex] == 3)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4052 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4053 matrixL[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4054 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4055 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4056 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4057 else if(direction1[directionIndex][rIndex] == 4)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4058 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4059 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4060 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4061 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4062 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4063 else if(direction1[directionIndex][rIndex] == 2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4064 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4065 matrixL[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4066 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4067 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4068 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4069 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4070 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4071 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4072 matrixL[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4073 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4074 matrixL[size] = *(lSeq+lSeqLength-directionIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4075 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4076 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4077
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4078 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4079 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4080
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4081 matrixL[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4082
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4083 char middle[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4084 middle[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4085
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4086 for(i = 0; i < segLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4087 middle[i] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4088 middle[segLength] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4089
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4090 char rmatrixR[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4091
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4092 reverse(matrixR, rmatrixR, strlen(matrixR));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4093
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4094 sprintf(matrix, "%s%s%s", matrixL, middle, rmatrixR);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4095
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4096 return totalError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4097 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4098
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4099 int verifySingleEndEditDistance4(int refIndex, char *lSeq, int lSeqLength, char *rSeq, int rSeqLength, int segLength, char *matrix, int *map_location, short *seqHashValue)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4100 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4101
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4102 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4103
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4104 char * ref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4105 char * tempref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4106
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4107 int rIndex = 0; //reference Index
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4108
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4109 int error = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4110 int error1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4111
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4112 int error2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4113 int error3 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4114 int totalError = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4115 int errorSegment = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4116
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4117 int ERROR_BOUND = errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4118
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4119
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4120 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4121 1: Up
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4122 2: Side
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4123 3: Diagnoal Match
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4124 4: Diagnoal Mismatch
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4125 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4126
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4127 int min = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4128 int minIndex1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4129 int minIndex2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4130
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4131 int directionIndex = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4132
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4133
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4134 int size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4135
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4136 ref = _msf_refGen + refIndex - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4137 tempref = _msf_refGen + refIndex - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4138
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4139
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4140 if(lSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4141 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4142 error3 = backwardEditDistance4SSE2(ref-1, lSeqLength, lSeq+lSeqLength-1, lSeqLength);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4143 if(error3 == -1 || error3 == 0){
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4144 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4145 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4146 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4147
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4148 if(rSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4149 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4150 error2 = forwardEditDistance4SSE2(ref+segLength, rSeqLength, rSeq, rSeqLength);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4151 if(error2 == -1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4152 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4153 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4154
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4155 if(error2 + error3 > errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4156 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4157
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4158 rIndex = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4159
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4160 int prevError = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4161
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4162 int tempUp = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4163 int tempDown = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4164
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4165 int errorString = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4166
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4167 int upValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4168 int diagValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4169 int sideValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4170
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4171 while(rIndex <= lSeqLength+errThreshold && lSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4172 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4173 tempUp = ((rIndex - ERROR_BOUND) > 0 ? ((rIndex > lSeqLength) ? lSeqLength - ERROR_BOUND :rIndex - ERROR_BOUND) : 1 );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4174 tempDown = ((rIndex >= lSeqLength-ERROR_BOUND ) ? lSeqLength+1 :rIndex + ERROR_BOUND + 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4175 for(i = tempUp ; i < tempDown ; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4176 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4177 errorString = (*(ref-rIndex) == *(lSeq+lSeqLength-i));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4178
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4179 upValue = scoreB[i-1][rIndex]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4180 diagValue = scoreB[i-1][rIndex-1]+ !errorString;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4181 sideValue = scoreB[i][rIndex-1]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4182
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4183 if(i != tempUp && i != tempDown-1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4184 scoreB[i][rIndex] = min3(sideValue, diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4185
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4186 else if( (i == ((rIndex - ERROR_BOUND) > 0 ? rIndex - ERROR_BOUND : 1)) && rIndex <= lSeqLength )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4187 scoreB[i][rIndex] = min(sideValue, diagValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4188 else if(rIndex > lSeqLength && (i == lSeqLength - ERROR_BOUND) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4189 scoreB[i][rIndex] = sideValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4190 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4191 scoreB[i][rIndex] = min(diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4192
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4193 if(i == tempUp)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4194 error = scoreB[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4195 else if(error > scoreB[i][rIndex])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4196 error = scoreB[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4197 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4198 if(rIndex <= lSeqLength)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4199 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4200 errorSegment = error-prevError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4201 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4202 rIndex++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4203 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4204
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4205 if(lSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4206 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4207 min = scoreB[lSeqLength][lSeqLength+errThreshold];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4208 minIndex1 = lSeqLength + errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4209
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4210 // Find the Best error for all the possible ways.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4211 for(i = 1; i <= 2*errThreshold; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4212 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4213 if(min >= scoreB[lSeqLength][lSeqLength+errThreshold-i] && lSeqLength+errThreshold-i > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4214 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4215 min = scoreB[lSeqLength][lSeqLength+errThreshold-i];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4216 minIndex1 = lSeqLength+errThreshold-i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4217 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4218 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4219 error = scoreB[lSeqLength][minIndex1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4220 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4221
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4222 error1 = error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4223
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4224 error = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4225 errorSegment = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4226
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4227 directionIndex = lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4228 rIndex = minIndex1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4229
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4230
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4231 *map_location = ((lSeqLength == 0) ? refIndex : refIndex - rIndex) ;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4232
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4233 ref = ref + segLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4234
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4235 if(rSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4236 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4237 rIndex = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4238 while(rIndex <= rSeqLength+errThreshold-error1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4239 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4240 tempUp = (rIndex - ERROR_BOUND) > 0 ? ((rIndex > rSeqLength) ? rSeqLength - ERROR_BOUND :rIndex - ERROR_BOUND) : 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4241 tempDown = ((rIndex >= rSeqLength- ERROR_BOUND ) ? rSeqLength+1 :rIndex + ERROR_BOUND + 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4242 for(i = tempUp; i < tempDown ; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4243 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4244 errorString = (*(ref+rIndex-1) == *(rSeq+i-1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4245
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4246 upValue = scoreF[i-1][rIndex]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4247 diagValue = scoreF[i-1][rIndex-1]+ !errorString;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4248 sideValue = scoreF[i][rIndex-1]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4249
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4250 if(i != tempUp && i != tempDown-1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4251 scoreF[i][rIndex] = min3(sideValue, diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4252 else if( (i == ((rIndex - ERROR_BOUND ) > 0 ? rIndex - ERROR_BOUND : 1)) && rIndex <= rSeqLength )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4253 scoreF[i][rIndex] = min(sideValue, diagValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4254 else if(rIndex > rSeqLength && (i == rSeqLength - ERROR_BOUND) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4255 scoreF[i][rIndex] = sideValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4256 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4257 scoreF[i][rIndex] = min(diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4258
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4259 if(i == tempUp)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4260 error = scoreF[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4261 if(error > scoreF[i][rIndex])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4262 error = scoreF[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4263 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4264 if(rIndex <= rSeqLength)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4265 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4266 errorSegment = error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4267 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4268
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4269 rIndex++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4270 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4271
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4272 min = scoreF[rSeqLength][rSeqLength+errThreshold-error1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4273 minIndex2 = rSeqLength + errThreshold-error1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4274
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4275 // Find the Best error for all the possible ways.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4276 for(i = 1; i <= 2*(errThreshold-error1); i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4277 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4278 if(min > scoreF[rSeqLength][rSeqLength+errThreshold-error1-i] && rSeqLength+errThreshold-error1-i > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4279 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4280 min = scoreF[rSeqLength][rSeqLength+errThreshold-error1-i];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4281 minIndex2 = rSeqLength+errThreshold-error1-i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4282 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4283 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4284 error = scoreF[rSeqLength][minIndex2];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4285 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4286
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4287 totalError = error + error1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4288
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4289 if(errThreshold > 4)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4290 printf("ERROR in errorThreshold.\n");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4291
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4292
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4293 if(totalError != error2 + error3 && totalError > errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4294 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4295 printf("ErrorF=%d, ErrorB=%d Error=%d Error=%d\n", error2,error3,error1,error);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4296
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4297 scanf("%d", &i);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4298 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4299
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4300 char matrixR[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4301 char matrixL[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4302
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4303 matrixR[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4304 matrixL[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4305
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4306 size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4307 directionIndex = rSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4308 rIndex = minIndex2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4309
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4310 while(directionIndex != 0 || rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4311 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4312 if(directionIndex-rIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4313 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4314 if(scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4315 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4316 matrixR[size] = *(rSeq+directionIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4317 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4318 matrixR[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4319 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4320 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4321 else if( scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4322 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4323 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4324 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4325 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4326 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4327 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4328 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4329 matrixR[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4330 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4331 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4332 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4333
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4334 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4335 else if(rIndex - directionIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4336 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4337 if(scoreF[directionIndex][rIndex] - scoreF[directionIndex][rIndex-1] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4338 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4339 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4340 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4341 matrixR[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4342 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4343 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4344 else if( scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4345 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4346 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4347 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4348 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4349 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4350 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4351 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4352 matrixR[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4353 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4354 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4355 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4356 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4357 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4358 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4359 if(scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex] == 1 && directionIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4360 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4361 matrixR[size] = *(rSeq+directionIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4362 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4363 matrixR[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4364 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4365 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4366 else if(scoreF[directionIndex][rIndex] - scoreF[directionIndex][rIndex-1] == 1 && rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4367 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4368 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4369 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4370 matrixR[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4371 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4372 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4373 else if( scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4374 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4375 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4376 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4377 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4378 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4379 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4380 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4381 matrixR[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4382 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4383 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4384 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4385 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4386 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4387 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4388 matrixR[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4389
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4390 size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4391 directionIndex = lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4392 rIndex = minIndex1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4393
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4394
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4395 while(directionIndex != 0 || rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4396 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4397 if(directionIndex-rIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4398 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4399 if(scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4400 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4401 matrixL[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4402 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4403 matrixL[size] = *(lSeq+lSeqLength-directionIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4404 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4405 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4406 else if( scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4407 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4408 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4409 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4410 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4411 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4412 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4413 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4414 matrixL[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4415 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4416 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4417 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4418
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4419 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4420 else if(rIndex - directionIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4421 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4422 if(scoreB[directionIndex][rIndex] - scoreB[directionIndex][rIndex-1] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4423 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4424 matrixL[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4425 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4426 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4427 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4428 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4429 else if( scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4430 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4431 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4432 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4433 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4434 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4435 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4436 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4437 matrixL[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4438 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4439 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4440 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4441 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4442 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4443 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4444 if(scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex] == 1 && directionIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4445 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4446 matrixL[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4447 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4448 matrixL[size] = *(lSeq+lSeqLength-directionIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4449 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4450 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4451 else if(scoreB[directionIndex][rIndex] - scoreB[directionIndex][rIndex-1] == 1 && rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4452 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4453 matrixL[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4454 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4455 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4456 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4457 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4458 else if( scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4459 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4460 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4461 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4462 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4463 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4464 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4465 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4466 matrixL[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4467 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4468 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4469 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4470 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4471
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4472 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4473 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4474
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4475 matrixL[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4476 char middle[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4477 middle[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4478
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4479 for(i = 0; i < segLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4480 middle[i] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4481 middle[segLength] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4482
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4483 char rmatrixR[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4484
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4485 reverse(matrixR, rmatrixR, strlen(matrixR));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4486
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4487 sprintf(matrix, "%s%s%s", matrixL, middle, rmatrixR);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4488
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4489 return totalError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4490
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4491 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4492
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4493 int verifySingleEndEditDistanceExtention(int refIndex, char *lSeq, int lSeqLength, char *rSeq, int rSeqLength, int segLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4494 char *matrix, int *map_location, short *seqHashValue)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4495 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4496 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4497
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4498 char * ref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4499 char * tempref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4500
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4501 int rIndex = 0; //reference Index
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4502
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4503 int error = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4504 int error1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4505
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4506 int error2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4507 int error3 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4508 int totalError = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4509 int errorSegment = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4510
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4511 int ERROR_BOUND = min(4, errThreshold);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4512
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4513
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4514 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4515 1: Up
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4516 2: Side
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4517 3: Diagnoal Match
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4518 4: Diagnoal Mismatch
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4519 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4520
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4521 int min = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4522 int minIndex1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4523 int minIndex2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4524
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4525 int directionIndex = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4526
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4527
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4528 int size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4529
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4530 ref = _msf_refGen + refIndex - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4531 tempref = _msf_refGen + refIndex - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4532
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4533
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4534 if(lSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4535 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4536 error3 = backwardEditDistanceSSE2Extention(ref-1, lSeqLength, lSeq+lSeqLength-1, lSeqLength);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4537 if(error3 == -1){
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4538 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4539 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4540 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4541
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4542 if(rSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4543 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4544 error2 = forwardEditDistanceSSE2Extention(ref+segLength, rSeqLength, rSeq, rSeqLength);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4545 if(error2 == -1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4546 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4547 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4548
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4549 if(error2 + error3 > errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4550 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4551
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4552 rIndex = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4553
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4554 int prevError = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4555
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4556 int tempUp = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4557 int tempDown = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4558
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4559 int errorString = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4560
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4561 int upValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4562 int diagValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4563 int sideValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4564 if(lSeqLength > ERROR_BOUND)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4565 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4566 while(rIndex <= lSeqLength+ERROR_BOUND && lSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4567 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4568 tempUp = ((rIndex - ERROR_BOUND) > 0 ? ((rIndex > lSeqLength) ? lSeqLength - ERROR_BOUND :rIndex - ERROR_BOUND) : 1 );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4569 tempDown = ((rIndex >= lSeqLength-ERROR_BOUND ) ? lSeqLength+1 :rIndex + ERROR_BOUND + 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4570 for(i = tempUp ; i < tempDown ; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4571 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4572 errorString = (*(ref-rIndex) == *(lSeq+lSeqLength-i));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4573
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4574 upValue = scoreB[i-1][rIndex]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4575 diagValue = scoreB[i-1][rIndex-1]+ !errorString;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4576 sideValue = scoreB[i][rIndex-1]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4577
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4578 if(i != tempUp && i != tempDown-1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4579 scoreB[i][rIndex] = min3(sideValue, diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4580
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4581 else if( (i == ((rIndex - ERROR_BOUND) > 0 ? rIndex - ERROR_BOUND : 1)) && rIndex <= lSeqLength )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4582 scoreB[i][rIndex] = min(sideValue, diagValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4583 else if(rIndex > lSeqLength && (i == lSeqLength - ERROR_BOUND) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4584 scoreB[i][rIndex] = sideValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4585 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4586 scoreB[i][rIndex] = min(diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4587
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4588 if(i == tempUp)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4589 error = scoreB[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4590 else if(error > scoreB[i][rIndex])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4591 error = scoreB[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4592 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4593 if(rIndex <= lSeqLength)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4594 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4595 errorSegment = error-prevError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4596 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4597 rIndex++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4598 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4599
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4600 if(lSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4601 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4602 min = scoreB[lSeqLength][lSeqLength+ERROR_BOUND];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4603 minIndex1 = lSeqLength + ERROR_BOUND;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4604
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4605 // Find the Best error for all the possible ways.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4606 for(i = 1; i <= 2*ERROR_BOUND; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4607 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4608 if(min >= scoreB[lSeqLength][lSeqLength+ERROR_BOUND-i] && lSeqLength+ERROR_BOUND-i > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4609 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4610 min = scoreB[lSeqLength][lSeqLength+ERROR_BOUND-i];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4611 minIndex1 = lSeqLength+ERROR_BOUND-i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4612 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4613 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4614 error = scoreB[lSeqLength][minIndex1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4615 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4616 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4617 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4618 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4619 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4620 for(i = 1; i <= lSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4621 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4622 for(j = 1; j <= lSeqLength; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4623 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4624 scoreB[i][j] = min3(scoreB[i-1][j-1]+ (*(ref-j) != *(lSeq+lSeqLength-i) ),scoreB[i][j-1]+1 ,scoreB[i-1][j]+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4625 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4626 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4627 error = scoreB[lSeqLength][lSeqLength];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4628 minIndex1 = lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4629
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4630 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4631 error1 = error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4632
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4633 error = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4634 errorSegment = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4635
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4636 directionIndex = lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4637 rIndex = minIndex1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4638
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4639 *map_location = ((lSeqLength == 0) ? refIndex : refIndex - rIndex) ;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4640
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4641 ref = ref + segLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4642
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4643 if(rSeqLength != 0 && rSeqLength > ERROR_BOUND)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4644 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4645 ERROR_BOUND = min(ERROR_BOUND, rSeqLength);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4646
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4647 if(rSeqLength == ERROR_BOUND)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4648 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4649 for(i=0; i < 2*ERROR_BOUND; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4650 scoreF[0][i] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4651 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4652
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4653 rIndex = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4654 while(rIndex <= rSeqLength+ERROR_BOUND)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4655 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4656 tempUp = (rIndex - ERROR_BOUND) > 0 ? ((rIndex > rSeqLength) ? rSeqLength - ERROR_BOUND :rIndex - ERROR_BOUND) : 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4657 tempDown = ((rIndex >= rSeqLength- ERROR_BOUND ) ? rSeqLength+1 :rIndex + ERROR_BOUND + 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4658 for(i = tempUp; i < tempDown ; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4659 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4660 errorString = (*(ref+rIndex-1) == *(rSeq+i-1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4661 upValue = scoreF[i-1][rIndex]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4662 diagValue = scoreF[i-1][rIndex-1]+ !errorString;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4663 sideValue = scoreF[i][rIndex-1]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4664
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4665 if(i != tempUp && i != tempDown-1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4666 scoreF[i][rIndex] = min3(sideValue, diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4667 else if( (i == ((rIndex - ERROR_BOUND ) > 0 ? rIndex - ERROR_BOUND : 1)) && rIndex <= rSeqLength )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4668 scoreF[i][rIndex] = min(sideValue, diagValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4669 else if(rIndex > rSeqLength && (i == rSeqLength - ERROR_BOUND) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4670 scoreF[i][rIndex] = sideValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4671 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4672 scoreF[i][rIndex] = min(diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4673
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4674 if(i == tempUp)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4675 error = scoreF[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4676 if(error > scoreF[i][rIndex])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4677 error = scoreF[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4678 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4679 if(rIndex <= rSeqLength)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4680 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4681 errorSegment = error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4682 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4683 rIndex++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4684 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4685 min = scoreF[rSeqLength][rSeqLength+ERROR_BOUND];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4686 minIndex2 = rSeqLength + ERROR_BOUND;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4687
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4688 // Find the Best error for all the possible ways.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4689 for(i = 1; i <= 2*ERROR_BOUND; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4690 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4691 if(min > scoreF[rSeqLength][rSeqLength+ERROR_BOUND-i] && rSeqLength+ERROR_BOUND-i > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4692 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4693 min = scoreF[rSeqLength][rSeqLength+ERROR_BOUND-i];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4694 minIndex2 = rSeqLength+ERROR_BOUND-i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4695 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4696 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4697 error = scoreF[rSeqLength][minIndex2];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4698 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4699 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4700 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4701 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4702 for(i = 1; i <= rSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4703 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4704 for(j = 1; j <= rSeqLength; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4705 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4706 scoreF[i][j] = min3(scoreF[i-1][j-1]+ (*(ref+j-1) != *(rSeq+i-1) ),scoreF[i][j-1]+1 ,scoreF[i-1][j]+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4707 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4708 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4709 error = scoreF[rSeqLength][rSeqLength];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4710 minIndex2 = rSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4711 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4712
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4713 totalError = error + error1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4714
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4715 if(totalError != error2+error3)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4716 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4717 for(i = 0; i < lSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4718 printf("%c", *(tempref-1-i));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4719 printf("\n");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4720 for(i = 0; i < lSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4721 printf("%c", *(lSeq+i));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4722 printf("\n");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4723
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4724 for(i = 0; i < rSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4725 printf("%c", *(tempref+segLength+i));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4726 printf("\n");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4727
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4728 for(i = 0; i < rSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4729 printf("%c", *(rSeq+i));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4730 printf("\n");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4731
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4732 printf("ERROR=%d\n", totalError);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4733 printf("ERROR_SSE=%d\n", error3+error2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4734
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4735 printf("ERROR_SSE_back=%d E_SSE_forw=%d\n", error3, error2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4736 printf("ERROR_back=%d E_forw=%d\n", error1, error);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4737
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4738 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4739
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4740 char matrixR[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4741 char matrixL[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4742
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4743 matrixR[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4744 matrixL[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4745
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4746 size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4747 directionIndex = rSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4748 rIndex = minIndex2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4749
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4750
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4751 while(directionIndex != 0 || rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4752 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4753 if(directionIndex-rIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4754 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4755 if(scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4756 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4757 matrixR[size] = *(rSeq+directionIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4758 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4759 matrixR[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4760 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4761 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4762 else if( scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4763 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4764 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4765 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4766 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4767 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4768 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4769 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4770 matrixR[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4771 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4772 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4773 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4774
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4775 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4776 else if(rIndex - directionIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4777 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4778 if(scoreF[directionIndex][rIndex] - scoreF[directionIndex][rIndex-1] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4779 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4780 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4781 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4782 matrixR[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4783 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4784 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4785 else if( scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4786 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4787 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4788 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4789 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4790 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4791 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4792 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4793 matrixR[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4794 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4795 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4796 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4797 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4798 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4799 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4800 if(scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex] == 1 && directionIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4801 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4802 matrixR[size] = *(rSeq+directionIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4803 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4804 matrixR[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4805 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4806 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4807 else if(scoreF[directionIndex][rIndex] - scoreF[directionIndex][rIndex-1] == 1 && rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4808 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4809 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4810 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4811 matrixR[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4812 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4813 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4814 else if( scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4815 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4816 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4817 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4818 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4819 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4820 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4821 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4822 matrixR[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4823 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4824 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4825 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4826 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4827 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4828 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4829 matrixR[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4830
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4831 size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4832 directionIndex = lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4833 rIndex = minIndex1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4834
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4835
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4836 while(directionIndex != 0 || rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4837 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4838 if(directionIndex-rIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4839 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4840 if(scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4841 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4842 matrixL[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4843 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4844 matrixL[size] = *(lSeq+lSeqLength-directionIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4845 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4846 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4847 else if( scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4848 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4849 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4850 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4851 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4852 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4853 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4854 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4855 matrixL[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4856 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4857 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4858 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4859
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4860 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4861 else if(rIndex - directionIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4862 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4863 if(scoreB[directionIndex][rIndex] - scoreB[directionIndex][rIndex-1] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4864 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4865 matrixL[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4866 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4867 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4868 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4869 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4870 else if( scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4871 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4872 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4873 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4874 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4875 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4876 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4877 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4878 matrixL[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4879 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4880 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4881 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4882 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4883 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4884 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4885 if(scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex] == 1 && directionIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4886 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4887 matrixL[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4888 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4889 matrixL[size] = *(lSeq+lSeqLength-directionIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4890 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4891 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4892 else if(scoreB[directionIndex][rIndex] - scoreB[directionIndex][rIndex-1] == 1 && rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4893 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4894 matrixL[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4895 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4896 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4897 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4898 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4899 else if( scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4900 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4901 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4902 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4903 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4904 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4905 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4906 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4907 matrixL[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4908 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4909 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4910 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4911 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4912 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4913 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4914 matrixL[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4915
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4916 char middle[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4917 middle[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4918 for(i = 0; i < segLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4919 middle[i] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4920 middle[segLength] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4921
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4922 char rmatrixR[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4923
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4924 reverse(matrixR, rmatrixR, strlen(matrixR));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4925
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4926 sprintf(matrix, "%s%s%s", matrixL, middle, rmatrixR);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4927
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4928
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4929 return totalError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4930
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4931 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4932
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4933
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4934 int verifySingleEndEditDistance(int refIndex, char *lSeq, int lSeqLength, char *rSeq, int rSeqLength, int segLength, char *matrix, int *map_location, short *seqHashValue)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4935 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4936
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4937 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4938
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4939 char * ref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4940 char * tempref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4941
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4942 int rIndex = 0; //reference Index
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4943
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4944 int error = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4945 int error1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4946
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4947 int error2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4948 int error3 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4949
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4950 int totalError = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4951 int errorSegment = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4952
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4953 int ERROR_BOUND = errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4954
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4955 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4956 1: Up
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4957 2: Side
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4958 3: Diagnoal Match
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4959 4: Diagnoal Mismatch
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4960 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4961
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4962 int min = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4963 int minIndex1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4964 int minIndex2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4965
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4966 int directionIndex = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4967
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4968
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4969 int size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4970
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4971 ref = _msf_refGen + refIndex - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4972 tempref = _msf_refGen + refIndex - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4973
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4974
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4975 if(rSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4976 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4977 if(errThreshold %2 == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4978 error2 = forwardEditDistanceSSE2Odd(ref+segLength, rSeqLength, rSeq, rSeqLength);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4979 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4980 error2 = forwardEditDistanceSSE2G(ref+segLength, rSeqLength, rSeq, rSeqLength);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4981 if(error2 == -1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4982 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4983 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4984
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4985 if(lSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4986 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4987 if(errThreshold % 2 == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4988 error3 = backwardEditDistanceSSE2Odd(ref-1, lSeqLength, lSeq+lSeqLength-1, lSeqLength);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4989 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4990 error3 = backwardEditDistanceSSE2G(ref-1, lSeqLength, lSeq+lSeqLength-1, lSeqLength);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4991 if(error3 == -1 || error3 == 0){
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4992 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4993 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4994 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4995
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4996 if(error3 + error2 > errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4997 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4998
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
4999 for(i = 0 ; i < errThreshold + 1; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5000 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5001 scoreB[0][i] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5002 scoreB[i][0] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5003 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5004
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5005 rIndex = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5006 int prevError = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5007
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5008 int tempUp = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5009 int tempDown = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5010
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5011 int errorString = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5012
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5013 int upValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5014 int diagValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5015 int sideValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5016
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5017 while(rIndex <= lSeqLength+errThreshold && lSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5018 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5019 tempUp = ((rIndex - ERROR_BOUND) > 0 ? ((rIndex > lSeqLength) ? lSeqLength - ERROR_BOUND :rIndex - ERROR_BOUND) : 1 );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5020 tempDown = ((rIndex >= lSeqLength-ERROR_BOUND ) ? lSeqLength+1 :rIndex + ERROR_BOUND + 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5021 for(i = tempUp ; i < tempDown ; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5022 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5023 errorString = (*(ref-rIndex) == *(lSeq+lSeqLength-i));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5024
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5025 upValue = scoreB[i-1][rIndex]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5026 diagValue = scoreB[i-1][rIndex-1]+ !errorString;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5027 sideValue = scoreB[i][rIndex-1]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5028
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5029 if(i != tempUp && i != tempDown-1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5030 scoreB[i][rIndex] = min3(sideValue, diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5031
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5032 else if( (i == ((rIndex - ERROR_BOUND) > 0 ? rIndex - ERROR_BOUND : 1)) && rIndex <= lSeqLength )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5033 scoreB[i][rIndex] = min(sideValue, diagValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5034 else if(rIndex > lSeqLength && (i == lSeqLength - ERROR_BOUND) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5035 scoreB[i][rIndex] = sideValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5036 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5037 scoreB[i][rIndex] = min(diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5038
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5039 if(i == tempUp)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5040 error = scoreB[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5041 else if(error > scoreB[i][rIndex])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5042 error = scoreB[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5043 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5044 if(rIndex <= lSeqLength)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5045 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5046 errorSegment = error-prevError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5047 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5048 rIndex++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5049 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5050 if(lSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5051 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5052 min = scoreB[lSeqLength][lSeqLength+errThreshold];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5053 minIndex1 = lSeqLength + errThreshold;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5054
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5055 // Find the Best error for all the possible ways.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5056 for(i = 1; i <= 2*errThreshold; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5057 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5058 if(min >= scoreB[lSeqLength][lSeqLength+errThreshold-i] && lSeqLength+errThreshold-i > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5059 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5060 min = scoreB[lSeqLength][lSeqLength+errThreshold-i];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5061 minIndex1 = lSeqLength+errThreshold-i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5062 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5063 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5064 error = scoreB[lSeqLength][minIndex1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5065 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5066
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5067 error1 = error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5068
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5069 error = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5070 errorSegment = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5071
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5072 directionIndex = lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5073 rIndex = minIndex1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5074
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5075 *map_location = ((lSeqLength == 0) ? refIndex : refIndex - rIndex) ;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5076
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5077 ref = ref + segLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5078
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5079 if(rSeqLength != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5080 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5081 for(i = 0 ; i < errThreshold + 1; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5082 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5083 scoreF[0][i] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5084 scoreF[i][0] = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5085 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5086
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5087
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5088 rIndex = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5089 while(rIndex <= rSeqLength+errThreshold-error1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5090 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5091 tempUp = (rIndex - ERROR_BOUND) > 0 ? ((rIndex > rSeqLength) ? rSeqLength - ERROR_BOUND :rIndex - ERROR_BOUND) : 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5092 tempDown = ((rIndex >= rSeqLength- ERROR_BOUND ) ? rSeqLength+1 :rIndex + ERROR_BOUND + 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5093 for(i = tempUp; i < tempDown ; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5094 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5095 errorString = (*(ref+rIndex-1) == *(rSeq+i-1));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5096
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5097 upValue = scoreF[i-1][rIndex]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5098 diagValue = scoreF[i-1][rIndex-1]+ !errorString;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5099 sideValue = scoreF[i][rIndex-1]+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5100
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5101 if(i != tempUp && i != tempDown-1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5102 scoreF[i][rIndex] = min3(sideValue, diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5103 else if( (i == ((rIndex - ERROR_BOUND ) > 0 ? rIndex - ERROR_BOUND : 1)) && rIndex <= rSeqLength )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5104 scoreF[i][rIndex] = min(sideValue, diagValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5105 else if(rIndex > rSeqLength && (i == rSeqLength - ERROR_BOUND) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5106 scoreF[i][rIndex] = sideValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5107 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5108 scoreF[i][rIndex] = min(diagValue , upValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5109
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5110 if(i == tempUp)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5111 error = scoreF[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5112 if(error > scoreF[i][rIndex])
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5113 error = scoreF[i][rIndex];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5114 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5115 if(rIndex <= rSeqLength)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5116 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5117 errorSegment = error;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5118 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5119 rIndex++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5120 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5121
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5122 min = scoreF[rSeqLength][rSeqLength+errThreshold-error1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5123 minIndex2 = rSeqLength + errThreshold-error1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5124
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5125 // Find the Best error for all the possible ways.
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5126 for(i = 1; i <= 2*(errThreshold-error1); i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5127 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5128 if(min > scoreF[rSeqLength][rSeqLength+errThreshold-error1-i] && rSeqLength+errThreshold-error1-i > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5129 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5130 min = scoreF[rSeqLength][rSeqLength+errThreshold-error1-i];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5131 minIndex2 = rSeqLength+errThreshold-error1-i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5132 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5133 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5134 error = scoreF[rSeqLength][minIndex2];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5135 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5136
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5137 totalError = error + error1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5138
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5139
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5140 if(totalError != error2 + error3 && totalError > errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5141 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5142 for(i = 0; i < lSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5143 printf("%c", *(tempref-1-i));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5144 printf("\n");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5145 for(i = 0; i < lSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5146 printf("%c", *(lSeq+i));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5147 printf("\n");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5148
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5149 for(i = 0; i < rSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5150 printf("%c", *(tempref+segLength+i));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5151 printf("\n");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5152
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5153 for(i = 0; i < rSeqLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5154 printf("%c", *(rSeq+i));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5155 printf("\n");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5156
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5157
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5158 printf("SSEF=%d SSEB%d\n", error2, error3);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5159 printf("F=%d B=%d\n", error, error1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5160 scanf("%d", &i);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5161 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5162
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5163 char matrixR[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5164 char matrixL[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5165
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5166 matrixR[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5167 matrixL[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5168
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5169 size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5170 directionIndex = rSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5171 rIndex = minIndex2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5172
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5173 while(directionIndex != 0 || rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5174 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5175 if(directionIndex-rIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5176 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5177 if(scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5178 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5179 matrixR[size] = *(rSeq+directionIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5180 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5181 matrixR[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5182 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5183 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5184 else if( scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5185 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5186 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5187 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5188 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5189 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5190 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5191 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5192 matrixR[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5193 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5194 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5195 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5196
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5197 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5198 else if(rIndex - directionIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5199 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5200 if(scoreF[directionIndex][rIndex] - scoreF[directionIndex][rIndex-1] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5201 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5202 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5203 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5204 matrixR[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5205 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5206 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5207 else if( scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5208 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5209 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5210 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5211 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5212 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5213 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5214 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5215 matrixR[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5216 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5217 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5218 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5219 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5220 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5221 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5222 if(scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex] == 1 && directionIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5223 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5224 matrixR[size] = *(rSeq+directionIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5225 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5226 matrixR[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5227 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5228 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5229 else if(scoreF[directionIndex][rIndex] - scoreF[directionIndex][rIndex-1] == 1 && rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5230 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5231 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5232 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5233 matrixR[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5234 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5235 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5236 else if( scoreF[directionIndex][rIndex] - scoreF[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5237 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5238 matrixR[size] = *(ref+rIndex-1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5239 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5240 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5241 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5242 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5243 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5244 matrixR[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5245 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5246 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5247 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5248 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5249 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5250 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5251 matrixR[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5252
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5253 size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5254 directionIndex = lSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5255 rIndex = minIndex1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5256
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5257
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5258 while(directionIndex != 0 || rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5259 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5260 if(directionIndex-rIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5261 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5262 if(scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5263 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5264 matrixL[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5265 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5266 matrixL[size] = *(lSeq+lSeqLength-directionIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5267 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5268 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5269 else if( scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5270 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5271 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5272 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5273 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5274 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5275 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5276 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5277 matrixL[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5278 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5279 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5280 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5281
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5282 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5283 else if(rIndex - directionIndex == errThreshold)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5284 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5285 if(scoreB[directionIndex][rIndex] - scoreB[directionIndex][rIndex-1] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5286 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5287 matrixL[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5288 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5289 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5290 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5291 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5292 else if( scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5293 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5294 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5295 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5296 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5297 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5298 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5299 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5300 matrixL[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5301 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5302 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5303 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5304 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5305 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5306 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5307 if(scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex] == 1 && directionIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5308 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5309 matrixL[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5310 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5311 matrixL[size] = *(lSeq+lSeqLength-directionIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5312 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5313 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5314 else if(scoreB[directionIndex][rIndex] - scoreB[directionIndex][rIndex-1] == 1 && rIndex != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5315 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5316 matrixL[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5317 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5318 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5319 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5320 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5321 else if( scoreB[directionIndex][rIndex] - scoreB[directionIndex-1][rIndex-1] == 1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5322 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5323 matrixL[size] = *(tempref-rIndex);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5324 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5325 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5326 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5327 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5328 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5329 matrixL[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5330 rIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5331 directionIndex--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5332 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5333 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5334 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5335 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5336 matrixL[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5337 char middle[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5338 middle[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5339 for(i = 0; i < segLength; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5340 middle[i] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5341 middle[segLength] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5342
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5343 char rmatrixR[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5344
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5345 reverse(matrixR, rmatrixR, strlen(matrixR));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5346
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5347 sprintf(matrix, "%s%s%s", matrixL, middle, rmatrixR);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5348
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5349 return totalError;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5350 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5351
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5352
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5353 int addCigarSize(int cnt){
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5354 if (cnt<10) return 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5355 else if (cnt < 100) return 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5356 return 3;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5357 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5358
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5359 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5360 Generate Cigar from the back tracking matrix
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5361 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5362 void generateCigar(char *matrix, int matrixLength, char *cigar)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5363 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5364 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5365
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5366 int counterM=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5367 int counterI=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5368 int counterD=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5369
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5370 int cigarSize = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5371
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5372 cigar[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5373
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5374 while(i < matrixLength)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5375 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5376 if(matrix[i]=='M')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5377 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5378 counterM++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5379 if(counterI != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5380 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5381 sprintf(cigar, "%s%dI", cigar, counterI);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5382 cigarSize += addCigarSize(counterI) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5383 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5384 counterI=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5385 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5386 else if(counterD != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5387 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5388 sprintf(cigar, "%s%dD", cigar, counterD);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5389 cigarSize += addCigarSize(counterD) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5390 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5391 counterD=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5392 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5393 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5394 else if(matrix[i] == 'I')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5395 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5396 if(counterM != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5397 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5398 sprintf(cigar, "%s%dM", cigar, counterM);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5399 cigarSize += addCigarSize(counterM) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5400 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5401 counterM = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5402 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5403 else if(counterD != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5404 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5405 sprintf(cigar, "%s%dD", cigar, counterD);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5406 cigarSize += addCigarSize(counterD) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5407 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5408 counterD=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5409 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5410 counterI++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5411 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5412
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5413 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5414 else if (matrix[i] == 'D')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5415 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5416 if(counterM != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5417 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5418 sprintf(cigar, "%s%dM", cigar, counterM);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5419 cigarSize += addCigarSize(counterM) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5420 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5421 counterM = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5422 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5423 else if(counterI != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5424 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5425 sprintf(cigar, "%s%dI", cigar, counterI);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5426 cigarSize += addCigarSize(counterI) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5427 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5428 counterI=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5429 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5430
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5431 counterD++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5432 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5433
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5434 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5435 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5436 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5437 counterM++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5438 if(counterI != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5439 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5440 sprintf(cigar, "%s%dI", cigar, counterI);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5441 cigarSize += addCigarSize(counterI) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5442 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5443 counterI=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5444 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5445 else if(counterD != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5446 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5447 sprintf(cigar, "%s%dD", cigar, counterD);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5448 cigarSize += addCigarSize(counterD) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5449 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5450 counterD=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5451 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5452 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5453 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5454 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5455
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5456 if(counterM != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5457 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5458 sprintf(cigar, "%s%dM", cigar, counterM);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5459 cigarSize += addCigarSize(counterM) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5460 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5461 counterM = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5462 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5463 else if(counterI != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5464 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5465 sprintf(cigar, "%s%dI", cigar, counterI);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5466 cigarSize += addCigarSize(counterI) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5467 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5468 counterI = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5469 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5470 else if(counterD != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5471 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5472 sprintf(cigar, "%s%dD", cigar, counterD);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5473 cigarSize += addCigarSize(counterD) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5474 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5475 counterD = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5476 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5477
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5478 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5479 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5480
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5481 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5482 Creates the Cigar output from the mismatching positions format [0-9]+(([ACTGN]|\^[ACTGN]+)[0-9]+)*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5483 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5484 void generateCigarFromMD(char *mismatch, int mismatchLength, char *cigar)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5485 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5486 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5487 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5488
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5489 int start = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5490 int cigarSize = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5491
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5492 cigar[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5493
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5494 while(i < mismatchLength)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5495 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5496 if(mismatch[i] >= '0' && mismatch[i] <= '9')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5497 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5498 start = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5499
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5500 while(mismatch[i] >= '0' && mismatch[i] <= '9' && i < mismatchLength)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5501 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5502
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5503 int value = atoi(mismatch+start);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5504 for(j = 0; j < value-1; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5505 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5506 cigar[cigarSize] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5507 cigarSize++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5508 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5509 cigar[cigarSize] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5510 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5511 else if(mismatch[i] == '^')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5512 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5513 cigar[cigarSize] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5514 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5515 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5516 else if(mismatch[i] == '\'')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5517 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5518 cigar[cigarSize] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5519 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5520 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5521 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5522 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5523 cigar[cigarSize] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5524 cigarSize++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5525 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5526 cigarSize++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5527 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5528 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5529 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5530 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5531
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5532 void generateSNPSAM(char *matrix, int matrixLength, char *outputSNP)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5533 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5534
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5535 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5536
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5537 int counterM = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5538 int counterD = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5539
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5540 char delete[100];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5541
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5542 int snpSize = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5543
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5544 outputSNP[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5545 delete[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5546
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5547
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5548 while(i < matrixLength)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5549 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5550 if(matrix[i]=='M')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5551 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5552 counterM++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5553 if(counterD != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5554 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5555 delete[counterD] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5556 counterD=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5557 sprintf(outputSNP, "%s^%s", outputSNP,delete);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5558 snpSize += strlen(delete) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5559 outputSNP[snpSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5560 delete[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5561 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5562 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5563 else if(matrix[i] == 'D')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5564 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5565 if(counterM != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5566 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5567 sprintf(outputSNP, "%s%d", outputSNP, counterM);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5568 snpSize += addCigarSize(counterM);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5569 outputSNP[snpSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5570 counterM=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5571 delete[counterD] = matrix[i+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5572 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5573 counterD++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5574 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5575 else if(counterD != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5576 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5577 delete[counterD] = matrix[i+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5578 counterD++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5579 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5580 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5581 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5582 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5583 delete[counterD] = matrix[i+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5584 counterD++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5585 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5586 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5587 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5588 else if(matrix[i] == 'I')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5589 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5590 if(counterM != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5591 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5592 // sprintf(outputSNP, "%s%d\0", outputSNP, counterM);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5593 //counterM++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5594 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5595 else if(counterD != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5596 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5597 delete[counterD] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5598 sprintf(outputSNP, "%s^%s", outputSNP, delete);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5599 snpSize += strlen(delete) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5600 outputSNP[snpSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5601 counterD = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5602 delete[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5603 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5604 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5605
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5606 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5607 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5608 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5609 if(counterM != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5610 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5611 sprintf(outputSNP, "%s%d", outputSNP, counterM);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5612 snpSize += addCigarSize(counterM);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5613 outputSNP[snpSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5614 counterM = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5615 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5616 if(counterD != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5617 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5618 delete[counterD] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5619 counterD=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5620 sprintf(outputSNP, "%s^%s", outputSNP, delete);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5621 snpSize += strlen(delete) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5622 outputSNP[snpSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5623 delete[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5624 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5625 sprintf(outputSNP,"%s%c",outputSNP,matrix[i]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5626 snpSize += 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5627 outputSNP[snpSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5628 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5629 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5630 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5631
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5632 if(counterM != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5633 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5634 sprintf(outputSNP, "%s%d", outputSNP, counterM);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5635 snpSize += addCigarSize(counterM);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5636 outputSNP[snpSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5637 counterM = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5638 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5639 else if(counterD != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5640 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5641 delete[counterD] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5642 sprintf(outputSNP, "%s^%s", outputSNP, delete);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5643 snpSize += strlen(delete) + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5644 outputSNP[snpSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5645 counterD = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5646 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5647
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5648 outputSNP[snpSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5649 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5650 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5651
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5652 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5653 direction = 0 forward
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5654 1 backward
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5655
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5656 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5657
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5658 void mapSingleEndSeq(unsigned int *l1, int s1, int readNumber, int readSegment, int direction)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5659 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5660 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5661 int z = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5662 int *locs = (int *) l1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5663 char *_tmpSeq, *_tmpQual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5664 char rqual[SEQ_LENGTH+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5665 rqual[SEQ_LENGTH]='\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5666
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5667 int genLoc = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5668 int leftSeqLength = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5669 int rightSeqLength = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5670 int middleSeqLength = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5671
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5672 char matrix[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5673 char editString[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5674 char cigar[MAX_CIGAR_SIZE];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5675
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5676 short *_tmpHashValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5677
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5678 if (direction)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5679 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5680 reverse(_msf_seqList[readNumber].qual, rqual, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5681 _tmpQual = rqual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5682 _tmpSeq = _msf_seqList[readNumber].rseq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5683 _tmpHashValue = _msf_seqList[readNumber].rhashValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5684 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5685 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5686 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5687 _tmpQual = _msf_seqList[readNumber].qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5688 _tmpSeq = _msf_seqList[readNumber].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5689 _tmpHashValue = _msf_seqList[readNumber].hashValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5690 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5691
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5692 int readId = 2*readNumber+direction;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5693 for (z=0; z<s1; z++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5694 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5695
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5696
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5697 int map_location = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5698 int a = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5699 int o = readSegment;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5700
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5701 genLoc = locs[z];//-_msf_samplingLocs[o];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5702
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5703
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5704 if ( genLoc-_msf_samplingLocs[o] < _msf_refGenBeg ||
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5705 genLoc-_msf_samplingLocs[o] > _msf_refGenEnd ||
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5706 _msf_verifiedLocs[genLoc-_msf_samplingLocs[o]] == readId ||
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5707 _msf_verifiedLocs[genLoc-_msf_samplingLocs[o]] == -readId
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5708 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5709 continue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5710 int err = -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5711
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5712
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5713 map_location = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5714
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5715 leftSeqLength = _msf_samplingLocs[o];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5716 middleSeqLength = WINDOW_SIZE;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5717 a = leftSeqLength + middleSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5718 rightSeqLength = SEQ_LENGTH - a;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5719
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5720 if(errThreshold == 2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5721 err = verifySingleEndEditDistance2(genLoc, _tmpSeq, leftSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5722 _tmpSeq + a, rightSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5723 middleSeqLength, matrix, &map_location, _tmpHashValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5724 else if(errThreshold == 4)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5725 err = verifySingleEndEditDistance4(genLoc, _tmpSeq, leftSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5726 _tmpSeq + a, rightSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5727 middleSeqLength, matrix, &map_location, _tmpHashValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5728 else if(errThreshold ==3)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5729 err = verifySingleEndEditDistance(genLoc, _tmpSeq, leftSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5730 _tmpSeq + a, rightSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5731 middleSeqLength, matrix, &map_location, _tmpHashValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5732 /*else if(errThreshold == 6)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5733 err = verifySingleEndEditDistance(genLoc, _tmpSeq, leftSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5734 _tmpSeq + a, rightSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5735 middleSeqLength, matrix, &map_location, _tmpHashValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5736 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5737 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5738 err = verifySingleEndEditDistanceExtention(genLoc, _tmpSeq, leftSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5739 _tmpSeq + a, rightSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5740 middleSeqLength, matrix, &map_location, _tmpHashValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5741
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5742 if(err != -1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5743 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5744 generateSNPSAM(matrix, strlen(matrix), editString);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5745 generateCigar(matrix, strlen(matrix), cigar);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5746 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5747
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5748 if(err != -1 && !bestMode)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5749 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5750
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5751 mappingCnt++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5752
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5753 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5754 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5755 for(k = 0; k < readSegment+1; k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5756 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5757 for(j = -errThreshold ; j <= errThreshold; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5758 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5759 if(genLoc-(k*(_msf_samplingLocs[1]-_msf_samplingLocs[0]))+j >= _msf_refGenBeg &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5760 genLoc-(k*(_msf_samplingLocs[1]-_msf_samplingLocs[0]))+j <= _msf_refGenEnd)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5761 _msf_verifiedLocs[genLoc-(k*(_msf_samplingLocs[1]-_msf_samplingLocs[0]))+j] = readId;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5762 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5763 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5764 _msf_seqList[readNumber].hits[0]++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5765
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5766 _msf_output.QNAME = _msf_seqList[readNumber].name;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5767 _msf_output.FLAG = 16 * direction;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5768 _msf_output.RNAME = _msf_refGenName;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5769 _msf_output.POS = map_location + _msf_refGenOffset;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5770 _msf_output.MAPQ = 255;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5771 _msf_output.CIGAR = cigar;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5772 _msf_output.MRNAME = "*";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5773 _msf_output.MPOS = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5774 _msf_output.ISIZE = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5775 _msf_output.SEQ = _tmpSeq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5776 _msf_output.QUAL = _tmpQual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5777
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5778 _msf_output.optSize = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5779 _msf_output.optFields = _msf_optionalFields;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5780
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5781 _msf_optionalFields[0].tag = "NM";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5782 _msf_optionalFields[0].type = 'i';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5783 _msf_optionalFields[0].iVal = err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5784
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5785 _msf_optionalFields[1].tag = "MD";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5786 _msf_optionalFields[1].type = 'Z';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5787 _msf_optionalFields[1].sVal = editString;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5788
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5789 output(_msf_output);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5790
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5791
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5792 if (_msf_seqList[readNumber].hits[0] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5793 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5794 mappedSeqCnt++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5795 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5796
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5797 if ( maxHits == 0 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5798 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5799 _msf_seqList[readNumber].hits[0] = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5800 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5801
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5802
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5803 if ( maxHits!=0 && _msf_seqList[readNumber].hits[0] == maxHits)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5804 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5805 completedSeqCnt++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5806 break;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5807 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5808
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5809 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5810 else if(err != -1 && bestMode)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5811 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5812 mappingCnt++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5813 _msf_seqList[readNumber].hits[0]++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5814
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5815 if (_msf_seqList[readNumber].hits[0] == 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5816 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5817 mappedSeqCnt++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5818 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5819
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5820 if ( maxHits == 0 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5821 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5822 _msf_seqList[readNumber].hits[0] = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5823 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5824
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5825 if(err < bestHitMappingInfo[readNumber].err || bestHitMappingInfo[readNumber].loc == -1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5826 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5827 setFullMappingInfo(readNumber, map_location + _msf_refGenOffset, direction, err, 0, editString, _msf_refGenName, cigar );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5828 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5829 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5830 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5831 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5832 for(j = -errThreshold ; j <= errThreshold; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5833 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5834 if(genLoc+j > _msf_refGenBeg &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5835 genLoc+j < _msf_refGenEnd)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5836 _msf_verifiedLocs[genLoc+j] = -readId;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5837 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5838 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5839 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5840 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5841
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5842
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5843 int mapAllSingleEndSeq()
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5844 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5845 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5846 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5847 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5848
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5849
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5850 unsigned int *locs = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5851
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5852
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5853 int prev_hash = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5854
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5855 for(i = 0; i < _msf_seqListSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5856 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5857 for(j = 0; j < _msf_samplingLocsSize; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5858 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5859 k = _msf_sort_seqList[i].readNumber;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5860 // if(j != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5861 // if(strncmp(_msf_seqList[k].seq+_msf_samplingLocs[j], _msf_seqList[k].seq+_msf_samplingLocs[j-1], segSize) == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5862 // continue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5863 // if(prev_hash == hashVal(_msf_seqList[k].seq+_msf_samplingLocs[j]))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5864 // continue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5865 locs = getCandidates ( hashVal(_msf_seqList[k].seq+_msf_samplingLocs[j]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5866 if ( locs != NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5867 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5868 mapSingleEndSeq(locs+1, locs[0],k ,j, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5869 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5870 prev_hash = hashVal(_msf_seqList[k].seq+_msf_samplingLocs[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5871 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5872 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5873 i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5874
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5875 for(i = 0; i < _msf_seqListSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5876 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5877 for(j = 0; j < _msf_samplingLocsSize; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5878 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5879 k = _msf_sort_seqList[i].readNumber;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5880
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5881 // if(j != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5882 // if(strncmp(_msf_seqList[k].rseq+_msf_samplingLocs[j], _msf_seqList[k].rseq+_msf_samplingLocs[j-1], segSize) == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5883 // continue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5884 // if(prev_hash == hashVal(_msf_seqList[k].seq+_msf_samplingLocs[j]))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5885 // continue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5886 locs = getCandidates ( hashVal(_msf_seqList[k].rseq+_msf_samplingLocs[j]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5887 if ( locs != NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5888 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5889 mapSingleEndSeq(locs+1, locs[0],k ,j, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5890 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5891 prev_hash = hashVal(_msf_seqList[k].seq+_msf_samplingLocs[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5892 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5893 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5894 return 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5895 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5896
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5897
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5898 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5899 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5900 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5901 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5902 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5903 int compareOut (const void *a, const void *b)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5904 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5905 FullMappingInfo *aInfo = (FullMappingInfo *)a;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5906 FullMappingInfo *bInfo = (FullMappingInfo *)b;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5907 return aInfo->loc - bInfo->loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5908 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5909
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5910
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5911
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5912 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5913
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5914 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5915 direction 0: Forward
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5916 1: Reverse
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5917 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5918
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5919 void mapPairEndSeqList(unsigned int *l1, int s1, int readNumber, int readSegment, int direction)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5920 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5921 int z = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5922 int *locs = (int *) l1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5923 char *_tmpSeq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5924
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5925 char rqual[SEQ_LENGTH+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5926
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5927 char matrix[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5928 char editString[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5929 char cigar[MAX_CIGAR_SIZE];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5930
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5931 short *_tmpHashValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5932
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5933 int leftSeqLength = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5934 int middleSeqLength = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5935 int rightSeqLength =0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5936 int a = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5937
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5938 rqual[SEQ_LENGTH]='\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5939
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5940
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5941 int r = readNumber;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5942
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5943 char d = (direction==1)?-1:1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5944
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5945 if (d==-1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5946 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5947 _tmpSeq = _msf_seqList[readNumber].rseq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5948 _tmpHashValue = _msf_seqList[r].rhashValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5949 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5950 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5951 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5952 _tmpSeq = _msf_seqList[readNumber].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5953 _tmpHashValue = _msf_seqList[r].hashValue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5954 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5955
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5956 int readId = 2*readNumber+direction;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5957 for (z=0; z<s1; z++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5958 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5959 int genLoc = locs[z];//-_msf_samplingLocs[o];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5960 int err = -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5961 int map_location = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5962 int o = readSegment;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5963
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5964 leftSeqLength = _msf_samplingLocs[o];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5965 middleSeqLength = WINDOW_SIZE;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5966 a = leftSeqLength + middleSeqLength;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5967 rightSeqLength = SEQ_LENGTH - a;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5968
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5969 if(genLoc - leftSeqLength < _msf_refGenBeg || genLoc + rightSeqLength + middleSeqLength > _msf_refGenEnd ||
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5970 _msf_verifiedLocs[genLoc-_msf_samplingLocs[o]] == readId || _msf_verifiedLocs[genLoc-_msf_samplingLocs[o]] == -readId)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5971 continue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5972
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5973 if(errThreshold == 2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5974 err = verifySingleEndEditDistance2(genLoc, _tmpSeq, leftSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5975 _tmpSeq + a, rightSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5976 middleSeqLength, matrix, &map_location, _tmpHashValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5977 else if(errThreshold == 4)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5978 err = verifySingleEndEditDistance4(genLoc, _tmpSeq, leftSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5979 _tmpSeq + a, rightSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5980 middleSeqLength, matrix, &map_location, _tmpHashValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5981 else if(errThreshold ==3)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5982 err = verifySingleEndEditDistance(genLoc, _tmpSeq, leftSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5983 _tmpSeq + a, rightSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5984 middleSeqLength, matrix, &map_location, _tmpHashValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5985 /*else if(errThreshold == 6)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5986 err = verifySingleEndEditDistance(genLoc, _tmpSeq, leftSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5987 _tmpSeq + a, rightSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5988 middleSeqLength, matrix, &map_location, _tmpHashValue);*/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5989 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5990 err = verifySingleEndEditDistanceExtention(genLoc, _tmpSeq, leftSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5991 _tmpSeq + a, rightSeqLength,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5992 middleSeqLength, matrix, &map_location, _tmpHashValue);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5993
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5994
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5995 if (err != -1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5996 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5997 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5998 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
5999
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6000 for(k = 0; k < readSegment+1; k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6001 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6002 for(j = -errThreshold ; j <= errThreshold; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6003 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6004 if(genLoc-(k*(_msf_samplingLocs[1]-_msf_samplingLocs[0]))+j >= _msf_refGenBeg &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6005 genLoc-(k*(_msf_samplingLocs[1]-_msf_samplingLocs[0]))+j <= _msf_refGenEnd)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6006 _msf_verifiedLocs[genLoc-(k*(_msf_samplingLocs[1]-_msf_samplingLocs[0]))+j] = readId;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6007 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6008 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6009
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6010
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6011 generateSNPSAM(matrix, strlen(matrix), editString);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6012 generateCigar(matrix, strlen(matrix), cigar);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6013
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6014 MappingLocations *parent = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6015 MappingLocations *child = _msf_mappingInfo[r].next;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6016
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6017 genLoc = map_location + _msf_refGenOffset;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6018 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6019 for (i=0; i<(_msf_mappingInfo[r].size/MAP_CHUNKS); i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6020 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6021 parent = child;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6022 child = child->next;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6023 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6024
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6025 if (child==NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6026 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6027 MappingLocations *tmp = getMem(sizeof(MappingLocations));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6028
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6029 tmp->next = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6030 tmp->loc[0]=genLoc * d;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6031 tmp->err[0]=err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6032
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6033 tmp->cigarSize[0] = strlen(cigar);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6034 sprintf(tmp->cigar[0],"%s", cigar);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6035
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6036 tmp->mdSize[0] = strlen(editString);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6037 sprintf(tmp->md[0],"%s", editString);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6038
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6039 if (parent == NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6040 _msf_mappingInfo[r].next = tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6041 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6042 parent->next = tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6043 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6044 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6045 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6046 if(strlen(cigar) > SEQ_LENGTH || strlen(editString) > SEQ_LENGTH)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6047 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6048 printf("ERROR in %d read size(After mapping) exceedes cigar=%d md =%d cigar=%s md =%s\n", r, (int)strlen(cigar), (int)strlen(editString), cigar, editString);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6049 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6050
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6051 child->loc[_msf_mappingInfo[r].size % MAP_CHUNKS] = genLoc * d;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6052 child->err[_msf_mappingInfo[r].size % MAP_CHUNKS] = err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6053
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6054 child->cigarSize[_msf_mappingInfo[r].size % MAP_CHUNKS] = strlen(cigar);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6055 sprintf(child->cigar[_msf_mappingInfo[r].size % MAP_CHUNKS],"%s",cigar);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6056
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6057 child->mdSize[_msf_mappingInfo[r].size % MAP_CHUNKS] = strlen(editString);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6058 sprintf(child->md[_msf_mappingInfo[r].size % MAP_CHUNKS],"%s",editString);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6059 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6060 _msf_mappingInfo[r].size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6061
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6062 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6063 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6064 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6065 _msf_verifiedLocs[genLoc] = -readId;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6066 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6067
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6068 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6069 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6070
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6071 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6072 void mapPairedEndSeq()
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6073 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6074 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6075 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6076 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6077
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6078 unsigned int *locs = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6079 while ( i < _msf_seqListSize )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6080 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6081 for(j = 0; j < _msf_samplingLocsSize; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6082 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6083 k = _msf_sort_seqList[i].readNumber;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6084 locs = getCandidates ( hashVal(_msf_seqList[k].seq+_msf_samplingLocs[j]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6085 if ( locs != NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6086 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6087 mapPairEndSeqList(locs+1, locs[0],k ,j, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6088 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6089 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6090 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6091 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6092 i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6093
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6094 while ( i < _msf_seqListSize )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6095 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6096 for(j = 0; j < _msf_samplingLocsSize; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6097 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6098 k = _msf_sort_seqList[i].readNumber;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6099 locs = getCandidates ( hashVal(_msf_seqList[k].rseq+_msf_samplingLocs[j]));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6100 if ( locs != NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6101 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6102 mapPairEndSeqList(locs+1, locs[0],k ,j, 1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6103 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6104 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6105
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6106 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6107 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6108 char fname1[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6109 char fname2[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6110 MappingLocations *cur;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6111 int tmpOut;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6112 int lmax=0, rmax=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6113
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6114 sprintf(fname1, "%s__%s__%s__%d__1.tmp",mappingOutputPath, _msf_refGenName, mappingOutput, _msf_openFiles);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6115 sprintf(fname2, "%s__%s__%s__%d__2.tmp",mappingOutputPath, _msf_refGenName, mappingOutput, _msf_openFiles);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6116
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6117 FILE* out;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6118 FILE* out1 = fileOpen(fname1, "w");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6119 FILE* out2 = fileOpen(fname2, "w");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6120
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6121 _msf_openFiles++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6122
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6123 for (i=0; i<_msf_seqListSize; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6124 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6125
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6126 if (i%2==0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6127 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6128 out = out1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6129
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6130 if (lmax < _msf_mappingInfo[i].size)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6131 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6132 lmax = _msf_mappingInfo[i].size;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6133 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6134 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6135 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6136 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6137 out = out2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6138 if (rmax < _msf_mappingInfo[i].size)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6139 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6140 rmax = _msf_mappingInfo[i].size;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6141 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6142 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6143
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6144 tmpOut = fwrite(&(_msf_mappingInfo[i].size), sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6145 if (_msf_mappingInfo[i].size > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6146 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6147 cur = _msf_mappingInfo[i].next;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6148 for (j=0; j < _msf_mappingInfo[i].size; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6149 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6150 if ( j>0 && j%MAP_CHUNKS==0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6151 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6152 cur = cur->next;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6153 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6154 if(cur->cigarSize[j % MAP_CHUNKS] > SEQ_LENGTH || cur->mdSize[j % MAP_CHUNKS] > SEQ_LENGTH)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6155 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6156 printf("ERROR in %d read size exceeds cigar=%d md =%d cigar=%s md =%s\n", i, cur->cigarSize[j % MAP_CHUNKS], cur->mdSize[j % MAP_CHUNKS], cur->cigar[j % MAP_CHUNKS], cur->md[j % MAP_CHUNKS]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6157 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6158
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6159 tmpOut = fwrite(&(cur->loc[j % MAP_CHUNKS]), sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6160
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6161 tmpOut = fwrite(&(cur->err[j % MAP_CHUNKS]), sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6162
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6163 tmpOut = fwrite(&(cur->cigarSize[j % MAP_CHUNKS]), sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6164 tmpOut = fwrite((cur->cigar[j % MAP_CHUNKS]), sizeof(char), (cur->cigarSize[j % MAP_CHUNKS]), out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6165
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6166 tmpOut = fwrite(&(cur->mdSize[j % MAP_CHUNKS]), sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6167 tmpOut = fwrite((cur->md[j % MAP_CHUNKS]), sizeof(char), (cur->mdSize[j % MAP_CHUNKS]), out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6168
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6169 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6170 _msf_mappingInfo[i].size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6171 //_msf_mappingInfo[i].next = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6172 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6173 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6174
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6175 _msf_maxLSize += lmax;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6176 _msf_maxRSize += rmax;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6177
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6178 fclose(out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6179 fclose(out2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6180
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6181 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6182
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6183 void outputPairFullMappingInfo(FILE *fp, int readNumber)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6184 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6185
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6186 char *seq1, *seq2, *rseq1, *rseq2, *qual1, *qual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6187 char rqual1[SEQ_LENGTH+1], rqual2[SEQ_LENGTH+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6188
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6189 rqual1[SEQ_LENGTH] = rqual2[SEQ_LENGTH] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6190
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6191 seq1 = _msf_seqList[readNumber*2].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6192 rseq1 = _msf_seqList[readNumber*2].rseq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6193 qual1 = _msf_seqList[readNumber*2].qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6194
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6195 reverse(_msf_seqList[readNumber*2].qual, rqual1, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6196
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6197 seq2 = _msf_seqList[readNumber*2+1].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6198 rseq2 = _msf_seqList[readNumber*2+1].rseq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6199 qual2 = _msf_seqList[readNumber*2+1].qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6200
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6201 reverse(_msf_seqList[readNumber*2+1].qual, rqual2, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6202
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6203
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6204 if(bestHitMappingInfo[readNumber*2].loc == -1 && bestHitMappingInfo[readNumber*2+1].loc == -1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6205 return;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6206 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6207 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6208
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6209 char *seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6210 char *qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6211 char d1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6212 char d2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6213 int isize;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6214 int proper=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6215 // ISIZE CALCULATION
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6216 // The distance between outer edges
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6217 isize = abs(bestHitMappingInfo[readNumber*2].loc - bestHitMappingInfo[readNumber*2+1].loc)+SEQ_LENGTH - 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6218
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6219 if (bestHitMappingInfo[readNumber*2].loc - bestHitMappingInfo[readNumber*2+1].loc > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6220 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6221 isize *= -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6222 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6223 d1 = (bestHitMappingInfo[readNumber*2].dir == -1)?1:0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6224 d2 = (bestHitMappingInfo[readNumber*2+1].dir == -1)?1:0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6225
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6226 if ( d1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6227 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6228 seq = rseq1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6229 qual = rqual1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6230 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6231 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6232 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6233 seq = seq1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6234 qual = qual1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6235 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6236 if ( (bestHitMappingInfo[readNumber*2].loc < bestHitMappingInfo[readNumber*2+1].loc && !d1 && d2) ||
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6237 (bestHitMappingInfo[readNumber*2].loc > bestHitMappingInfo[readNumber*2+1].loc && d1 && !d2) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6238 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6239 proper = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6240 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6241 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6242 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6243 proper = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6244 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6245
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6246 _msf_output.POS = bestHitMappingInfo[readNumber*2].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6247 _msf_output.MPOS = bestHitMappingInfo[readNumber*2+1].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6248 _msf_output.FLAG = 1+proper+16*d1+32*d2+64;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6249 _msf_output.ISIZE = isize;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6250 _msf_output.SEQ = seq,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6251 _msf_output.QUAL = qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6252 _msf_output.QNAME = _msf_seqList[readNumber*2].name;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6253 _msf_output.RNAME = bestHitMappingInfo[readNumber*2].chr;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6254 _msf_output.MAPQ = 255;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6255 _msf_output.CIGAR = bestHitMappingInfo[readNumber*2].cigar;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6256 _msf_output.MRNAME = "=";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6257
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6258 _msf_output.optSize = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6259 _msf_output.optFields = _msf_optionalFields;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6260
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6261 _msf_optionalFields[0].tag = "NM";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6262 _msf_optionalFields[0].type = 'i';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6263 _msf_optionalFields[0].iVal = bestHitMappingInfo[readNumber*2].err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6264
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6265 _msf_optionalFields[1].tag = "MD";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6266 _msf_optionalFields[1].type = 'Z';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6267 _msf_optionalFields[1].sVal = bestHitMappingInfo[readNumber*2].md;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6268
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6269 outputSAM(fp, _msf_output);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6270 output(_msf_output);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6271
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6272 if ( d2 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6273 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6274 seq = rseq2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6275 qual = rqual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6276 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6277 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6278 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6279 seq = seq2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6280 qual = qual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6281 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6282
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6283 _msf_output.POS = bestHitMappingInfo[readNumber*2+1].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6284 _msf_output.MPOS = bestHitMappingInfo[readNumber*2].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6285 _msf_output.FLAG = 1+proper+16*d2+32*d1+128;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6286 _msf_output.ISIZE = -isize;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6287 _msf_output.SEQ = seq,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6288 _msf_output.QUAL = qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6289 _msf_output.QNAME = _msf_seqList[readNumber*2].name;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6290 _msf_output.RNAME = bestHitMappingInfo[readNumber*2].chr;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6291 _msf_output.MAPQ = 255;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6292 _msf_output.CIGAR = bestHitMappingInfo[readNumber*2+1].cigar;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6293 _msf_output.MRNAME = "=";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6294
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6295 _msf_output.optSize = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6296 _msf_output.optFields = _msf_optionalFields;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6297
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6298 _msf_optionalFields[0].tag = "NM";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6299 _msf_optionalFields[0].type = 'i';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6300 _msf_optionalFields[0].iVal = bestHitMappingInfo[readNumber*2+1].err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6301
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6302 _msf_optionalFields[1].tag = "MD";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6303 _msf_optionalFields[1].type = 'Z';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6304 _msf_optionalFields[1].sVal = bestHitMappingInfo[readNumber*2+1].md;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6305
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6306 outputSAM(fp, _msf_output);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6307 output(_msf_output);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6308 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6309 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6310
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6311
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6312 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6313 Find the closet one to the c
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6314 @return 0: if the x1 is closer to c
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6315 1: if the x2 is closer to c
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6316 2: if both distance are equal
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6317 -1: if error
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6318 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6319 int findNearest(int x1, int x2, int c)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6320 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6321
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6322 if (abs(x1 - c) > abs(x2 - c) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6323 return 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6324 else if ( abs(x1 - c) < abs(x2 - c) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6325 return 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6326 else if ( abs(x1 - c) == abs(x2 - c) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6327 return 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6328 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6329 return -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6330 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6331
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6332 void initBestConcordantDiscordant(int readNumber)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6333 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6334 char bestConcordantFileName[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6335 //char bestDiscordantFileName[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6336
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6337 //OPEN THE BEST CONCORDANT FILE
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6338 //BEGIN{Farhad Hormozdiari}
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6339 /* begin {calkan} */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6340 //sprintf(bestConcordantFileName, "%s%s__BEST.CONCORDANT", mappingOutputPath, mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6341 sprintf(bestConcordantFileName, "%s%s_BEST.sam", mappingOutputPath, mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6342
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6343 bestConcordantFILE = fileOpen(bestConcordantFileName, "w");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6344 bestDiscordantFILE = bestConcordantFILE;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6345 /* end {calkan} */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6346 //END{Farhad Hormozdiari}
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6347
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6348
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6349 //OPEN THE BEST DISCORDANT FILE
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6350 //BEGIN{Farhad Hormozdiari}
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6351 /* begin {calkan}
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6352 sprintf(bestDiscordantFileName, "%s%s__BEST.DISCORDANT", mappingOutputPath, mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6353 bestDiscordantFILE = fileOpen(bestDiscordantFileName, "w");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6354 end {calkan} */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6355
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6356 //END{Farhad Hormozdiari}
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6357
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6358 initBestMapping(readNumber);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6359 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6360
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6361 void finalizeBestConcordantDiscordant()
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6362 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6363 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6364
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6365 for(i = 0; i<_msf_seqListSize/2; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6366 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6367 if(_msf_readHasConcordantMapping[i]==1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6368 outputPairFullMappingInfo(bestConcordantFILE, i);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6369 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6370 outputPairFullMappingInfo(bestDiscordantFILE, i);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6371 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6372
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6373 fclose(bestConcordantFILE);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6374 // fclose(bestDiscordantFILE);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6375
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6376 freeMem(bestHitMappingInfo, _msf_seqListSize * sizeof(FullMappingInfo));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6377 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6378
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6379 void setFullMappingInfo(int readNumber, int loc, int dir, int err, int score, char *md, char * refName, char *cigar)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6380 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6381 bestHitMappingInfo[readNumber].loc = loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6382 bestHitMappingInfo[readNumber].dir = dir;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6383 bestHitMappingInfo[readNumber].err = err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6384 bestHitMappingInfo[readNumber].score = score;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6385
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6386 strncpy(bestHitMappingInfo[readNumber].md, md, strlen(md)+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6387 strncpy(bestHitMappingInfo[readNumber].chr, refName, strlen(refName)+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6388 strncpy(bestHitMappingInfo[readNumber].cigar, cigar, strlen(cigar)+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6389 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6390
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6391
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6392 void setPairFullMappingInfo(int readNumber, FullMappingInfo mi1, FullMappingInfo mi2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6393 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6394
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6395 bestHitMappingInfo[readNumber*2].loc = mi1.loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6396 bestHitMappingInfo[readNumber*2].dir = mi1.dir;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6397 bestHitMappingInfo[readNumber*2].err = mi1.err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6398 bestHitMappingInfo[readNumber*2].score = mi1.score;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6399 snprintf(bestHitMappingInfo[readNumber*2].chr, MAX_REF_SIZE, "%s", _msf_refGenName);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6400
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6401
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6402 strncpy(bestHitMappingInfo[readNumber*2].md, mi1.md, strlen(mi1.md)+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6403 strncpy(bestHitMappingInfo[readNumber*2].cigar, mi1.cigar, strlen(mi1.cigar)+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6404
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6405
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6406 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6407 sprintf(bestHitMappingInfo[readNumber*2].md, "%s\0", mi1.md);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6408 sprintf(bestHitMappingInfo[readNumber*2].cigar, "%s\0", mi1.cigar);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6409 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6410
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6411
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6412 bestHitMappingInfo[readNumber*2+1].loc = mi2.loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6413 bestHitMappingInfo[readNumber*2+1].dir = mi2.dir;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6414 bestHitMappingInfo[readNumber*2+1].err = mi2.err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6415 bestHitMappingInfo[readNumber*2+1].score = mi2.score;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6416
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6417 snprintf(bestHitMappingInfo[readNumber*2+1].chr, MAX_REF_SIZE, "%s", _msf_refGenName);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6418
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6419 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6420 sprintf(bestHitMappingInfo[readNumber*2+1].md, "%s\0", mi2.md);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6421 sprintf(bestHitMappingInfo[readNumber*2+1].cigar, "%s\0", mi2.cigar);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6422 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6423
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6424 strncpy(bestHitMappingInfo[readNumber*2+1].md, mi2.md, strlen(mi2.md)+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6425 strncpy(bestHitMappingInfo[readNumber*2+1].cigar, mi2.cigar, strlen(mi2.cigar)+1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6426
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6427 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6428
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6429 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6430 void outputPairedEnd()
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6431 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6432 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6433
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6434 char cigar[MAX_CIGAR_SIZE];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6435
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6436 int tmpOut;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6437
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6438 loadRefGenome(&_msf_refGen, &_msf_refGenName, &tmpOut);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6439
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6440 FILE* in1[_msf_openFiles];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6441 FILE* in2[_msf_openFiles];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6442
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6443 char fname1[_msf_openFiles][FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6444 char fname2[_msf_openFiles][FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6445
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6446 // discordant
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6447 FILE *out=NULL, *out1=NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6448
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6449 char fname3[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6450 char fname4[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6451
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6452 int meanDistanceMapping = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6453
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6454 char *rqual1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6455 char *rqual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6456
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6457 rqual1 = getMem((SEQ_LENGTH+1)*sizeof(char));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6458 rqual2 = getMem((SEQ_LENGTH+1)*sizeof(char));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6459
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6460 if (pairedEndDiscordantMode)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6461 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6462 sprintf(fname3, "%s__%s__disc", mappingOutputPath, mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6463 sprintf(fname4, "%s__%s__oea", mappingOutputPath, mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6464 out = fileOpen(fname3, "a");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6465 out1 = fileOpen(fname4, "a");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6466 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6467
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6468 FullMappingInfo *mi1 = getMem(sizeof(FullMappingInfo) * _msf_maxLSize);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6469 FullMappingInfo *mi2 = getMem(sizeof(FullMappingInfo) * _msf_maxRSize);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6470
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6471 _msf_fileCount[_msf_maxFile] = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6472 for (i=0; i<_msf_openFiles; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6473 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6474 sprintf(fname1[i], "%s__%s__%s__%d__1.tmp", mappingOutputPath, _msf_refGenName, mappingOutput, i);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6475 sprintf(_msf_fileName[_msf_maxFile][_msf_fileCount[_msf_maxFile]][0], "%s", fname1[i]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6476
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6477 sprintf(fname2[i], "%s__%s__%s__%d__2.tmp", mappingOutputPath, _msf_refGenName, mappingOutput, i);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6478 sprintf(_msf_fileName[_msf_maxFile][_msf_fileCount[_msf_maxFile]][1], "%s", fname2[i]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6479
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6480 in1[i] = fileOpen(fname1[i], "r");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6481 in2[i] = fileOpen(fname2[i], "r");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6482 _msf_fileCount[_msf_maxFile]++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6483 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6484 _msf_maxFile++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6485
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6486 int size;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6487 int j, k;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6488 int size1, size2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6489
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6490 meanDistanceMapping = (pairedEndDiscordantMode==1)? (minPairEndedDiscordantDistance+maxPairEndedDiscordantDistance)/2 + SEQ_LENGTH
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6491 : (minPairEndedDistance + maxPairEndedDistance) / 2 + SEQ_LENGTH;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6492
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6493 for (i=0; i<_msf_seqListSize/2; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6494 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6495 size1 = size2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6496 for (j=0; j<_msf_openFiles; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6497 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6498 tmpOut = fread(&size, sizeof(int), 1, in1[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6499 if ( size > 0 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6500 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6501 for (k=0; k<size; k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6502 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6503 mi1[size1+k].dir = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6504 tmpOut = fread (&(mi1[size1+k].loc), sizeof(int), 1, in1[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6505 tmpOut = fread (&(mi1[size1+k].err), sizeof(int), 1, in1[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6506
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6507 tmpOut = fread (&(mi1[size1+k].cigarSize), sizeof(int), 1, in1[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6508 tmpOut = fread ((mi1[size1+k].cigar), sizeof(char), mi1[size1+k].cigarSize, in1[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6509 mi1[size1+k].cigar[mi1[size1+k].cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6510
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6511 tmpOut = fread (&(mi1[size1+k].mdSize), sizeof(int), 1, in1[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6512 tmpOut = fread ((mi1[size1+k].md), sizeof(char), (mi1[size1+k].mdSize), in1[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6513 mi1[size1+k].md[mi1[size1+k].mdSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6514
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6515 if (mi1[size1+k].loc<1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6516 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6517 mi1[size1+k].loc *= -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6518 mi1[size1+k].dir = -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6519 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6520 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6521 qsort(mi1+size1, size, sizeof(FullMappingInfo), compareOut);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6522 size1+=size;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6523 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6524 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6525
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6526 for (j=0; j<_msf_openFiles; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6527 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6528 tmpOut = fread(&size, sizeof(int), 1, in2[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6529 if ( size > 0 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6530 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6531 for (k=0; k<size; k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6532 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6533 mi2[size2+k].dir = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6534 tmpOut = fread (&(mi2[size2+k].loc), sizeof(int), 1, in2[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6535 tmpOut = fread (&(mi2[size2+k].err), sizeof(int), 1, in2[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6536
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6537 tmpOut = fread (&(mi2[size2+k].cigarSize), sizeof(int), 1, in2[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6538 tmpOut = fread ((mi2[size2+k].cigar), sizeof(char), mi2[size2+k].cigarSize, in2[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6539 mi2[size2+k].cigar[mi2[size2+k].cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6540
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6541 tmpOut = fread (&(mi2[size2+k].mdSize), sizeof(int), 1, in2[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6542 tmpOut = fread ((mi2[size2+k].md), sizeof(char), mi2[size2+k].mdSize, in2[j]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6543 mi2[size2+k].md[mi2[size2+k].mdSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6544
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6545 if (mi2[size2+k].loc<1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6546 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6547 mi2[size2+k].loc *= -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6548 mi2[size2+k].dir = -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6549 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6550 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6551 qsort(mi2+size2, size, sizeof(FullMappingInfo), compareOut);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6552 size2+=size;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6553 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6554 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6555
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6556 int lm, ll, rl, rm;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6557 int pos = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6558
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6559 if (pairedEndDiscordantMode)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6560 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6561
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6562 for (j=0; j<size1; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6563 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6564 lm = mi1[j].loc - maxPairEndedDiscordantDistance + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6565 ll = mi1[j].loc - minPairEndedDiscordantDistance + 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6566 rl = mi1[j].loc + minPairEndedDiscordantDistance - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6567 rm = mi1[j].loc + maxPairEndedDiscordantDistance - 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6568
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6569 while (pos<size2 && mi2[pos].loc < lm)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6570 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6571 pos++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6572 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6573
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6574 k = pos;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6575 while (k<size2 && mi2[k].loc<=rm)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6576 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6577 if ( mi2[k].loc <= ll || mi2[k].loc >= rl)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6578 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6579 if ( (mi1[j].loc < mi2[k].loc && mi1[j].dir==1 && mi2[k].dir == -1) ||
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6580 (mi1[j].loc > mi2[k].loc && mi1[j].dir==-1 && mi2[k].dir == 1) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6581 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6582 _msf_seqList[i*2].hits[0]=1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6583 _msf_seqList[i*2+1].hits[0]=1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6584
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6585 if(nosamMode != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6586 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6587 size1=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6588 size2=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6589 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6590
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6591 break;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6592 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6593 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6594 k++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6595 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6596 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6597
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6598 _msf_seqHits[i*2] += size1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6599 _msf_seqHits[i*2+1] += size2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6600
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6601
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6602 if (_msf_seqHits[i*2+1] * _msf_seqHits[i*2] > DISCORDANT_CUT_OFF && nosamMode != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6603 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6604 _msf_seqList[i*2].hits[0]=1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6605 _msf_seqList[i*2+1].hits[0]=1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6606 size1=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6607 size2=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6608 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6609
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6610
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6611
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6612
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6613 int tmp = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6614 int rNo = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6615 int loc = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6616 int err = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6617 float sc = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6618 char l = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6619
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6620 //write the OEA data
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6621 if(_msf_seqHits[i*2] == 0 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6622 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6623 for(k = 0;k < size2 && _msf_oeaMapping[i*2+1] < maxOEAOutput ;k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6624 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6625 rNo = i*2+1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6626 loc = mi2[k].loc*mi2[k].dir;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6627 err = mi2[k].err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6628 sc = mi2[k].score;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6629
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6630 l = strlen(_msf_refGenName);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6631
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6632 tmp = fwrite(&rNo, sizeof(int), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6633
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6634 tmp = fwrite(&l, sizeof(char), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6635 tmp = fwrite(_msf_refGenName, sizeof(char), l, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6636
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6637 tmp = fwrite(&loc, sizeof(int), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6638 tmp = fwrite(&err, sizeof(int), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6639 tmp = fwrite(&sc, sizeof(float), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6640
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6641 if(mi2[k].cigarSize > SEQ_LENGTH || mi2[k].cigarSize <= 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6642 printf("ERROR CIGAR size=%d %s\n", mi2[k].cigarSize, _msf_seqList[i*2+1].seq);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6643
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6644 tmp = fwrite (&(mi2[k].cigarSize), sizeof(int), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6645 tmp = fwrite ((mi2[k].cigar), sizeof(char), mi2[k].cigarSize, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6646
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6647 tmp = fwrite (&(mi2[k].mdSize), sizeof(int), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6648 tmp = fwrite ((mi2[k].md), sizeof(char), mi2[k].mdSize, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6649
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6650 _msf_oeaMapping[i*2+1]++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6651 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6652 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6653 if(_msf_seqHits[i*2+1] == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6654 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6655 for(j = 0;j < size1 && _msf_oeaMapping[i*2] < maxOEAOutput;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6656 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6657 rNo = i*2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6658 loc = mi1[j].loc*mi1[j].dir;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6659 err = mi1[j].err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6660 sc = mi1[j].score;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6661
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6662 l = strlen(_msf_refGenName);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6663
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6664 tmp = fwrite(&rNo, sizeof(int), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6665
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6666 tmp = fwrite(&l, sizeof(char), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6667 tmp = fwrite(_msf_refGenName, sizeof(char), l, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6668
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6669 tmp = fwrite(&loc, sizeof(int), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6670 tmp = fwrite(&err, sizeof(int), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6671 tmp = fwrite(&sc, sizeof(float), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6672
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6673 if(mi1[j].cigarSize > SEQ_LENGTH || mi1[j].cigarSize <= 0 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6674 printf("ERROR %d %s\n", mi1[j].cigarSize, _msf_seqList[i*2+1].seq);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6675
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6676 tmp = fwrite (&(mi1[j].cigarSize), sizeof(int), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6677 tmp = fwrite ((mi1[j].cigar), sizeof(char), mi1[j].cigarSize, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6678
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6679 tmp = fwrite (&(mi1[j].mdSize), sizeof(int), 1, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6680 tmp = fwrite ((mi1[j].md), sizeof(char), mi1[j].mdSize, out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6681
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6682 _msf_oeaMapping[i*2]++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6683 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6684 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6685 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6686
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6687 char *seq1, *seq2, *rseq1, *rseq2, *qual1, *qual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6688
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6689
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6690
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6691
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6692 rqual1[SEQ_LENGTH] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6693 rqual2[SEQ_LENGTH] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6694 rqual1[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6695 rqual2[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6696
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6697
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6698
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6699 seq1 = _msf_seqList[i*2].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6700 rseq1 = _msf_seqList[i*2].rseq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6701 qual1 = _msf_seqList[i*2].qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6702
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6703
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6704
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6705 strncpy(rqual1, _msf_seqList[i*2].qual, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6706
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6707 seq2 = _msf_seqList[i*2+1].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6708 rseq2 = _msf_seqList[i*2+1].rseq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6709 qual2 = _msf_seqList[i*2+1].qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6710
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6711
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6712 strncpy(rqual2, _msf_seqList[i*2+1].qual, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6713
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6714 if (pairedEndDiscordantMode)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6715 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6716 for (k=0; k<size1; k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6717 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6718 mi1[k].score = calculateScore(mi1[k].loc, (mi1[k].dir==-1)?rseq1:seq1, (mi1[k].dir==-1)?rqual1:qual1, mi1[k].cigar);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6719 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6720
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6721 for (k=0; k<size2; k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6722 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6723 mi2[k].score = calculateScore(mi2[k].loc, (mi2[k].dir==-1)?rseq2:seq2, (mi2[k].dir==-1)?rqual2:qual2, mi2[k].cigar);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6724 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6725
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6726 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6727
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6728
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6729 if (pairedEndDiscordantMode)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6730 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6731 for (j=0; j<size1; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6732 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6733 for(k = 0; k < size2; k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6734 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6735 if(
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6736 (mi2[k].loc-mi1[j].loc >= minPairEndedDiscordantDistance &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6737 mi2[k].loc-mi1[j].loc <= maxPairEndedDiscordantDistance &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6738 mi1[j].dir > 0 && mi2[k].dir < 0 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6739
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6740 ||
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6741
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6742 (mi1[j].loc-mi2[k].loc >= minPairEndedDiscordantDistance &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6743 mi1[j].loc-mi2[k].loc <= maxPairEndedDiscordantDistance &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6744 mi1[j].dir < 0 && mi2[k].dir > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6745 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6746 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6747 //POSSIBLE CONCORDANT
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6748 if(_msf_readHasConcordantMapping[i] == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6749 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6750 setPairFullMappingInfo(i, mi1[j], mi2[k]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6751 _msf_readHasConcordantMapping[i] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6752 _msf_seqList[i*2].hits[0] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6753 _msf_seqList[i*2+1].hits[0] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6754 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6755 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6756 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6757 if(bestHitMappingInfo[i*2].err + bestHitMappingInfo[i*2+1].err >= mi1[j].err + mi2[k].err)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6758 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6759
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6760 if( bestHitMappingInfo[i*2].err + bestHitMappingInfo[i*2+1].err ==
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6761 mi1[j].err + mi2[k].err &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6762 findNearest(abs(bestHitMappingInfo[i*2+1].loc - bestHitMappingInfo[i*2].loc),
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6763 abs(mi2[k].loc - mi1[j].loc),
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6764 meanDistanceMapping
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6765 ) == 0 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6766 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6767 continue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6768 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6769 setPairFullMappingInfo(i, mi1[j], mi2[k]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6770 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6771 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6772 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6773 //DISCORDANT TO TEMP FILE FOR POST PROCESSIING
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6774 else if(_msf_readHasConcordantMapping[i] == 0 &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6775 _msf_seqHits[i*2] != 0 &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6776 _msf_seqHits[i*2+1] != 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6777 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6778
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6779 int tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6780 int rNo = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6781 int loc = mi1[j].loc*mi1[j].dir;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6782 int err = mi1[j].err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6783 float sc = mi1[j].score;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6784
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6785 char l = strlen(_msf_refGenName);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6786
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6787 if(_msf_discordantMapping[i*2] < maxDiscordantOutput)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6788 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6789
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6790 tmp = fwrite(&rNo, sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6791
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6792 tmp = fwrite(&l, sizeof(char), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6793 tmp = fwrite(_msf_refGenName, sizeof(char), l, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6794
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6795 tmp = fwrite(&loc, sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6796 tmp = fwrite(&err, sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6797 tmp = fwrite(&sc, sizeof(float), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6798
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6799 tmp = fwrite (&(mi1[j].cigarSize), sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6800 tmp = fwrite ((mi1[j].cigar), sizeof(char), mi1[j].cigarSize, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6801
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6802 tmp = fwrite (&(mi1[j].mdSize), sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6803 tmp = fwrite ((mi1[j].md), sizeof(char), mi1[j].mdSize, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6804
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6805
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6806 loc = mi2[k].loc*mi2[k].dir;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6807 err = mi2[k].err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6808 sc = mi2[k].score;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6809
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6810 tmp = fwrite(&loc, sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6811 tmp = fwrite(&err, sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6812 tmp = fwrite(&sc, sizeof(float), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6813
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6814 tmp = fwrite (&(mi2[k].cigarSize), sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6815 tmp = fwrite ((mi2[k].cigar), sizeof(char), mi2[k].cigarSize, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6816
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6817 tmp = fwrite (&(mi2[k].mdSize), sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6818 tmp = fwrite ((mi2[k].md), sizeof(char), mi2[k].mdSize, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6819
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6820
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6821 _msf_discordantMapping[i*2]++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6822 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6823 //SET THE BEST DISCORDANT
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6824 //BEGIN {Farhad Hormozdiari}
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6825 if( bestHitMappingInfo[i*2].loc == -1 &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6826 bestHitMappingInfo[i*2+1].loc == -1 &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6827 _msf_readHasConcordantMapping[i] == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6828 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6829 setPairFullMappingInfo(i, mi1[j], mi2[k]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6830 _msf_seqList[i*2].hits[0] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6831 _msf_seqList[i*2+1].hits[0] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6832 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6833 else if( bestHitMappingInfo[i*2].err + bestHitMappingInfo[i*2+1].err >= mi1[j].err + mi2[k].err
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6834 && _msf_readHasConcordantMapping[i] == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6835 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6836 if(bestHitMappingInfo[i*2].err + bestHitMappingInfo[i*2+1].err == mi1[j].err + mi2[k].err &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6837 findNearest( abs(bestHitMappingInfo[i*2+1].loc - bestHitMappingInfo[i*2].loc),
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6838 abs(mi1[j].loc - mi2[k].loc),
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6839 meanDistanceMapping
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6840 ) == 0
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6841 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6842 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6843 continue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6844 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6845 setPairFullMappingInfo(i, mi1[j], mi2[k]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6846 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6847 //END {Farhad Hormozdiari}
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6848 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6849 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6850 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6851 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6852 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6853 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6854 for (j=0; j<size1; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6855 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6856 for(k = 0; k < size2; k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6857 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6858 if((mi2[k].loc-mi1[j].loc >= minPairEndedDistance &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6859 mi2[k].loc-mi1[j].loc <= maxPairEndedDistance &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6860 mi1[j].dir > 0 && mi2[k].dir < 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6861 ||
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6862 (mi1[j].loc-mi2[k].loc >= minPairEndedDistance &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6863 mi1[j].loc-mi2[k].loc <= maxPairEndedDistance &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6864 mi1[j].dir < 0 && mi2[k].dir > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6865 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6866 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6867 char *seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6868 char *qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6869 char d1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6870 char d2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6871 int isize;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6872 int proper=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6873 // ISIZE CALCULATION
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6874 // The distance between outer edges
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6875 isize = abs(mi1[j].loc - mi2[k].loc)+SEQ_LENGTH-2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6876 if (mi1[j].loc - mi2[k].loc > 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6877 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6878 isize *= -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6879 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6880
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6881 d1 = (mi1[j].dir == -1)?1:0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6882 d2 = (mi2[k].dir == -1)?1:0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6883
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6884 //SET THE READ HAS CONCORDANT MAPPING
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6885 _msf_readHasConcordantMapping[i] = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6886
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6887 if ( d1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6888 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6889 seq = rseq1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6890 qual = rqual1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6891 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6892 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6893 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6894 seq = seq1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6895 qual = qual1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6896 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6897
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6898 if ((mi1[j].loc < mi2[k].loc && !d1 && d2) ||
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6899 (mi1[j].loc > mi2[k].loc && d1 && !d2) )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6900 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6901 proper = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6902 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6903 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6904 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6905 proper = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6906 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6907
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6908
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6909 _msf_output.POS = mi1[j].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6910 _msf_output.MPOS = mi2[k].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6911 _msf_output.FLAG = 1+proper+16*d1+32*d2+64;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6912 _msf_output.ISIZE = isize;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6913 _msf_output.SEQ = seq,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6914 _msf_output.QUAL = qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6915 _msf_output.QNAME = _msf_seqList[i*2].name;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6916 _msf_output.RNAME = _msf_refGenName;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6917 _msf_output.MAPQ = 255;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6918 _msf_output.CIGAR = cigar;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6919 _msf_output.MRNAME = "=";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6920
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6921 _msf_output.optSize = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6922 _msf_output.optFields = _msf_optionalFields;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6923
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6924 _msf_optionalFields[0].tag = "NM";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6925 _msf_optionalFields[0].type = 'i';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6926 _msf_optionalFields[0].iVal = mi1[j].err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6927
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6928 _msf_optionalFields[1].tag = "MD";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6929 _msf_optionalFields[1].type = 'Z';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6930 _msf_optionalFields[1].sVal = mi1[j].md;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6931
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6932 if(!bestMode)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6933 output(_msf_output);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6934
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6935 if ( d2 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6936 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6937 seq = rseq2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6938 qual = rqual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6939 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6940 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6941 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6942 seq = seq2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6943 qual = qual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6944 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6945
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6946 _msf_output.POS = mi2[k].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6947 _msf_output.MPOS = mi1[j].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6948 _msf_output.FLAG = 1+proper+16*d2+32*d1+128;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6949 _msf_output.ISIZE = -isize;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6950 _msf_output.SEQ = seq,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6951 _msf_output.QUAL = qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6952 _msf_output.QNAME = _msf_seqList[i*2].name;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6953 _msf_output.RNAME = _msf_refGenName;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6954 _msf_output.MAPQ = 255;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6955 _msf_output.CIGAR = cigar;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6956 _msf_output.MRNAME = "=";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6957
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6958 _msf_output.optSize = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6959 _msf_output.optFields = _msf_optionalFields;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6960
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6961 _msf_optionalFields[0].tag = "NM";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6962 _msf_optionalFields[0].type = 'i';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6963 _msf_optionalFields[0].iVal = mi2[k].err;;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6964
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6965 _msf_optionalFields[1].tag = "MD";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6966 _msf_optionalFields[1].type = 'Z';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6967 _msf_optionalFields[1].sVal = mi2[k].md;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6968
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6969 if(!bestMode)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6970 output(_msf_output);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6971 //SET THE BEST CONCORDANT
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6972 //BEGIN {Farhad Hormozdiari}
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6973 if(bestHitMappingInfo[i*2].loc == -1 && bestHitMappingInfo[i*2+1].loc == -1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6974 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6975 setPairFullMappingInfo(i, mi1[j], mi2[k]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6976 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6977 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6978 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6979 if(bestHitMappingInfo[i*2].err + bestHitMappingInfo[i*2+1].err >= mi1[j].err + mi2[k].err)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6980 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6981
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6982 if( bestHitMappingInfo[i*2].err + bestHitMappingInfo[i*2+1].err == mi1[j].err + mi2[k].err &&
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6983 findNearest(abs(bestHitMappingInfo[i*2+1].loc - bestHitMappingInfo[i*2].loc),
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6984 abs(mi2[k].loc - mi1[j].loc),
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6985 meanDistanceMapping
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6986 ) == 0 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6987 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6988 continue;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6989 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6990 setPairFullMappingInfo(i, mi1[j], mi2[k]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6991 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6992 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6993 //END {Farhad Hormozdiari}
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6994 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6995 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6996 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6997
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6998 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
6999 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7000
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7001 freeMem(rqual1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7002 freeMem(rqual2, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7003
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7004 if (pairedEndDiscordantMode)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7005 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7006 fclose(out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7007 fclose(out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7008 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7009
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7010 for (i=0; i<_msf_openFiles; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7011 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7012 fclose(in1[i]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7013 fclose(in2[i]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7014
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7015 unlink(fname1[i]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7016 unlink(fname2[i]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7017 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7018
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7019 freeMem(mi1, sizeof(FullMappingInfo)*_msf_maxLSize);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7020 freeMem(mi2, sizeof(FullMappingInfo)*_msf_maxRSize);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7021
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7022 _msf_openFiles = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7023 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7024
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7025 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7026 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7027 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7028 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7029 float str2int(char *str, int index1, int index2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7030 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7031 char tmp[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7032 strncpy(tmp, &str[index1], index2-index1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7033 tmp[index2-index1] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7034 return atol(tmp);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7035 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7036
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7037 float calculateScore(int index, char *seq, char *qual,char *md)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7038 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7039 int i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7040 int j;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7041 char *ref;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7042 char *ver;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7043
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7044 ref = _msf_refGen + index-1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7045 ver = seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7046 float score = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7047
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7048 char tmp[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7049 int value = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7050 int end = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7051 int index1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7052 int index2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7053
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7054 i=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7055 while(1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7056 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7057
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7058 if(i>=strlen(md))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7059 break;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7060
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7061 index1 = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7062
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7063 while(md[i] >='0' && md[i]<='9')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7064 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7065 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7066 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7067
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7068 index2 = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7069
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7070 value = str2int(md, index1,index2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7071
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7072 if(md[i]=='M')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7073 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7074 for(j=0;j<value;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7075 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7076 tmp[end]='M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7077 end++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7078 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7079 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7080 else if(md[i]=='I')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7081 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7082 for(j=0;j<value;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7083 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7084 tmp[end]='I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7085 end++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7086 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7087
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7088 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7089 else if(md[i] == 'D')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7090 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7091 for(j=0;j<value;j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7092 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7093 tmp[end]='D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7094 end++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7095 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7096 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7097 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7098 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7099
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7100 tmp[end] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7101
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7102 j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7103
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7104 for (i = 0; i < end; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7105 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7106 if(tmp[i] == 'M')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7107 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7108 if (*ref != *ver)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7109 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7110 score *= 0.001 + 1/pow( 10, ((qual[j]-33)/10.0) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7111 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7112
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7113 ref++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7114 ver++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7115 j++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7116 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7117 else if(tmp[i] == 'I')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7118 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7119 ver++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7120 j++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7121 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7122 else if(tmp[i] == 'D')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7123 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7124 ref++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7125 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7126 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7127
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7128 return score;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7129 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7130
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7131 int matoi(char *str, int start, int end)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7132 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7133 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7134 char tmp[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7135
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7136 for(i=0;i < end-start; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7137 tmp[i] = str[start+i];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7138 tmp[i]='\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7139
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7140 return atoi(tmp);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7141 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7142
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7143 void convertCigarToMatrix(char *cigar, int cigar_size, char * matrix)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7144 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7145 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7146 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7147
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7148 int start = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7149 int size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7150
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7151 matrix[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7152
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7153 while(i < cigar_size)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7154 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7155 if(cigar[i] >= '0' && cigar[i] <= '9')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7156 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7157 start = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7158
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7159 while(cigar[i] >= '0' && cigar[i] <= '9' && i < cigar_size)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7160 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7161
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7162 int value = matoi(cigar, start, i);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7163 for(j = 0; j < value; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7164 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7165 if(cigar[i] == 'M')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7166 matrix[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7167 else if(cigar[i] == 'D')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7168 matrix[size] ='D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7169 else if(cigar[i] == 'I')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7170 matrix[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7171 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7172 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7173 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7174 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7175 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7176 matrix[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7177 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7178
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7179
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7180
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7181 void convertMDToMatrix(char *md, int md_size, char * matrix)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7182 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7183 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7184 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7185
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7186 int start = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7187 int size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7188
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7189 matrix[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7190
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7191 while(i < md_size)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7192 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7193 if(md[i] >= '0' && md[i] <= '9')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7194 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7195 start = i;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7196
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7197 while(md[i] >= '0' && md[i] <= '9' && i < md_size)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7198 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7199
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7200 int value = matoi(md, start, i);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7201 for(j = 0; j < value; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7202 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7203 matrix[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7204 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7205 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7206 i--;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7207 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7208 else if(md[i] == '^')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7209 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7210 matrix[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7211 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7212 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7213 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7214 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7215 matrix[size] = md[i];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7216 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7217 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7218 //size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7219 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7220 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7221 matrix[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7222 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7223
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7224
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7225 void convertMDCigarToMatrix(char *cigar, int cigar_size, char *md, int md_size, char *matrix)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7226 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7227 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7228 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7229
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7230 int size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7231
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7232 char tmp1[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7233 char tmp2[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7234 convertMDToMatrix(md,md_size, tmp2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7235
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7236 convertCigarToMatrix(cigar, cigar_size,tmp1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7237
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7238
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7239
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7240 while(i < strlen(tmp1))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7241 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7242 if(tmp1[i]=='M')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7243 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7244 if(j < strlen(tmp2))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7245 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7246 if(tmp2[j]=='M')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7247 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7248 matrix[size]='M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7249 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7250 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7251 if(tmp2[j]!='M')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7252 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7253 matrix[size]=tmp2[j];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7254 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7255 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7256 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7257 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7258 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7259 matrix[size]='M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7260 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7261 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7262 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7263 else if(tmp1[i] == 'D')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7264 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7265 matrix[size]='D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7266 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7267 j++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7268 matrix[size]=tmp2[j];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7269 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7270
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7271 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7272 else if(tmp1[i] == 'I')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7273 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7274 matrix[size]='I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7275 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7276 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7277
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7278 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7279 if(j < strlen(tmp2))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7280 j++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7281 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7282
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7283 if(strlen(tmp1))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7284
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7285 matrix[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7286
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7287 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7288
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7289 void convertInsertion(char * in_matrix, char * seq, char *out_matrix)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7290 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7291 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7292 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7293 int size = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7294
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7295 while( i < strlen(in_matrix))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7296 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7297 if(in_matrix[i] == 'M')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7298 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7299 out_matrix[size] = 'M';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7300 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7301 j++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7302 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7303 else if(in_matrix[i] == 'D')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7304 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7305 out_matrix[size] = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7306 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7307
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7308 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7309 j++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7310
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7311 out_matrix[size] = seq[j];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7312 j++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7313 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7314 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7315 else if(in_matrix[i] == 'I')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7316 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7317 out_matrix[size] = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7318 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7319 out_matrix[size] = seq[j];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7320 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7321 j++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7322 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7323 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7324 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7325 out_matrix[size] = in_matrix[i];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7326 size++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7327 j++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7328 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7329 i++;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7330 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7331 out_matrix[size] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7332 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7333
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7334 /**********************************************/
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7335 void outputPairedEndDiscPP()
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7336 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7337 char tmp_matrix1[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7338 char tmp_matrix2[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7339
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7340 char matrix1[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7341 char matrix2[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7342
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7343 char cigar1[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7344 char editString1[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7345
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7346 char cigar2[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7347 char editString2[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7348
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7349 char seq1[SEQ_LENGTH+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7350 char qual1[SEQ_LENGTH+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7351
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7352 char seq2[SEQ_LENGTH+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7353 char qual2[SEQ_LENGTH+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7354
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7355 char genName[SEQ_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7356 char fname1[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7357 char fname2[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7358 char l;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7359 int l_size;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7360 int loc1, loc2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7361 int err1, err2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7362 char dir1, dir2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7363 float sc1, sc2, lsc=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7364 int flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7365 int rNo,lrNo = -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7366 int tmp;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7367 FILE *in, *out;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7368
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7369 sprintf(fname1, "%s__%s__disc", mappingOutputPath, mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7370 sprintf(fname2, "%s%s_DIVET.vh", mappingOutputPath, mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7371
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7372 in = fileOpen(fname1, "r");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7373 out = fileOpen(fname2, "w");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7374
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7375 if (in != NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7376 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7377 flag = fread(&rNo, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7378 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7379 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7380 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7381 flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7382 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7383
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7384 seq1[SEQ_LENGTH] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7385 qual1[SEQ_LENGTH] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7386
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7387 seq2[SEQ_LENGTH] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7388 qual2[SEQ_LENGTH] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7389
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7390 while (flag)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7391 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7392 tmp = fread(&l, sizeof(char), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7393 tmp = fread(genName, sizeof(char), l, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7394 genName[(int)l]='\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7395 tmp = fread(&loc1, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7396 tmp = fread(&err1, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7397 tmp = fread(&sc1, sizeof(float), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7398
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7399 //tmp = fwrite (&(mi2[k].cigarSize), sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7400
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7401 tmp = fread(&l_size, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7402 tmp = fread(cigar1, sizeof(char), l_size, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7403 cigar1[(int)l_size]='\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7404 //tmp = fwrite ((mi2[k].cigar), sizeof(char), mi2[k].cigarSize, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7405
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7406 //tmp = fwrite (&(mi2[k].mdSize), sizeof(int), 1, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7407 tmp = fread(&l_size, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7408 tmp = fread(editString1, sizeof(char), l_size, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7409 editString1[(int)l_size]='\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7410 //tmp = fwrite ((mi2[k].md), sizeof(char), mi2[k].mdSize, out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7411
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7412 tmp = fread(&loc2, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7413 tmp = fread(&err2, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7414 tmp = fread(&sc2, sizeof(float), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7415
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7416 tmp = fread(&l_size, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7417 tmp = fread(cigar2, sizeof(char), l_size, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7418 cigar2[(int)l_size]='\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7419
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7420 tmp = fread(&l_size, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7421 tmp = fread(editString2, sizeof(char), l_size, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7422 editString2[(int)l_size]='\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7423
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7424 convertMDCigarToMatrix(cigar1, strlen(cigar1), editString1, strlen(editString1), tmp_matrix1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7425 convertMDCigarToMatrix(cigar2, strlen(cigar2), editString2, strlen(editString2), tmp_matrix2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7426
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7427
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7428 if(_msf_readHasConcordantMapping[rNo] == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7429 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7430
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7431 dir1 = dir2 = 'F';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7432
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7433 strncpy(seq1, _msf_seqList[rNo*2].seq, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7434 strncpy(seq2, _msf_seqList[rNo*2+1].seq, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7435
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7436 if (loc1 < 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7437 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7438 dir1 = 'R';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7439 loc1 = -loc1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7440
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7441 strncpy(seq1, _msf_seqList[rNo*2].rseq, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7442 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7443
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7444 if (loc2 < 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7445 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7446 dir2 = 'R';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7447 loc2 = -loc2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7448
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7449 strncpy(seq2, _msf_seqList[rNo*2+1].rseq, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7450 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7451
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7452 convertInsertion(tmp_matrix1, seq1, matrix1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7453 convertInsertion(tmp_matrix2, seq2, matrix2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7454
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7455
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7456 if (rNo != lrNo)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7457 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7458 int j;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7459 for (j=0; j<SEQ_LENGTH; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7460 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7461 lsc += _msf_seqList[rNo*2].qual[j]+_msf_seqList[rNo*2+1].qual[j];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7462 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7463 lsc /= 2*SEQ_LENGTH;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7464 lsc -= 33;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7465 lrNo = rNo;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7466 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7467
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7468 char event = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7469
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7470
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7471 if ( dir1 == dir2 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7472 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7473 event = 'V';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7474 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7475 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7476 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7477 if (loc1 < loc2)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7478 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7479
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7480 if (dir1 == 'R' && dir2 == 'F')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7481 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7482 event = 'E';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7483
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7484 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7485 else if ( loc2 - loc1 >= maxPairEndedDiscordantDistance )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7486 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7487 event = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7488 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7489 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7490 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7491 event = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7492 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7493 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7494 else if (loc2 < loc1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7495 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7496 if (dir2 == 'R' && dir1 == 'F')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7497 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7498 event = 'E';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7499 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7500 else if ( loc1 - loc2 >= maxPairEndedDiscordantDistance )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7501 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7502 event = 'D';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7503 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7504 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7505 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7506 event = 'I';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7507 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7508 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7509 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7510 _msf_seqList[rNo*2].hits[0] = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7511 if(event != 'E')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7512 fprintf(out, "%s\t%s\t%d\t%d\t%c\t%d\t%d\t%c\t%c\t%d\t%0.0f\t%e\n",
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7513 _msf_seqList[rNo*2].name, genName, loc1, (loc1+SEQ_LENGTH-1), dir1,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7514 loc2, (loc2+SEQ_LENGTH-1), dir2, event, (err1+err2), lsc, sc1*sc2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7515
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7516 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7517 flag = fread(&rNo, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7518 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7519
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7520 fclose(in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7521 fclose(out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7522
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7523 unlink(fname1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7524 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7525
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7526 void finalizeOEAReads(char *fileName)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7527 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7528 FILE *fp_out1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7529 FILE * in;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7530
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7531 char genName[SEQ_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7532
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7533 char fname1[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7534 char fname2[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7535
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7536 char l=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7537 int loc1=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7538
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7539 int err1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7540
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7541 char d;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7542
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7543 float sc1=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7544 int flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7545 int rNo=-1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7546 int tmp=0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7547
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7548 int cigarSize = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7549 int mdSize = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7550
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7551 char cigar[SEQ_LENGTH+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7552 char md[SEQ_LENGTH+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7553
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7554 char *seq1, *seq2, *qual1, *qual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7555 char *rqual1, *rqual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7556
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7557 seq1=NULL; seq2=NULL; qual1=NULL; qual2=NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7558
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7559 rqual1 = getMem(200*sizeof(char));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7560 rqual2 = getMem(200*sizeof(char));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7561
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7562 rqual1[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7563 rqual2[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7564
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7565 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7566 char mappingOutput2[2 * SEQ_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7567 int mo_len;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7568 mo_len = strlen(mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7569 strcpy(mappingOutput2, mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7570
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7571 if (mappingOutput[mo_len-1]=='m' && mappingOutput[mo_len-2]=='a' && mappingOutput[mo_len-3]=='s' && mappingOutput[mo_len-4]=='.')
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7572 mappingOutput2[mo_len-4] = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7573 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7574
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7575 sprintf(fname1, "%s%s_OEA.sam", mappingOutputPath, mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7576
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7577 fp_out1 = fileOpen(fname1, "w");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7578
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7579 in = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7580 if (pairedEndDiscordantMode){
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7581 sprintf(fname2, "%s__%s__oea", mappingOutputPath, mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7582
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7583 in = fileOpen(fname2, "r");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7584 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7585
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7586
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7587 if (in != NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7588 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7589 flag = fread(&rNo, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7590 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7591 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7592 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7593 flag = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7594 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7595
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7596 while (flag)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7597 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7598 cigar[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7599 md[0] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7600
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7601 tmp = fread(&l, sizeof(char), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7602 tmp = fread(genName, sizeof(char), l, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7603
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7604 genName[(int)l]='\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7605
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7606
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7607 tmp = fread(&loc1, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7608 tmp = fread(&err1, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7609 tmp = fread(&sc1, sizeof(float), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7610
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7611 tmp = fread (&cigarSize, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7612 tmp = fread (cigar, sizeof(char), cigarSize, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7613
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7614 cigar[cigarSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7615
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7616 tmp = fread (&mdSize, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7617 tmp = fread (md, sizeof(char), mdSize, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7618 md[mdSize] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7619
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7620 d = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7621
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7622 if(loc1 < 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7623 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7624 d = -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7625 loc1 *= -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7626
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7627 seq1 = _msf_seqList[rNo].rseq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7628 reverse(_msf_seqList[rNo].qual, rqual1, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7629 rqual1[SEQ_LENGTH] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7630 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7631 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7632 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7633 seq1 = _msf_seqList[rNo].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7634 qual1 = _msf_seqList[rNo].qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7635 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7636
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7637 if(rNo % 2 == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7638 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7639 seq2 = _msf_seqList[rNo+1].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7640 qual2 = _msf_seqList[rNo+1].qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7641 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7642 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7643 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7644 seq2 = _msf_seqList[rNo-1].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7645 qual2 = _msf_seqList[rNo-1].qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7646 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7647
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7648 if(_msf_seqHits[rNo] != 0 && _msf_seqHits[(rNo%2==0)?rNo+1:rNo-1] == 0)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7649 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7650 _msf_output.POS = loc1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7651 _msf_output.MPOS = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7652 _msf_output.FLAG = (rNo % 2 ==0)? 1+4+32*d+128 : 1+8+16*d+64 ;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7653 _msf_output.ISIZE = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7654 _msf_output.SEQ = seq1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7655 _msf_output.QUAL = qual1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7656 _msf_output.QNAME = _msf_seqList[rNo].name;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7657 _msf_output.RNAME = genName;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7658 _msf_output.MAPQ = 255;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7659 _msf_output.CIGAR = cigar;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7660 _msf_output.MRNAME = "=";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7661
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7662
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7663 _msf_output.optSize = 4;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7664 _msf_output.optFields = _msf_optionalFields;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7665
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7666 _msf_optionalFields[0].tag = "NM";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7667 _msf_optionalFields[0].type = 'i';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7668 _msf_optionalFields[0].iVal = err1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7669
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7670 _msf_optionalFields[1].tag = "MD";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7671 _msf_optionalFields[1].type = 'Z';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7672 _msf_optionalFields[1].sVal = md;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7673
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7674
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7675
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7676 //for the OEA reads
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7677 _msf_optionalFields[2].tag = "NS";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7678 _msf_optionalFields[2].type = 'Z';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7679 _msf_optionalFields[2].sVal = seq2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7680
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7681
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7682 _msf_optionalFields[3].tag = "NQ";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7683 _msf_optionalFields[3].type = 'Z';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7684 _msf_optionalFields[3].sVal = qual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7685
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7686 outputSAM(fp_out1, _msf_output);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7687
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7688 _msf_seqList[rNo].hits[0] = -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7689 _msf_seqList[(rNo%2==0)?rNo+1:rNo-1].hits[0] = -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7690 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7691 flag = fread(&rNo, sizeof(int), 1, in);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7692 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7693
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7694 freeMem(rqual1, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7695 freeMem(rqual2, 0);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7696
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7697 unlink(fname2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7698
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7699 fclose(fp_out1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7700 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7701
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7702
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7703 void outputTransChromosal(char *fileName1, char *fileName2, FILE * fp_out)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7704 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7705 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7706 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7707 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7708
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7709 char *index;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7710
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7711 int size1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7712 int size2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7713
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7714 FILE *fp1 = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7715 FILE *fp2 = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7716
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7717 char geneFileName1[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7718 char geneFileName2[FILE_NAME_LENGTH];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7719
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7720 FullMappingInfoLink *miL = getMem(_msf_seqListSize * sizeof(FullMappingInfoLink));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7721 FullMappingInfoLink *miR = getMem(_msf_seqListSize * sizeof(FullMappingInfoLink));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7722
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7723
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7724 if(fileName1 != NULL && fileName2 != NULL)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7725 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7726
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7727 fp1 = fileOpen(fileName1, "r");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7728 fp2 = fileOpen(fileName2, "r");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7729
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7730 index = strstr(fileName1, "__");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7731 strncpy(geneFileName1, index + 2 * sizeof(char), strstr(index + 2, "__") - index - 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7732 geneFileName1[strstr(index + 2, "__") - index - 2] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7733
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7734 index = strstr(fileName2, "__");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7735 strncpy(geneFileName2, index + 2 * sizeof(char), strstr(index + 2, "__") - index - 2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7736 geneFileName2[strstr(index + 2, "__") - index - 2] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7737
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7738
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7739 for(i = 0; i < _msf_seqListSize / 2; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7740 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7741 fread(&size1, sizeof(int), 1, fp1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7742 fread(&size2, sizeof(int), 1, fp2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7743
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7744 miL[i].mi = getMem(size1 * sizeof(FullMappingInfo) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7745 miR[i].mi = getMem(size2 * sizeof(FullMappingInfo) );
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7746
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7747 miL[i].size = size1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7748 miR[i].size = size2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7749
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7750 for(j = 0; j < size1; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7751 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7752 fread(&(miL[i].mi[j].loc), sizeof(int), 1, fp1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7753
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7754 fread (&(miL[i].mi[j].err), sizeof(int), 1, fp1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7755
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7756 fread (&(miL[i].mi[j].cigarSize), sizeof(int), 1, fp1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7757 fread ((miL[i].mi[j].cigar), sizeof(char), miL[i].mi[j].cigarSize+1, fp1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7758
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7759 fread (&(miL[i].mi[j].mdSize), sizeof(int), 1, fp1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7760 fread ((miL[i].mi[j].md), sizeof(char), miL[i].mi[j].mdSize+1, fp1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7761
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7762 miL[i].mi[j].dir = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7763 if(miL[i].mi[j].loc < 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7764 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7765 miL[i].mi[j].loc *= -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7766 miL[i].mi[j].dir = -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7767 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7768 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7769 for(k = 0; k < size2; k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7770 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7771 fread(&(miR[i].mi[k].loc), sizeof(int), 1, fp2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7772
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7773 fread (&(miR[i].mi[k].err), sizeof(int), 1, fp2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7774
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7775 fread (&(miR[i].mi[k].cigarSize), sizeof(int), 1, fp2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7776 fread ((miR[i].mi[k].cigar), sizeof(char), miR[i].mi[k].cigarSize+1, fp2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7777
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7778 fread (&(miR[i].mi[k].mdSize), sizeof(int), 1, fp2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7779 fread ((miR[i].mi[k].md), sizeof(char), miR[i].mi[k].mdSize+1, fp2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7780
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7781 miR[i].mi[k].dir = 1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7782 if(miR[i].mi[k].loc < 1)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7783 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7784 miR[i].mi[k].loc *= -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7785 miR[i].mi[k].dir = -1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7786 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7787 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7788 if(_msf_readHasConcordantMapping[i] == 0 && size1 != 0 && size2 != 0 && (size1 * size2 < MAX_TRANS_CHROMOSAL_OUTPUT))
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7789 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7790 int d1 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7791 int d2 = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7792 char *seq, *qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7793 char *seq1, *seq2, *rseq1, *rseq2, *qual1, *qual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7794 char rqual1[SEQ_LENGTH+1], rqual2[SEQ_LENGTH+1];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7795 rqual1[SEQ_LENGTH] = rqual2[SEQ_LENGTH] = '\0';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7796 seq1 = _msf_seqList[i*2].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7797 rseq1 = _msf_seqList[i*2].rseq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7798 qual1 = _msf_seqList[i*2].qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7799 reverse(_msf_seqList[i*2].qual, rqual1, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7800
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7801 seq2 = _msf_seqList[i*2+1].seq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7802 rseq2 = _msf_seqList[i*2+1].rseq;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7803 qual2 = _msf_seqList[i*2+1].qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7804 reverse(_msf_seqList[i*2+1].qual, rqual2, SEQ_LENGTH);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7805
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7806 for(j = 0; j < size1; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7807 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7808 d1 = (miL[i].mi[j].dir == -1)?1:0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7809
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7810 if ( d1 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7811 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7812 seq = rseq1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7813 qual = rqual1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7814 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7815 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7816 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7817 seq = seq1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7818 qual = qual1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7819 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7820
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7821 for(k = 0; k < size2; k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7822 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7823
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7824 d2 = (miR[i].mi[k].dir == -1)?1:0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7825
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7826 _msf_output.POS = miL[i].mi[j].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7827 _msf_output.MPOS = miR[i].mi[k].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7828 _msf_output.FLAG = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7829 _msf_output.ISIZE = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7830 _msf_output.SEQ = seq,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7831 _msf_output.QUAL = qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7832 _msf_output.QNAME = _msf_seqList[i*2].name;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7833 _msf_output.RNAME = geneFileName1;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7834 _msf_output.MAPQ = 255;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7835 _msf_output.CIGAR = miL[i].mi[j].cigar;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7836 _msf_output.MRNAME = "=";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7837
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7838 _msf_output.optSize = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7839 _msf_output.optFields = _msf_optionalFields;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7840
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7841 _msf_optionalFields[0].tag = "NM";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7842 _msf_optionalFields[0].type = 'i';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7843 _msf_optionalFields[0].iVal = miL[i].mi[j].err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7844
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7845 _msf_optionalFields[1].tag = "MD";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7846 _msf_optionalFields[1].type = 'Z';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7847 _msf_optionalFields[1].sVal = miL[i].mi[j].md;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7848
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7849
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7850 if ( d2 )
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7851 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7852 seq = rseq2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7853 qual = rqual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7854 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7855 else
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7856 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7857 seq = seq2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7858 qual = qual2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7859 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7860
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7861 outputSAM(fp_out, _msf_output);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7862
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7863
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7864 _msf_output.POS = miR[i].mi[k].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7865 _msf_output.MPOS = miL[i].mi[j].loc;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7866 _msf_output.FLAG = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7867 _msf_output.ISIZE = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7868 _msf_output.SEQ = seq,
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7869 _msf_output.QUAL = qual;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7870 _msf_output.QNAME = _msf_seqList[i*2+1].name;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7871 _msf_output.RNAME = geneFileName2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7872 _msf_output.MAPQ = 255;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7873 _msf_output.CIGAR = miR[i].mi[k].cigar;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7874 _msf_output.MRNAME = "=";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7875
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7876 _msf_output.optSize = 2;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7877 _msf_output.optFields = _msf_optionalFields;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7878
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7879 _msf_optionalFields[0].tag = "NM";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7880 _msf_optionalFields[0].type = 'i';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7881 _msf_optionalFields[0].iVal = miR[i].mi[k].err;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7882
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7883 _msf_optionalFields[1].tag = "MD";
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7884 _msf_optionalFields[1].type = 'Z';
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7885 _msf_optionalFields[1].sVal = miR[i].mi[k].md;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7886
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7887 outputSAM(fp_out, _msf_output);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7888
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7889 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7890 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7891 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7892 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7893
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7894 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7895
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7896 for(i = 0; i < _msf_seqListSize / 2; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7897 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7898 freeMem(miL[i].mi, miL[i].size * sizeof(FullMappingInfo));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7899 freeMem(miR[i].mi, miR[i].size * sizeof(FullMappingInfo));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7900 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7901
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7902 freeMem(miL, _msf_seqListSize * sizeof(FullMappingInfoLink));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7903 freeMem(miR, _msf_seqListSize * sizeof(FullMappingInfoLink));
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7904
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7905 fclose(fp1);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7906 fclose(fp2);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7907 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7908
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7909 /*
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7910 if flag is 1 it will output all the possible trans chromsal mapping
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7911 otherwise only tmp file will be delete
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7912
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7913 */
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7914
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7915 void outputAllTransChromosal(int flag)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7916 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7917
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7918 int i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7919 int j = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7920 int k = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7921 int l = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7922
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7923 FILE *fp_out = NULL;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7924 char fname1[200];
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7925
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7926 if(flag)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7927 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7928 fp_out = fileOpen(fname1, "w");
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7929
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7930 sprintf(fname1, "%s%s_TRANSCHROMOSOMAL", mappingOutputPath, mappingOutput);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7931
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7932 // for(i = 0; i < _msf_maxFile; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7933 // {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7934 i = 0;
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7935 for(j = i+1; j < _msf_maxFile; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7936 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7937 if(i != j)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7938 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7939 for(k = 0; k < _msf_fileCount[i]; k++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7940 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7941 for(l = 0; l < _msf_fileCount[j]; l++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7942 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7943 outputTransChromosal(_msf_fileName[i][k][0], _msf_fileName[j][l][1], fp_out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7944 }// for l
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7945 }// for k
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7946 }// if
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7947 }// for j
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7948 // } //for i
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7949 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7950
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7951 for(i = 0; i < _msf_maxFile; i++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7952 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7953 for(j = 0; j < _msf_fileCount[i]; j++)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7954 {
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7955 unlink(_msf_fileName[i][j][0]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7956 unlink(_msf_fileName[i][j][1]);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7957 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7958 }
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7959 if(flag)
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7960 fclose(fp_out);
d4054b05b015 Version update to 2.1.0.5
calkan
parents:
diff changeset
7961 }