Mercurial > repos > portiahollyoak > fastuniq
comparison source/fastq_pair.c @ 0:816cb55b5a2d draft default tip
planemo upload for repository https://github.com/portiahollyoak/Tools commit c4769fd68ad9583d4b9dbdf212e4ecb5968cef1c-dirty
author | portiahollyoak |
---|---|
date | Thu, 02 Jun 2016 11:34:51 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:816cb55b5a2d |
---|---|
1 /**************************************************************************** | |
2 * The 'FASTQ_PAIR' structure group was used to store paired reads and | |
3 * qualities, including basic operation function as well. | |
4 * | |
5 * This file was written by Haibin Xu, December 2011. | |
6 ****************************************************************************/ | |
7 | |
8 #include "fastq_pair.h" | |
9 | |
10 FASTQ_PAIR *fastq_pair_create() | |
11 { | |
12 /* create a FASTQ pair. If successful, return the point to it, | |
13 * otherwise, return NULL. | |
14 */ | |
15 FASTQ_PAIR *fq_pair; | |
16 | |
17 if((fq_pair=(FASTQ_PAIR *)malloc(sizeof(FASTQ_PAIR)))==NULL) | |
18 return NULL; | |
19 | |
20 fq_pair->seq_left=NULL; | |
21 fq_pair->seq_right=NULL; | |
22 | |
23 return fq_pair; | |
24 } | |
25 | |
26 int fastq_pair_remove(FASTQ_PAIR *fq_pair) | |
27 { | |
28 /* free the FASTQ pair. If successful, return 0, otherwise return 1. | |
29 */ | |
30 if(fq_pair==NULL) | |
31 return 1; | |
32 | |
33 fastq_pair_clear(fq_pair); | |
34 free(fq_pair); | |
35 | |
36 return 0; | |
37 } | |
38 | |
39 int fastq_pair_clear(FASTQ_PAIR *fq_pair) | |
40 { | |
41 /* clear the FASTQ pair. If successful, return 0, otherwise return 1. | |
42 */ | |
43 if(fq_pair==NULL) | |
44 return 1; | |
45 | |
46 if(fq_pair->seq_left!=NULL) | |
47 { | |
48 fastq_remove(fq_pair->seq_left); | |
49 fq_pair->seq_left=NULL; | |
50 } | |
51 if(fq_pair->seq_right!=NULL) | |
52 { | |
53 fastq_remove(fq_pair->seq_right); | |
54 fq_pair->seq_right=NULL; | |
55 } | |
56 return 0; | |
57 } | |
58 | |
59 int fastq_pair_scanf(FASTQ_PAIR *fq_pair, FILE *fp_left_in, FILE *fp_right_in, | |
60 int whether_append_description, int whether_append_quality) | |
61 { | |
62 /* load the left and right reads and qualities for FASTQ pair from file, including description | |
63 * (whether_append_description=1) or not (whether_append_description=0), including quality | |
64 * (whether_append_quality=1) or not (whether_append_quality=0). If successful, return 0, | |
65 * otherwise, clear FASTQ pair and return 1. | |
66 */ | |
67 FASTQ_ALL *fq_left, *fq_right; | |
68 | |
69 if(fq_pair==NULL || fp_left_in==NULL || fp_right_in==NULL) | |
70 return 1; | |
71 | |
72 /* clear the FASTQ_PAIR */ | |
73 fastq_pair_clear(fq_pair); | |
74 | |
75 /* create the FASTQ_ALL structure */ | |
76 if((fq_left=fastq_create())==NULL) | |
77 return 1; | |
78 if((fq_right=fastq_create())==NULL) | |
79 { | |
80 fastq_remove(fq_left); | |
81 return 1; | |
82 } | |
83 | |
84 if(fastq_scanf(fq_left, fp_left_in, whether_append_description, whether_append_quality)!=0 || | |
85 fastq_scanf(fq_right, fp_right_in, whether_append_description, whether_append_quality)!=0) | |
86 { | |
87 fastq_remove(fq_left); | |
88 fastq_remove(fq_right); | |
89 return 1; | |
90 } | |
91 | |
92 fq_pair->seq_left=fq_left; | |
93 fq_pair->seq_right=fq_right; | |
94 | |
95 return 0; | |
96 } | |
97 | |
98 int fastq_pair_printf(FASTQ_PAIR *fq_pair, FILE *fp_out1, FILE *fp_out2, | |
99 char *format, long serial) | |
100 { | |
101 /* write the pair-end reads in FASTA or FASTQ format into two output files(format='fa' or 'fq') | |
102 * or in FASTA format into a single output file(format="fa" and fp_out2==NULL) using the original | |
103 * description (serial=-1) or the new serial. If successful, return 0, otherwise, return 1. | |
104 */ | |
105 if(fq_pair==NULL || fp_out1==NULL) | |
106 return 1; | |
107 | |
108 if((strcmp(format, "fq")==0 && fp_out2!=NULL) || | |
109 (strcmp(format, "fa")==0 && fp_out2!=NULL)) | |
110 { | |
111 fastq_printf(fq_pair->seq_left, fp_out1, format, serial); | |
112 fastq_printf(fq_pair->seq_right, fp_out2, format, serial); | |
113 } | |
114 else if(strcmp(format, "fa")==0 && fp_out2==NULL) | |
115 { | |
116 fastq_printf(fq_pair->seq_left, fp_out1, format, serial); | |
117 fastq_printf(fq_pair->seq_right, fp_out1, format, serial); | |
118 } | |
119 else | |
120 return 1; | |
121 | |
122 return 0; | |
123 } | |
124 | |
125 int fastq_pair_compare_tight(FASTQ_PAIR *fq_pair_a, FASTQ_PAIR *fq_pair_b) | |
126 { | |
127 /* compare the two FASTQ pairs tightly, if identical, return 0, else if a>b, | |
128 * return 1, else if a<b, return -1. | |
129 */ | |
130 char *a_left, *a_right, *b_left, *b_right; | |
131 int i, flag; | |
132 | |
133 /* check whether the sequence read exist */ | |
134 if(fq_pair_a==NULL || fq_pair_b==NULL || | |
135 fq_pair_a->seq_left==NULL || fq_pair_a->seq_left->sequence==NULL || | |
136 fq_pair_a->seq_right==NULL || fq_pair_a->seq_right->sequence==NULL || | |
137 fq_pair_b->seq_left==NULL || fq_pair_b->seq_left->sequence==NULL || | |
138 fq_pair_b->seq_right==NULL || fq_pair_b->seq_right->sequence==NULL) | |
139 return 1; | |
140 | |
141 /* obtain points to sequence */ | |
142 a_left=fq_pair_a->seq_left->sequence; | |
143 a_right=fq_pair_a->seq_right->sequence; | |
144 b_left=fq_pair_b->seq_left->sequence; | |
145 b_right=fq_pair_b->seq_right->sequence; | |
146 | |
147 flag=0; | |
148 for(i=0;;i++) | |
149 { | |
150 if(a_left[i]=='\0' && b_left[i]=='\0') | |
151 break; | |
152 if(a_left[i]==b_left[i]) | |
153 continue; | |
154 if(a_left[i]=='\0') | |
155 { | |
156 flag=-1; | |
157 break; | |
158 } | |
159 if(b_left[i]=='\0') | |
160 { | |
161 flag=1; | |
162 break; | |
163 } | |
164 | |
165 switch((int)(a_left[i]>b_left[i])) | |
166 { | |
167 case 1: | |
168 flag=1; | |
169 break; | |
170 case 0: | |
171 flag=-1; | |
172 break; | |
173 default: | |
174 break; | |
175 } | |
176 break; | |
177 } | |
178 | |
179 if(flag==0) | |
180 { | |
181 for(i=0;;i++) | |
182 { | |
183 if(a_right[i]=='\0' && b_right[i]=='\0') | |
184 break; | |
185 if(a_right[i]==b_right[i]) | |
186 continue; | |
187 if(a_right[i]=='\0') | |
188 { | |
189 flag=-1; | |
190 break; | |
191 } | |
192 if(b_right[i]=='\0') | |
193 { | |
194 flag=1; | |
195 break; | |
196 } | |
197 | |
198 switch((int)(a_right[i]>b_right[i])) | |
199 { | |
200 case 1: | |
201 flag=1; | |
202 break; | |
203 case 0: | |
204 flag=-1; | |
205 break; | |
206 default: | |
207 break; | |
208 } | |
209 break; | |
210 } | |
211 } | |
212 | |
213 return flag; | |
214 } | |
215 | |
216 int fastq_pair_compare_loose(FASTQ_PAIR *fq_pair_a, FASTQ_PAIR *fq_pair_b) | |
217 { | |
218 /* compare the two FASTQ pairs loosely, if identical, return 0, else if a>b, | |
219 * return 1, else if a<b, return -1. | |
220 */ | |
221 char *a_left, *a_right, *b_left, *b_right; | |
222 int i, flag; | |
223 | |
224 /* check whether the sequence read exist */ | |
225 if(fq_pair_a==NULL || fq_pair_b==NULL || | |
226 fq_pair_a->seq_left==NULL || fq_pair_a->seq_left->sequence==NULL || | |
227 fq_pair_a->seq_right==NULL || fq_pair_a->seq_right->sequence==NULL || | |
228 fq_pair_b->seq_left==NULL || fq_pair_b->seq_left->sequence==NULL || | |
229 fq_pair_b->seq_right==NULL || fq_pair_b->seq_right->sequence==NULL) | |
230 return 1; | |
231 | |
232 /* obtain points to sequence */ | |
233 a_left=fq_pair_a->seq_left->sequence; | |
234 a_right=fq_pair_a->seq_right->sequence; | |
235 b_left=fq_pair_b->seq_left->sequence; | |
236 b_right=fq_pair_b->seq_right->sequence; | |
237 | |
238 flag=0; | |
239 for(i=0;;i++) | |
240 { | |
241 if(a_left[i]=='\0' && b_left[i]=='\0') | |
242 break; | |
243 if(a_left[i]==b_left[i]) | |
244 continue; | |
245 if(a_left[i]=='\0' || b_left[i]=='\0') | |
246 break; | |
247 | |
248 switch((int)(a_left[i]>b_left[i])) | |
249 { | |
250 case 1: | |
251 flag=1; | |
252 break; | |
253 case 0: | |
254 flag=-1; | |
255 break; | |
256 default: | |
257 break; | |
258 } | |
259 break; | |
260 } | |
261 | |
262 if(flag==0) | |
263 { | |
264 for(i=0;;i++) | |
265 { | |
266 if(a_right[i]=='\0' && b_right[i]=='\0') | |
267 break; | |
268 if(a_right[i]==b_right[i]) | |
269 continue; | |
270 if(a_right[i]=='\0' || b_right[i]=='\0') | |
271 break; | |
272 | |
273 switch((int)(a_right[i]>b_right[i])) | |
274 { | |
275 case 1: | |
276 flag=1; | |
277 break; | |
278 case 0: | |
279 flag=-1; | |
280 break; | |
281 default: | |
282 break; | |
283 } | |
284 break; | |
285 } | |
286 } | |
287 | |
288 return flag; | |
289 } | |
290 | |
291 long fastq_pair_get_left_length(FASTQ_PAIR *fq_pair) | |
292 { | |
293 /* return the length of left FASTQ sequence in pair, if any error, return -1. | |
294 */ | |
295 if(fq_pair==NULL) | |
296 return -1; | |
297 return fastq_get_length(fq_pair->seq_left); | |
298 } | |
299 | |
300 long fastq_pair_get_right_length(FASTQ_PAIR *fq_pair) | |
301 { | |
302 /* return the length of right FASTQ sequence in pair, if any error, return -1. | |
303 */ | |
304 if(fq_pair==NULL) | |
305 return -1; | |
306 return fastq_get_length(fq_pair->seq_right); | |
307 } | |
308 | |
309 long fastq_pair_get_total_length(FASTQ_PAIR *fq_pair) | |
310 { | |
311 /* return the length of both left and right FASTQ sequence in pair, | |
312 * if any error, return -1. | |
313 */ | |
314 long left_length, right_length; | |
315 | |
316 if(fq_pair==NULL) | |
317 return -1; | |
318 left_length=fastq_pair_get_left_length(fq_pair); | |
319 right_length=fastq_pair_get_right_length(fq_pair); | |
320 | |
321 if(left_length==-1 || right_length==-1) | |
322 return -1; | |
323 | |
324 return left_length+right_length; | |
325 } |