Mercurial > repos > padge > trimal
comparison trimal_repo/source/compareFiles.cpp @ 0:b15a3147e604 draft
"planemo upload for repository https://github.com/inab/trimal commit cbe1e8577ecb1a46709034a40dff36052e876e7a-dirty"
author | padge |
---|---|
date | Fri, 25 Mar 2022 17:10:43 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:b15a3147e604 |
---|---|
1 /* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** | |
2 ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** | |
3 | |
4 trimAl v1.4: a tool for automated alignment trimming in large-scale | |
5 phylogenetics analyses. | |
6 | |
7 2009-2015 Capella-Gutierrez S. and Gabaldon, T. | |
8 [scapella, tgabaldon]@crg.es | |
9 | |
10 This file is part of trimAl. | |
11 | |
12 trimAl is free software: you can redistribute it and/or modify | |
13 it under the terms of the GNU General Public License as published by | |
14 the Free Software Foundation, the last available version. | |
15 | |
16 trimAl is distributed in the hope that it will be useful, | |
17 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 GNU General Public License for more details. | |
20 | |
21 You should have received a copy of the GNU General Public License | |
22 along with trimAl. If not, see <http://www.gnu.org/licenses/>. | |
23 | |
24 ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** | |
25 ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */ | |
26 | |
27 #include "compareFiles.h" | |
28 #include "alignment.h" | |
29 | |
30 #define LONG 80 | |
31 | |
32 /* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */ | |
33 /* This method compares a set of alignment in order to select the most | |
34 * consistent one respect of the other ones. To compute the consistency | |
35 * values we use the proportion of residue pairs per column in the aligs | |
36 * to compare */ | |
37 /* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */ | |
38 int compareFiles::algorithm(alignment **vectAlignments, char **fileNames, float *columnsValue, int numAlignments, bool verbosity) { | |
39 | |
40 int *numResiduesAlig, *correspNames, *columnSeqMatrix, *columnSeqMatrixAux; | |
41 int i, j, k, l, m, numSeqs, pairRes, hits, alig = 0; | |
42 float max = 0, value = 0, **vectHits; | |
43 bool appearErrors = false; | |
44 string *names; | |
45 | |
46 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
47 /* Get some parameters from the alignment that has | |
48 * been selected */ | |
49 numSeqs = vectAlignments[0] -> getNumSpecies(); | |
50 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
51 | |
52 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
53 /* Allocate dinamic local memory */ | |
54 names = new string[numSeqs]; | |
55 correspNames = new int[numSeqs]; | |
56 numResiduesAlig = new int[numAlignments]; | |
57 columnSeqMatrix = new int[numSeqs]; | |
58 vectHits = new float*[numAlignments]; | |
59 columnSeqMatrixAux = new int[numSeqs]; | |
60 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
61 | |
62 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
63 /* Check that all of alignment has the same number of | |
64 * sequence as well as there exists a correspondence | |
65 * between the names for each pars of aligs. */ | |
66 for(i = 1; i < numAlignments; i++) { | |
67 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
68 if(numSeqs != vectAlignments[i] -> getNumSpecies()) { | |
69 cerr << endl << "ERROR: The files to compare do not have " | |
70 << "the same number of sequences" << endl << endl; | |
71 appearErrors = true; | |
72 break; | |
73 } | |
74 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
75 | |
76 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
77 vectAlignments[i] -> getSequences(names); | |
78 if(!vectAlignments[0] -> getSeqNameOrder(names, correspNames)) { | |
79 cerr << endl << "ERROR: The files to compare do not" | |
80 << " have the sequence names" << endl << endl; | |
81 appearErrors = true; | |
82 break; | |
83 } | |
84 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
85 } | |
86 | |
87 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
88 /* Changes the order in sequences number matrix | |
89 * according to the order in the selected alignment */ | |
90 for(i = 1; ((i < numAlignments) && (!appearErrors)); i++) { | |
91 vectAlignments[i] -> getSequences(names); | |
92 vectAlignments[0] -> getSeqNameOrder(names, correspNames); | |
93 vectAlignments[i] -> setSeqMatrixOrder(correspNames); | |
94 } | |
95 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
96 | |
97 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
98 /* Get back the residues number for each alignment */ | |
99 for(i = 0; ((i < numAlignments) && (!appearErrors)); i++) | |
100 numResiduesAlig[i] = vectAlignments[i] -> getNumAminos(); | |
101 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
102 | |
103 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
104 /* Start the comparison among the alignments */ | |
105 for(i = 0; ((i < numAlignments) && (!appearErrors)); i++, value = 0) { | |
106 | |
107 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
108 /* If it's necessary, we print some information */ | |
109 if(verbosity) | |
110 cout << endl; | |
111 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
112 | |
113 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
114 /* Initialize the hits vector for each alignment */ | |
115 vectHits[i] = new float[numResiduesAlig[i]]; | |
116 utils::initlVect(vectHits[i], numResiduesAlig[i], 0); | |
117 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
118 | |
119 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
120 for(j = 0, pairRes = 0, hits = 0; j < numResiduesAlig[i]; j++, pairRes = 0, hits = 0) { | |
121 | |
122 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
123 /* Get back each column from the current selected | |
124 * alignment */ | |
125 vectAlignments[i] -> getColumnSeqMatrix(j, columnSeqMatrix); | |
126 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
127 | |
128 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
129 /* For each position from the previous recovered | |
130 * columns, we carry out the analysis to detect the | |
131 * same residues pair in the rest of the alignmetns */ | |
132 for(k = 0; k < numSeqs; k++) { | |
133 | |
134 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
135 /* If there is a valid residue, we go ahead with | |
136 * the analysis */ | |
137 if(columnSeqMatrix[k] != 0) { | |
138 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
139 for(l = 0; l < i; l++) { | |
140 /* Recover the residue pairs from the others aligs */ | |
141 vectAlignments[l] -> getColumnSeqMatrix(columnSeqMatrix[k], k, columnSeqMatrixAux); | |
142 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
143 /* and count the similar residue pairs */ | |
144 for(m = k + 1; m < numSeqs; m++) | |
145 if(columnSeqMatrix[m] != 0) { | |
146 if(columnSeqMatrix[m] == columnSeqMatrixAux[m]) | |
147 hits++; | |
148 pairRes++; | |
149 } | |
150 } | |
151 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
152 | |
153 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
154 for(l = i + 1; l < numAlignments; l++) { | |
155 /* Recover the residue pairs from the others aligs */ | |
156 vectAlignments[l] -> getColumnSeqMatrix(columnSeqMatrix[k], k, columnSeqMatrixAux); | |
157 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
158 /* and count the similar residue pairs */ | |
159 for(m = k + 1; m < numSeqs; m++) | |
160 if(columnSeqMatrix[m] != 0) { | |
161 if(columnSeqMatrix[m] == columnSeqMatrixAux[m]) | |
162 hits++; | |
163 pairRes++; | |
164 } | |
165 } | |
166 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
167 } | |
168 } | |
169 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
170 | |
171 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
172 /* For each column, compute the hits proportion for | |
173 * every residue pair against the rest of alignments */ | |
174 if(pairRes != 0) { | |
175 vectHits[i][j] += ((1.0 * hits)/pairRes); | |
176 value += vectHits[i][j]; | |
177 } | |
178 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
179 } | |
180 | |
181 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
182 /* The method can offer some information about the | |
183 * comparison progression */ | |
184 if(verbosity) | |
185 cout << "File:\t\t" << fileNames[i] << endl << "Values:\t\tSequences: " << numSeqs | |
186 << "\tResidues: " << numResiduesAlig[i] << "\tPond. Hits: " << setw(8) | |
187 << value << "\t%Consistency: " << value/numResiduesAlig[i] << endl; | |
188 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
189 | |
190 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
191 /* Keep the alignment with higher consistency value */ | |
192 if((value/numResiduesAlig[i]) > max) { | |
193 alig = i; | |
194 max = value/numResiduesAlig[i]; | |
195 } | |
196 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
197 } | |
198 | |
199 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
200 /* Prints the alignment that have been selected */ | |
201 if((verbosity) && (!appearErrors)) { | |
202 cout << "\t\t\t\t\t--------------" << endl; | |
203 cout << endl << "File Selected:\t" << fileNames[alig] << endl << "Value:\t\t" << max << endl << endl; | |
204 } | |
205 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
206 | |
207 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
208 /* The method returns a vector with the consistency | |
209 * value for each column in the selected alignment */ | |
210 if((columnsValue != NULL) && (!appearErrors)) { | |
211 utils::initlVect(columnsValue, numResiduesAlig[alig], -1); | |
212 for(i = 0; i < numResiduesAlig[alig]; i++) | |
213 columnsValue[i] = vectHits[alig][i]; | |
214 } | |
215 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
216 | |
217 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
218 /* Deallocate memmory */ | |
219 for(i = 0; ((i < numAlignments) && (!appearErrors)); i++) | |
220 delete [] vectHits[i]; | |
221 delete [] vectHits; | |
222 | |
223 delete [] names; | |
224 delete [] correspNames; | |
225 delete [] numResiduesAlig; | |
226 delete [] columnSeqMatrix; | |
227 delete [] columnSeqMatrixAux; | |
228 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
229 | |
230 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
231 /* Return the selected alignment index or an error | |
232 * flag otherwise */ | |
233 if(appearErrors) return -1; | |
234 else return alig; | |
235 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
236 } | |
237 | |
238 /* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */ | |
239 /* This method returns the consistency value vector for a given alignment | |
240 * against a set of alignments with the same sequences */ | |
241 /* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */ | |
242 bool compareFiles::forceComparison(alignment **vectAlignments, int numAlignments, alignment *selected, float *columnsValue) { | |
243 | |
244 int *correspNames, *columnSeqMatrix, *columnSeqMatrixAux; | |
245 int i, j, k, ll, numResidues, numSeqs, pairRes, hit; | |
246 bool appearErrors = false; | |
247 string *names; | |
248 | |
249 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
250 /* Get some parameters from the alignment that has | |
251 * been selected */ | |
252 numResidues = selected -> getNumAminos(); | |
253 numSeqs = selected -> getNumSpecies(); | |
254 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
255 | |
256 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
257 /* Initialize the vector where we are going to store | |
258 * the proportion of hits for each column in the | |
259 * selected alignment */ | |
260 utils::initlVect(columnsValue, numResidues, 0); | |
261 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
262 | |
263 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
264 /* Allocate dinamic local memory */ | |
265 names = new string[numSeqs]; | |
266 correspNames = new int[numSeqs]; | |
267 columnSeqMatrix = new int[numSeqs]; | |
268 columnSeqMatrixAux = new int[numSeqs]; | |
269 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
270 | |
271 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
272 /* Check that all of alignment has the same number of | |
273 * sequence as well as there exists a correspondence | |
274 * between the names for each pars of aligs. */ | |
275 for(i = 0; i < numAlignments; i++) { | |
276 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
277 if(numSeqs != vectAlignments[i] -> getNumSpecies()) { | |
278 cerr << endl << "ERROR: The files to compare do not have " | |
279 << "the same number of sequences" << endl << endl; | |
280 appearErrors = true; | |
281 break; | |
282 } | |
283 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
284 | |
285 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
286 vectAlignments[i] -> getSequences(names); | |
287 if(!selected -> getSeqNameOrder(names, correspNames)) { | |
288 cerr << endl << "ERROR: The files to compare do not" | |
289 << " have the sequence names" << endl << endl; | |
290 appearErrors = true; | |
291 break; | |
292 } | |
293 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
294 } | |
295 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
296 | |
297 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
298 /* Changes the order in sequences number matrix | |
299 * according to the order in the selected alignment */ | |
300 for(i = 0; i < numAlignments; i++) { | |
301 vectAlignments[i] -> getSequences(names); | |
302 selected -> getSeqNameOrder(names, correspNames); | |
303 vectAlignments[i] -> setSeqMatrixOrder(correspNames); | |
304 } | |
305 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
306 | |
307 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
308 /* Do the same analysis for each column */ | |
309 for(i = 0, pairRes = 0, hit = 0; ((i < numResidues) && (!appearErrors)); i++, pairRes = 0, hit = 0) { | |
310 | |
311 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
312 /* We get back the sequence position for each residue | |
313 * from every column in the selected alignment */ | |
314 utils::initlVect(columnSeqMatrix, numSeqs, 0); | |
315 selected -> getColumnSeqMatrix(i, columnSeqMatrix); | |
316 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
317 | |
318 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
319 /* For each residue pairs, we look for it in the rest | |
320 * of alignments */ | |
321 for(j = 0; j < numSeqs; j++) { | |
322 | |
323 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
324 /* If there is a residue, not a gap, we carry out the | |
325 * assesment */ | |
326 if(columnSeqMatrix[j] != 0) { | |
327 for(k = 0; k < numAlignments; k++) { | |
328 | |
329 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
330 /* We look for the same residue in the same row in | |
331 * the rest of alignments */ | |
332 utils::initlVect(columnSeqMatrixAux, numSeqs, 0); | |
333 vectAlignments[k] -> getColumnSeqMatrix(columnSeqMatrix[j], j, columnSeqMatrixAux); | |
334 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
335 | |
336 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
337 /* We count when we get the same residue pairs in the | |
338 * rest of alignments */ | |
339 for(ll = j + 1; ll < numSeqs; ll++) | |
340 if(columnSeqMatrix[ll] != 0) { | |
341 if(columnSeqMatrix[ll] == columnSeqMatrixAux[ll]) | |
342 hit++; | |
343 pairRes++; | |
344 } | |
345 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
346 } | |
347 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
348 } | |
349 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
350 } | |
351 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
352 /* Store the hits proportion for each column */ | |
353 if(pairRes != 0) columnsValue[i] += ((1.0 * hit)/pairRes); | |
354 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
355 } | |
356 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
357 | |
358 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
359 /* Deallocate dinamic memory */ | |
360 delete [] names; | |
361 delete [] correspNames; | |
362 delete [] columnSeqMatrix; | |
363 delete [] columnSeqMatrixAux; | |
364 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
365 | |
366 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
367 /* If it was fine, return true. Otherwise, return | |
368 * false */ | |
369 if(appearErrors) return false; | |
370 else return true; | |
371 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
372 } | |
373 | |
374 /* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */ | |
375 /* This method applies a specific windows size to a selected alignment */ | |
376 /* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */ | |
377 bool compareFiles::applyWindow(int columns, int halfWindow, float *columnsValue) { | |
378 | |
379 int i, j, window; | |
380 float *vectAux; | |
381 | |
382 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
383 /* If windows size is greater than 1/4 of alignment | |
384 *length, trimAl rejects this windows size */ | |
385 if(halfWindow > columns/4) return false; | |
386 else window = (2 * halfWindow + 1); | |
387 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
388 | |
389 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
390 /* Allocate local memory. Copy the array values to | |
391 * auxiliar memory. */ | |
392 vectAux = new float[columns]; | |
393 utils::copyVect(columnsValue, vectAux, columns); | |
394 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
395 | |
396 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
397 /* For each column from the selected alignment, | |
398 * compute the average for its consistency values */ | |
399 for(i = 0; i < columns; i++) { | |
400 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
401 /* This average is computed from halfWindow positions | |
402 * before to halfWindow positions after */ | |
403 for(j = i - halfWindow, columnsValue[i] = 0; j <= i + halfWindow; j++) { | |
404 if(j < 0) columnsValue[i] += vectAux[-j]; | |
405 else if(j >= columns) | |
406 columnsValue[i] += vectAux[((2 * columns - j) - 2)]; | |
407 else columnsValue[i] += vectAux[j]; | |
408 } | |
409 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
410 | |
411 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
412 /* Finally, the column value is divided by the window | |
413 * size in order to compute the average score. */ | |
414 columnsValue[i] /= window; | |
415 } | |
416 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
417 | |
418 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
419 /* Deallocate dinamic memory */ | |
420 delete [] vectAux; | |
421 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
422 | |
423 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
424 /* If everything is OK, return true */ | |
425 return true; | |
426 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
427 } | |
428 | |
429 /* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */ | |
430 /* Print the consistency value for each column from the selected alignment */ | |
431 /* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */ | |
432 void compareFiles::printStatisticsFileColumns(int numAminos, float *compareVect) { | |
433 | |
434 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
435 /* Prepare the header information */ | |
436 cout << "| Residue\tConsistency |" << endl; | |
437 cout << "| Number \t Value |" << endl; | |
438 cout << "+---------------------------+" << endl; | |
439 cout.precision(10); | |
440 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
441 | |
442 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
443 /* Print the consistency values for each column from | |
444 * the selected alignment */ | |
445 for(int i = 0; i < numAminos; i++) | |
446 cout << " " << setw(5) << i + 1 << "\t" | |
447 << "\t" << compareVect[i] << endl; | |
448 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
449 } | |
450 | |
451 /* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */ | |
452 /* Print the consistency values accumulative distribution for the selected | |
453 * alignment */ | |
454 /* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */ | |
455 void compareFiles::printStatisticsFileAcl(int numAminos, float *compareVect) { | |
456 | |
457 float refer, *vectAux; | |
458 int i, num; | |
459 | |
460 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
461 /* Allocate dinamic memory to copy the input vector | |
462 * and sort it */ | |
463 vectAux = new float[numAminos]; | |
464 utils::copyVect(compareVect, vectAux, numAminos); | |
465 utils::quicksort(vectAux, 0, numAminos-1); | |
466 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
467 | |
468 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
469 /* Set the output precision and print the header */ | |
470 cout << "| Number of\t \t|\t Cumulative \t% " | |
471 << "Cumulative\t| Consistency |" << endl; | |
472 cout << "| Residues \t% Length\t|\tNumberResid.\t " | |
473 << "Length \t| Value |" << endl; | |
474 cout << "+-------------------------------+------------" | |
475 << "---------------------------+-----------------+" | |
476 << endl; | |
477 cout.precision(10); | |
478 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
479 | |
480 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
481 /* Fix the initial values to count how many columns | |
482 * has the same consistency value */ | |
483 refer = vectAux[0]; | |
484 num = 1; | |
485 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
486 | |
487 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
488 /* Print the accumulative distribution */ | |
489 for(i = 1; i < numAminos; i++) { | |
490 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
491 /* When the method detects a new consistency value | |
492 * print the previous value as well as its frequency | |
493 * and starts to count how many columns are for this | |
494 * new value */ | |
495 if(refer != vectAux[i]) { | |
496 cout << " " << num << "\t\t" << setw(10) << ((float) num/numAminos * 100.0) | |
497 << "\t\t" << i << "\t\t" << setw(10) << ((float) i/numAminos * 100.0) | |
498 << "\t" << setw(15) << refer << endl; | |
499 refer = vectAux[i]; | |
500 num = 1; | |
501 } | |
502 else num++; | |
503 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
504 } | |
505 | |
506 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
507 /* Print the last consistency value as well as its | |
508 * frequency */ | |
509 cout << " " << num << "\t\t" << setw(10) << ((float) num/numAminos * 100.0) | |
510 << "\t\t" << i << "\t\t" << setw(10) << ((float) i/numAminos * 100.0) | |
511 << "\t" << setw(15) << refer << endl; | |
512 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
513 | |
514 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
515 /* Deallocate dinamic memory */ | |
516 delete [] vectAux; | |
517 /* ***** ***** ***** ***** ***** ***** ***** ***** */ | |
518 } |