annotate BEDTools-Version-2.14.3/src/closestBed/closestBed.cpp @ 0:dfcd8b6c1bda

Uploaded
author aaronquinlan
date Thu, 03 Nov 2011 10:25:04 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
1 /*****************************************************************************
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
2 closestBed.cpp
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
3
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
4 (c) 2009 - Aaron Quinlan
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
5 Hall Laboratory
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
6 Department of Biochemistry and Molecular Genetics
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
7 University of Virginia
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
8 aaronquinlan@gmail.com
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
9
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
10 Licenced under the GNU General Public License 2.0 license.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
11 ******************************************************************************/
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
12 #include "lineFileUtilities.h"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
13 #include "closestBed.h"
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
14
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
15 const int MAXSLOP = 256000000; // 2*MAXSLOP = 512 megabases.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
16 // We don't want to keep looking if we
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
17 // can't find a nearby feature within 512 Mb.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
18 const int SLOPGROWTH = 2048000;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
19
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
20
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
21 /*
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
22 Constructor
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
23 */
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
24 BedClosest::BedClosest(string &bedAFile, string &bedBFile, bool sameStrand, bool diffStrand,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
25 string &tieMode, bool reportDistance, bool signDistance, string &_strandedDistMode,
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
26 bool ignoreOverlaps)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
27 : _bedAFile(bedAFile)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
28 , _bedBFile(bedBFile)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
29 , _tieMode(tieMode)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
30 , _sameStrand(sameStrand)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
31 , _diffStrand(diffStrand)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
32 , _reportDistance(reportDistance)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
33 , _signDistance(signDistance)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
34 , _strandedDistMode(_strandedDistMode)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
35 , _ignoreOverlaps(ignoreOverlaps)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
36 {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
37 _bedA = new BedFile(_bedAFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
38 _bedB = new BedFile(_bedBFile);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
39 FindClosestBed();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
40 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
41
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
42
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
43 /*
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
44 Destructor
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
45 */
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
46 BedClosest::~BedClosest(void) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
47 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
48
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
49
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
50 void BedClosest::FindWindowOverlaps(BED &a, vector<BED> &hits) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
51
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
52 int slop = 0; // start out just looking for overlaps
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
53 // within the current bin (~128Kb)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
54
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
55 // update the current feature's start and end
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
56
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
57 CHRPOS aFudgeStart = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
58 CHRPOS aFudgeEnd;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
59 int numOverlaps = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
60 vector<BED> closestB;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
61 CHRPOS minDistance = INT_MAX;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
62 int32_t curDistance = INT_MAX;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
63 vector<int32_t> distances;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
64
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
65 // is there at least one feature in B on the same chrom
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
66 // as the current A feature?
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
67 if(_bedB->bedMap.find(a.chrom) != _bedB->bedMap.end()) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
68
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
69 while ((numOverlaps == 0) && (slop <= MAXSLOP)) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
70
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
71 // add some slop (starting at 0 bases) to a in hopes
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
72 // of finding a hit in B
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
73 if ((static_cast<int>(a.start) - slop) > 0)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
74 aFudgeStart = a.start - slop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
75 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
76 aFudgeStart = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
77
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
78 if ((static_cast<int>(a.start) + slop) < (2 * MAXSLOP))
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
79 aFudgeEnd = a.end + slop;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
80 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
81 aFudgeEnd = 2 * MAXSLOP;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
82
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
83 // THE HEAVY LIFTING
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
84 // search for hits with the current slop added
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
85 _bedB->FindOverlapsPerBin(a.chrom, aFudgeStart, aFudgeEnd, a.strand, hits, _sameStrand, _diffStrand);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
86
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
87 vector<BED>::const_iterator h = hits.begin();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
88 vector<BED>::const_iterator hitsEnd = hits.end();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
89 for (; h != hitsEnd; ++h) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
90
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
91 // do the actual features overlap?
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
92 int s = max(a.start, h->start);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
93 int e = min(a.end, h->end);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
94 int overlapBases = (e - s); // the number of overlapping bases b/w a and b
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
95
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
96 // make sure we allow overlapping features.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
97 if ((overlapBases > 0) && (_ignoreOverlaps == true))
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
98 continue;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
99 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
100 numOverlaps++;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
101
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
102 // there is overlap. make sure we allow overlapping features ()
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
103 if (overlapBases > 0) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
104 closestB.push_back(*h);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
105 distances.push_back(0);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
106 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
107 // the hit is to the "left" of A
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
108 else if (h->end <= a.start) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
109 curDistance = a.start - h->end;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
110 if (_signDistance) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
111 if ((_strandedDistMode == "ref")
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
112 || (_strandedDistMode == "a" && a.strand != "-")
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
113 || (_strandedDistMode == "b" && h->strand == "-")) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
114 curDistance = -curDistance;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
115 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
116 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
117
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
118 if (abs(curDistance) < minDistance) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
119 minDistance = abs(curDistance);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
120
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
121 closestB.clear();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
122 closestB.push_back(*h);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
123 distances.clear();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
124 distances.push_back(curDistance);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
125 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
126 else if (abs(curDistance) == minDistance) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
127 minDistance = abs(curDistance);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
128 closestB.push_back(*h);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
129 distances.push_back(curDistance);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
130 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
131 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
132 // the hit is to the "right" of A
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
133 else if (h->start >= a.end) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
134 curDistance = h->start - a.end;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
135 if (_signDistance) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
136 if ((_strandedDistMode == "a" && a.strand == "-")
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
137 || (_strandedDistMode == "b" && h->strand != "-")) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
138 curDistance = -curDistance;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
139 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
140 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
141 if (abs(curDistance) < minDistance) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
142 minDistance = abs(curDistance);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
143 closestB.clear();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
144 closestB.push_back(*h);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
145 distances.clear();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
146 distances.push_back(curDistance);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
147 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
148 else if (abs(curDistance) == minDistance) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
149 minDistance = abs(curDistance);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
150 closestB.push_back(*h);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
151 distances.push_back(curDistance);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
152 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
153 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
154 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
155 // if no overlaps were found, we'll widen the range
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
156 // by SLOPGROWTH in each direction and search again.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
157 slop += SLOPGROWTH;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
158 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
159 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
160 // there is no feature in B on the same chromosome as A
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
161 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
162 _bedA->reportBedTab(a);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
163 if (_reportDistance == true) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
164 _bedB->reportNullBedTab();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
165 cout << -1 << endl;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
166 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
167 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
168 _bedB->reportNullBedNewLine();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
169 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
170
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
171 // report the closest feature(s) in B to the current A feature.
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
172 // obey the user's reporting request (_tieMode)
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
173 if (numOverlaps > 0) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
174 if (closestB.size() == 1 || _tieMode == "first") {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
175 _bedA->reportBedTab(a);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
176 if (_reportDistance == true) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
177 _bedB->reportBedTab(closestB[0]);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
178 cout << distances[0] << endl;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
179 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
180 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
181 _bedB->reportBedNewLine(closestB[0]);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
182 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
183 else {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
184 if (_tieMode == "all") {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
185 size_t i = 0;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
186 for (vector<BED>::iterator b = closestB.begin(); b != closestB.end(); ++b) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
187 _bedA->reportBedTab(a);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
188 if (_reportDistance == true) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
189 _bedB->reportBedTab(*b);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
190 cout << distances[i++] <<endl;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
191 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
192 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
193 _bedB->reportBedNewLine(*b);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
194 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
195 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
196 else if (_tieMode == "last") {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
197 _bedA->reportBedTab(a);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
198 if (_reportDistance == true) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
199 _bedB->reportBedTab(closestB[closestB.size()-1]);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
200 cout << distances[distances.size() - 1]<<endl;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
201 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
202 else
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
203 _bedB->reportBedNewLine(closestB[closestB.size()-1]);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
204 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
205 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
206 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
207 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
208
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
209
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
210 void BedClosest::FindClosestBed() {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
211
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
212 // load the "B" bed file into a map so
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
213 // that we can easily compare "A" to it for overlaps
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
214 _bedB->loadBedFileIntoMap();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
215
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
216 BED a, nullBed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
217 int lineNum = 0; // current input line number
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
218 vector<BED> hits; // vector of potential hits
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
219 hits.reserve(100);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
220 BedLineStatus bedStatus;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
221
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
222 _bedA->Open();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
223 // process each entry in A in search of the closest feature in B
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
224 while ((bedStatus = _bedA->GetNextBed(a, lineNum)) != BED_INVALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
225 if (bedStatus == BED_VALID) {
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
226 FindWindowOverlaps(a, hits);
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
227 hits.clear();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
228 a = nullBed;
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
229 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
230 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
231 _bedA->Close();
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
232 }
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
233 // END ClosestBed
dfcd8b6c1bda Uploaded
aaronquinlan
parents:
diff changeset
234