-
Notifications
You must be signed in to change notification settings - Fork 0
/
sequence.cpp
81 lines (73 loc) · 2.38 KB
/
sequence.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "strand.h"
#include <vector>
#include "sequence.h"
#include <iostream>
std::vector<Strand> sequence(std::vector<Strand> strands, const size_t minimum_overlap_size)
{
while (strands.size() > 1)
{
bool change = true;
int s;
while (change)
{
change = false;
for (s=0;s<strands.size()-1;s++)
{
if (strands[s+1] < strands[s])
{
auto temp = strands[s];
strands[s] = strands[s+1];
strands[s+1] = temp;
change = true;
}
}
}
size_t biggest_overlap = 0;
size_t big_i = 0;
size_t big_j = 0;
size_t current_overlap = 0;
int i,j;
for (i=0;i<strands.size();i++)
{
for (j=0;j<strands.size();j++)
{
if (i != j)
{
current_overlap = strands[i].size() - strands[i].overlap(strands[j]);
if (current_overlap > biggest_overlap)
{
big_i = i;
big_j = j;
biggest_overlap = current_overlap;
}
}
}
}
//MERGE STRANDS
if (biggest_overlap >= minimum_overlap_size)
{
Strand newstrand;
newstrand = strands[big_i].merge(strands[big_i].overlap(strands[big_j]), strands[big_j]);
if (big_i < big_j)
{
strands.erase(strands.begin() + big_j);
strands.erase(strands.begin() + big_i);
}
else
{
strands.erase(strands.begin() + big_i);
strands.erase(strands.begin() + big_j);
}
strands.push_back(newstrand);
}
}
//compare all strands. Look for largest overlap
//if multiple strand combinations have the same largest overlap
//then take the one with the earliest left strand.
//if earliest left strand overlap is same as other strand overlap
//use the one with the earliest right strand.
//If largest overlap is >= minimum_overlap_size, then remove the two strands
//from collection and add in the merged strand of those two strands.
//SORT
return strands;
}