-
Notifications
You must be signed in to change notification settings - Fork 67
/
SimilarityMap.cpp
87 lines (74 loc) · 2.9 KB
/
SimilarityMap.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
82
83
84
85
86
87
#include "stdafx.h"
#include "SimilarityMap.h"
#include "LandauVishkin.h"
SimilarityMap::SimilarityMap(unsigned genomeLength_, unsigned numClusters_, int mergeDistance_)
: genomeLength(genomeLength_), numClusters(numClusters_), mergeDistance(mergeDistance_)
{
clusterInfo = new ClusterInfo[genomeLength];
for (unsigned i = 0; i < genomeLength; i++) {
clusterInfo[i].clusterId = NO_CLUSTER;
clusterInfo[i].cluster = NULL;
}
}
SimilarityMap::~SimilarityMap()
{
for (unsigned i = 0; i < genomeLength; i++) {
if (clusterInfo[i].clusterId == i) {
delete clusterInfo[i].cluster; // Only deletes each cluster once (on its first element)
}
}
delete[] clusterInfo;
}
void SimilarityMap::addCluster(unsigned newClusterId, RegionCluster *cluster)
{
for (unsigned i = 0; i < cluster->members.size(); i++) {
clusterInfo[cluster->members[i].location].clusterId = newClusterId;
clusterInfo[cluster->members[i].location].cluster = cluster;
}
}
SimilarityMap *SimilarityMap::load(const char *filename, const Genome *genome, bool computeMemberInfo)
{
FILE *in = fopen(filename, "r");
if (in == NULL) {
fprintf(stderr, "Failed to open '%s' for reading\n", filename);
return NULL;
}
unsigned genomeLen;
unsigned numClusters;
unsigned stringLen;
int mergeDistance;
if (fscanf(in, "%u %u %u %d", &genomeLen, &numClusters, &stringLen, &mergeDistance) != 4) {
fprintf(stderr, "Could not read similarity map header from '%s'\n", filename);
return NULL;
}
SimilarityMap *simMap = new SimilarityMap(genomeLen, numClusters, mergeDistance);
RegionCluster *clusters = new RegionCluster[numClusters];
for (unsigned clusterNum = 0; clusterNum < numClusters; clusterNum++) {
unsigned numMembers;
if (fscanf(in, "%u", &numMembers) != 1) {
fprintf(stderr, "Could not parse similarity map (EOF before seeing all clusters)\n");
return NULL;
}
unsigned firstMember;
if (fscanf(in, "%u", &firstMember) != 1) {
fprintf(stderr, "Could not parse similarity map (EOF in cluster member list)\n");
return NULL;
}
RegionCluster *cluster = &(clusters[clusterNum]);
cluster->initialize(firstMember, numMembers, stringLen);
cluster->members.push_back(RegionCluster::Member(firstMember));
for (unsigned i = 1; i < numMembers; i++) {
unsigned member;
if (fscanf(in, "%u", &member) != 1) {
fprintf(stderr, "Could not parse similarity map (EOF in cluster member list)\n");
return NULL;
}
cluster->members.push_back(RegionCluster::Member(member));
}
if (computeMemberInfo) {
cluster->computeMemberInfo(genome);
}
simMap->addCluster(firstMember, cluster);
}
return simMap;
}