mas01cr@239
|
1 #include <utility>
|
mas01cr@239
|
2 #include <queue>
|
mas01mc@264
|
3 #include <deque>
|
mas01cr@239
|
4 #include <set>
|
mas01cr@239
|
5 #include <functional>
|
mas01cr@239
|
6
|
mas01cr@239
|
7 typedef struct nnresult {
|
mas01cr@239
|
8 unsigned int trackID;
|
mas01cr@239
|
9 double dist;
|
mas01cr@239
|
10 unsigned int qpos;
|
mas01cr@239
|
11 unsigned int spos;
|
mas01cr@239
|
12 } NNresult;
|
mas01cr@239
|
13
|
mas01cr@239
|
14 typedef struct radresult {
|
mas01cr@239
|
15 unsigned int trackID;
|
mas01cr@239
|
16 unsigned int count;
|
mas01cr@239
|
17 } Radresult;
|
mas01cr@239
|
18
|
mas01cr@239
|
19 bool operator< (const NNresult &a, const NNresult &b) {
|
mas01cr@239
|
20 return a.dist < b.dist;
|
mas01cr@239
|
21 }
|
mas01cr@239
|
22
|
mas01cr@239
|
23 bool operator> (const NNresult &a, const NNresult &b) {
|
mas01cr@239
|
24 return a.dist > b.dist;
|
mas01cr@239
|
25 }
|
mas01cr@239
|
26
|
mas01cr@239
|
27 bool operator< (const Radresult &a, const Radresult &b) {
|
mas01cr@239
|
28 return a.count < b.count;
|
mas01cr@239
|
29 }
|
mas01cr@239
|
30
|
mas01mc@275
|
31 bool operator> (const Radresult &a, const Radresult &b) {
|
mas01mc@275
|
32 return a.count > b.count;
|
mas01mc@275
|
33 }
|
mas01mc@275
|
34
|
mas01cr@239
|
35 class Reporter {
|
mas01cr@239
|
36 public:
|
mas01cr@239
|
37 virtual ~Reporter() {};
|
mas01cr@239
|
38 virtual void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) = 0;
|
mas01cr@239
|
39 // FIXME: this interface is a bit wacky: a relic of previous, more
|
mas01cr@239
|
40 // confused times. Really it might make sense to have separate
|
mas01cr@239
|
41 // reporter classes for WS and for stdout, rather than passing this
|
mas01cr@239
|
42 // adbQueryResponse thing everywhere; the fileTable argument is
|
mas01cr@239
|
43 // there solely for convertion trackIDs into names. -- CSR,
|
mas01cr@239
|
44 // 2007-12-10.
|
mas01cr@239
|
45 virtual void report(char *fileTable, adb__queryResponse *adbQueryResponse) = 0;
|
mas01cr@239
|
46 };
|
mas01cr@239
|
47
|
mas01cr@239
|
48 template <class T> class pointQueryReporter : public Reporter {
|
mas01cr@239
|
49 public:
|
mas01cr@239
|
50 pointQueryReporter(unsigned int pointNN);
|
mas01cr@239
|
51 ~pointQueryReporter();
|
mas01cr@239
|
52 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
|
mas01cr@239
|
53 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
|
mas01cr@239
|
54 private:
|
mas01cr@239
|
55 unsigned int pointNN;
|
mas01cr@239
|
56 std::priority_queue< NNresult, std::vector< NNresult >, T> *queue;
|
mas01cr@239
|
57 };
|
mas01cr@239
|
58
|
mas01cr@239
|
59 template <class T> pointQueryReporter<T>::pointQueryReporter(unsigned int pointNN)
|
mas01cr@239
|
60 : pointNN(pointNN) {
|
mas01cr@239
|
61 queue = new std::priority_queue< NNresult, std::vector< NNresult >, T>;
|
mas01cr@239
|
62 }
|
mas01cr@239
|
63
|
mas01cr@239
|
64 template <class T> pointQueryReporter<T>::~pointQueryReporter() {
|
mas01cr@239
|
65 delete queue;
|
mas01cr@239
|
66 }
|
mas01cr@239
|
67
|
mas01cr@239
|
68 template <class T> void pointQueryReporter<T>::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
|
mas01cr@242
|
69 if (!isnan(dist)) {
|
mas01cr@242
|
70 NNresult r;
|
mas01cr@242
|
71 r.trackID = trackID;
|
mas01cr@242
|
72 r.qpos = qpos;
|
mas01cr@242
|
73 r.spos = spos;
|
mas01cr@242
|
74 r.dist = dist;
|
mas01cr@242
|
75 queue->push(r);
|
mas01cr@242
|
76 if(queue->size() > pointNN) {
|
mas01cr@242
|
77 queue->pop();
|
mas01cr@242
|
78 }
|
mas01cr@239
|
79 }
|
mas01cr@239
|
80 }
|
mas01cr@239
|
81
|
mas01cr@239
|
82 template <class T> void pointQueryReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
|
mas01cr@239
|
83 NNresult r;
|
mas01cr@239
|
84 std::vector<NNresult> v;
|
mas01cr@239
|
85 unsigned int size = queue->size();
|
mas01cr@239
|
86 for(unsigned int k = 0; k < size; k++) {
|
mas01cr@239
|
87 r = queue->top();
|
mas01cr@239
|
88 v.push_back(r);
|
mas01cr@239
|
89 queue->pop();
|
mas01cr@239
|
90 }
|
mas01cr@239
|
91 std::vector<NNresult>::reverse_iterator rit;
|
mas01cr@239
|
92
|
mas01cr@239
|
93 if(adbQueryResponse==0) {
|
mas01cr@239
|
94 for(rit = v.rbegin(); rit < v.rend(); rit++) {
|
mas01cr@239
|
95 r = *rit;
|
mas01cr@256
|
96 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " ";
|
mas01cr@239
|
97 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl;
|
mas01cr@239
|
98 }
|
mas01cr@239
|
99 } else {
|
mas01cr@239
|
100 adbQueryResponse->result.__sizeRlist=size;
|
mas01cr@239
|
101 adbQueryResponse->result.__sizeDist=size;
|
mas01cr@239
|
102 adbQueryResponse->result.__sizeQpos=size;
|
mas01cr@239
|
103 adbQueryResponse->result.__sizeSpos=size;
|
mas01cr@239
|
104 adbQueryResponse->result.Rlist= new char*[size];
|
mas01cr@239
|
105 adbQueryResponse->result.Dist = new double[size];
|
mas01cr@239
|
106 adbQueryResponse->result.Qpos = new unsigned int[size];
|
mas01cr@239
|
107 adbQueryResponse->result.Spos = new unsigned int[size];
|
mas01cr@239
|
108 unsigned int k = 0;
|
mas01cr@239
|
109 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
|
mas01cr@239
|
110 r = *rit;
|
mas01cr@239
|
111 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR];
|
mas01cr@239
|
112 adbQueryResponse->result.Dist[k] = r.dist;
|
mas01cr@239
|
113 adbQueryResponse->result.Qpos[k] = r.qpos;
|
mas01cr@239
|
114 adbQueryResponse->result.Spos[k] = r.spos;
|
mas01cr@256
|
115 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE);
|
mas01cr@239
|
116 }
|
mas01cr@239
|
117 }
|
mas01cr@239
|
118 }
|
mas01cr@239
|
119
|
mas01cr@239
|
120 template <class T> class trackAveragingReporter : public Reporter {
|
mas01cr@239
|
121 public:
|
mas01cr@239
|
122 trackAveragingReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
|
mas01cr@239
|
123 ~trackAveragingReporter();
|
mas01cr@239
|
124 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
|
mas01cr@239
|
125 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
|
mas01mc@249
|
126 protected:
|
mas01cr@239
|
127 unsigned int pointNN;
|
mas01cr@239
|
128 unsigned int trackNN;
|
mas01cr@239
|
129 unsigned int numFiles;
|
mas01cr@239
|
130 std::priority_queue< NNresult, std::vector< NNresult>, T > *queues;
|
mas01cr@239
|
131 };
|
mas01cr@239
|
132
|
mas01cr@239
|
133 template <class T> trackAveragingReporter<T>::trackAveragingReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles)
|
mas01cr@239
|
134 : pointNN(pointNN), trackNN(trackNN), numFiles(numFiles) {
|
mas01cr@239
|
135 queues = new std::priority_queue< NNresult, std::vector< NNresult>, T >[numFiles];
|
mas01cr@239
|
136 }
|
mas01cr@239
|
137
|
mas01cr@239
|
138 template <class T> trackAveragingReporter<T>::~trackAveragingReporter() {
|
mas01cr@239
|
139 delete [] queues;
|
mas01cr@239
|
140 }
|
mas01cr@239
|
141
|
mas01cr@239
|
142 template <class T> void trackAveragingReporter<T>::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
|
mas01cr@242
|
143 if (!isnan(dist)) {
|
mas01cr@242
|
144 NNresult r;
|
mas01cr@242
|
145 r.trackID = trackID;
|
mas01cr@242
|
146 r.qpos = qpos;
|
mas01cr@242
|
147 r.spos = spos;
|
mas01cr@242
|
148 r.dist = dist;
|
mas01cr@242
|
149 queues[trackID].push(r);
|
mas01cr@242
|
150 if(queues[trackID].size() > pointNN) {
|
mas01cr@242
|
151 queues[trackID].pop();
|
mas01cr@242
|
152 }
|
mas01cr@239
|
153 }
|
mas01cr@239
|
154 }
|
mas01cr@239
|
155
|
mas01cr@239
|
156 template <class T> void trackAveragingReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
|
mas01cr@239
|
157 std::priority_queue < NNresult, std::vector< NNresult>, T> result;
|
mas01cr@239
|
158 for (int i = numFiles-1; i >= 0; i--) {
|
mas01cr@239
|
159 unsigned int size = queues[i].size();
|
mas01cr@239
|
160 if (size > 0) {
|
mas01cr@239
|
161 NNresult r;
|
mas01cr@239
|
162 double dist = 0;
|
mas01cr@239
|
163 NNresult oldr = queues[i].top();
|
mas01cr@239
|
164 for (unsigned int j = 0; j < size; j++) {
|
mas01cr@239
|
165 r = queues[i].top();
|
mas01cr@239
|
166 dist += r.dist;
|
mas01cr@239
|
167 queues[i].pop();
|
mas01cr@239
|
168 if (r.dist == oldr.dist) {
|
mas01cr@239
|
169 r.qpos = oldr.qpos;
|
mas01cr@239
|
170 r.spos = oldr.spos;
|
mas01cr@239
|
171 } else {
|
mas01cr@239
|
172 oldr = r;
|
mas01cr@239
|
173 }
|
mas01cr@239
|
174 }
|
mas01cr@239
|
175 dist /= size;
|
mas01cr@239
|
176 r.dist = dist; // trackID, qpos and spos are magically right already.
|
mas01cr@239
|
177 result.push(r);
|
mas01cr@239
|
178 if (result.size() > trackNN) {
|
mas01cr@239
|
179 result.pop();
|
mas01cr@239
|
180 }
|
mas01cr@239
|
181 }
|
mas01cr@239
|
182 }
|
mas01cr@239
|
183
|
mas01cr@239
|
184 NNresult r;
|
mas01cr@239
|
185 std::vector<NNresult> v;
|
mas01cr@239
|
186 unsigned int size = result.size();
|
mas01cr@239
|
187 for(unsigned int k = 0; k < size; k++) {
|
mas01cr@239
|
188 r = result.top();
|
mas01cr@239
|
189 v.push_back(r);
|
mas01cr@239
|
190 result.pop();
|
mas01cr@239
|
191 }
|
mas01cr@239
|
192 std::vector<NNresult>::reverse_iterator rit;
|
mas01cr@239
|
193
|
mas01cr@239
|
194 if(adbQueryResponse==0) {
|
mas01cr@239
|
195 for(rit = v.rbegin(); rit < v.rend(); rit++) {
|
mas01cr@239
|
196 r = *rit;
|
mas01cr@256
|
197 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " ";
|
mas01cr@239
|
198 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl;
|
mas01cr@239
|
199 }
|
mas01cr@239
|
200 } else {
|
mas01cr@239
|
201 adbQueryResponse->result.__sizeRlist=size;
|
mas01cr@239
|
202 adbQueryResponse->result.__sizeDist=size;
|
mas01cr@239
|
203 adbQueryResponse->result.__sizeQpos=size;
|
mas01cr@239
|
204 adbQueryResponse->result.__sizeSpos=size;
|
mas01cr@239
|
205 adbQueryResponse->result.Rlist= new char*[size];
|
mas01cr@239
|
206 adbQueryResponse->result.Dist = new double[size];
|
mas01cr@239
|
207 adbQueryResponse->result.Qpos = new unsigned int[size];
|
mas01cr@239
|
208 adbQueryResponse->result.Spos = new unsigned int[size];
|
mas01cr@239
|
209 unsigned int k = 0;
|
mas01cr@239
|
210 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
|
mas01cr@239
|
211 r = *rit;
|
mas01cr@239
|
212 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR];
|
mas01cr@239
|
213 adbQueryResponse->result.Dist[k] = r.dist;
|
mas01cr@239
|
214 adbQueryResponse->result.Qpos[k] = r.qpos;
|
mas01cr@239
|
215 adbQueryResponse->result.Spos[k] = r.spos;
|
mas01cr@256
|
216 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE);
|
mas01cr@239
|
217 }
|
mas01cr@239
|
218 }
|
mas01cr@239
|
219 }
|
mas01cr@239
|
220
|
mas01mc@250
|
221 // track Sequence Query Radius Reporter
|
mas01mc@250
|
222 // only return tracks and retrieved point counts
|
mas01cr@239
|
223 class trackSequenceQueryRadReporter : public Reporter {
|
mas01cr@239
|
224 public:
|
mas01cr@239
|
225 trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles);
|
mas01cr@239
|
226 ~trackSequenceQueryRadReporter();
|
mas01cr@239
|
227 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
|
mas01cr@239
|
228 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
|
mas01mc@249
|
229 protected:
|
mas01cr@239
|
230 unsigned int trackNN;
|
mas01cr@239
|
231 unsigned int numFiles;
|
mas01cr@239
|
232 std::set<std::pair<unsigned int, unsigned int> > *set;
|
mas01cr@239
|
233 unsigned int *count;
|
mas01cr@239
|
234 };
|
mas01cr@239
|
235
|
mas01cr@239
|
236 trackSequenceQueryRadReporter::trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles):
|
mas01cr@239
|
237 trackNN(trackNN), numFiles(numFiles) {
|
mas01cr@239
|
238 set = new std::set<std::pair<unsigned int, unsigned int> >;
|
mas01cr@239
|
239 count = new unsigned int[numFiles];
|
mas01cr@239
|
240 for (unsigned i = 0; i < numFiles; i++) {
|
mas01cr@239
|
241 count[i] = 0;
|
mas01cr@239
|
242 }
|
mas01cr@239
|
243 }
|
mas01cr@239
|
244
|
mas01cr@239
|
245 trackSequenceQueryRadReporter::~trackSequenceQueryRadReporter() {
|
mas01cr@239
|
246 delete set;
|
mas01cr@239
|
247 delete [] count;
|
mas01cr@239
|
248 }
|
mas01cr@239
|
249
|
mas01cr@239
|
250 void trackSequenceQueryRadReporter::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
|
mas01cr@239
|
251 std::set<std::pair<unsigned int, unsigned int> >::iterator it;
|
mas01mc@250
|
252 std::pair<unsigned int, unsigned int> pair = std::make_pair(trackID, qpos); // only count this once
|
mas01cr@239
|
253 it = set->find(pair);
|
mas01cr@239
|
254 if (it == set->end()) {
|
mas01cr@239
|
255 set->insert(pair);
|
mas01mc@250
|
256 count[trackID]++; // only count if <tackID,qpos> pair is unique
|
mas01cr@239
|
257 }
|
mas01cr@239
|
258 }
|
mas01cr@239
|
259
|
mas01cr@239
|
260 void trackSequenceQueryRadReporter::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
|
mas01mc@275
|
261 std::priority_queue < Radresult, std::vector<Radresult>, std::greater<Radresult> > result;
|
mas01cr@239
|
262 // KLUDGE: doing this backwards in an attempt to get the same
|
mas01cr@239
|
263 // tiebreak behaviour as before.
|
mas01cr@239
|
264 for (int i = numFiles-1; i >= 0; i--) {
|
mas01cr@239
|
265 Radresult r;
|
mas01cr@239
|
266 r.trackID = i;
|
mas01cr@239
|
267 r.count = count[i];
|
mas01cr@239
|
268 if(r.count > 0) {
|
mas01cr@239
|
269 result.push(r);
|
mas01cr@239
|
270 if (result.size() > trackNN) {
|
mas01cr@239
|
271 result.pop();
|
mas01cr@239
|
272 }
|
mas01cr@239
|
273 }
|
mas01cr@239
|
274 }
|
mas01cr@239
|
275
|
mas01cr@239
|
276 Radresult r;
|
mas01cr@239
|
277 std::vector<Radresult> v;
|
mas01cr@239
|
278 unsigned int size = result.size();
|
mas01cr@239
|
279 for(unsigned int k = 0; k < size; k++) {
|
mas01cr@239
|
280 r = result.top();
|
mas01cr@239
|
281 v.push_back(r);
|
mas01cr@239
|
282 result.pop();
|
mas01cr@239
|
283 }
|
mas01cr@239
|
284 std::vector<Radresult>::reverse_iterator rit;
|
mas01cr@239
|
285
|
mas01cr@239
|
286 if(adbQueryResponse==0) {
|
mas01cr@239
|
287 for(rit = v.rbegin(); rit < v.rend(); rit++) {
|
mas01cr@239
|
288 r = *rit;
|
mas01cr@256
|
289 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " " << r.count << std::endl;
|
mas01cr@239
|
290 }
|
mas01cr@239
|
291 } else {
|
mas01cr@239
|
292 // FIXME
|
mas01cr@239
|
293 }
|
mas01cr@239
|
294 }
|
mas01mc@248
|
295
|
mas01mc@249
|
296 // Another type of trackAveragingReporter that reports all pointNN nearest neighbours
|
mas01mc@249
|
297 template <class T> class trackSequenceQueryNNReporter : public trackAveragingReporter<T> {
|
mas01mc@249
|
298 protected:
|
mas01mc@249
|
299 using trackAveragingReporter<T>::numFiles;
|
mas01mc@249
|
300 using trackAveragingReporter<T>::queues;
|
mas01mc@249
|
301 using trackAveragingReporter<T>::trackNN;
|
mas01mc@249
|
302 using trackAveragingReporter<T>::pointNN;
|
mas01mc@248
|
303 public:
|
mas01mc@248
|
304 trackSequenceQueryNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
|
mas01mc@248
|
305 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
|
mas01mc@248
|
306 };
|
mas01mc@248
|
307
|
mas01mc@249
|
308 template <class T> trackSequenceQueryNNReporter<T>::trackSequenceQueryNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles)
|
mas01mc@249
|
309 :trackAveragingReporter<T>(pointNN, trackNN, numFiles){}
|
mas01mc@248
|
310
|
mas01mc@248
|
311 template <class T> void trackSequenceQueryNNReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
|
mas01mc@248
|
312 std::priority_queue < NNresult, std::vector< NNresult>, T> result;
|
mas01mc@250
|
313 std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> > *point_queues = new std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> >[numFiles];
|
mas01mc@249
|
314
|
mas01mc@248
|
315 for (int i = numFiles-1; i >= 0; i--) {
|
mas01mc@248
|
316 unsigned int size = queues[i].size();
|
mas01mc@248
|
317 if (size > 0) {
|
mas01mc@248
|
318 NNresult r;
|
mas01mc@248
|
319 double dist = 0;
|
mas01mc@248
|
320 NNresult oldr = queues[i].top();
|
mas01mc@248
|
321 for (unsigned int j = 0; j < size; j++) {
|
mas01mc@248
|
322 r = queues[i].top();
|
mas01mc@248
|
323 dist += r.dist;
|
mas01mc@248
|
324 point_queues[i].push(r);
|
mas01mc@249
|
325 queues[i].pop();
|
mas01mc@248
|
326 if (r.dist == oldr.dist) {
|
mas01mc@248
|
327 r.qpos = oldr.qpos;
|
mas01mc@248
|
328 r.spos = oldr.spos;
|
mas01mc@248
|
329 } else {
|
mas01mc@248
|
330 oldr = r;
|
mas01mc@248
|
331 }
|
mas01mc@248
|
332 }
|
mas01mc@248
|
333 dist /= size;
|
mas01mc@248
|
334 r.dist = dist; // trackID, qpos and spos are magically right already.
|
mas01mc@248
|
335 result.push(r);
|
mas01mc@248
|
336 if (result.size() > trackNN) {
|
mas01mc@248
|
337 result.pop();
|
mas01mc@248
|
338 }
|
mas01mc@248
|
339 }
|
mas01mc@248
|
340 }
|
mas01mc@248
|
341
|
mas01mc@248
|
342 NNresult r;
|
mas01mc@248
|
343 std::vector<NNresult> v;
|
mas01mc@248
|
344 unsigned int size = result.size();
|
mas01mc@248
|
345 for(unsigned int k = 0; k < size; k++) {
|
mas01mc@248
|
346 r = result.top();
|
mas01mc@248
|
347 v.push_back(r);
|
mas01mc@248
|
348 result.pop();
|
mas01mc@248
|
349 }
|
mas01mc@248
|
350 std::vector<NNresult>::reverse_iterator rit;
|
mas01mc@264
|
351 std::priority_queue< NNresult, std::vector< NNresult>, std::greater<NNresult> > point_queue;
|
mas01mc@264
|
352
|
mas01mc@248
|
353 if(adbQueryResponse==0) {
|
mas01mc@248
|
354 for(rit = v.rbegin(); rit < v.rend(); rit++) {
|
mas01mc@248
|
355 r = *rit;
|
mas01cr@256
|
356 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " " << r.dist << std::endl;
|
mas01mc@264
|
357 unsigned int qsize = point_queues[r.trackID].size();
|
mas01mc@264
|
358 // Reverse the order of the points stored in point_queues
|
mas01mc@264
|
359 for(unsigned int k=0; k < qsize; k++){
|
mas01mc@264
|
360 point_queue.push( point_queues[r.trackID].top() );
|
mas01mc@264
|
361 point_queues[r.trackID].pop();
|
mas01mc@264
|
362 }
|
mas01mc@264
|
363
|
mas01mc@264
|
364 for(unsigned int k = 0; k < qsize; k++) {
|
mas01mc@264
|
365 NNresult rk = point_queue.top();
|
mas01mc@248
|
366 std::cout << rk.dist << " " << rk.qpos << " " << rk.spos << std::endl;
|
mas01mc@264
|
367 point_queue.pop();
|
mas01mc@248
|
368 }
|
mas01mc@248
|
369 }
|
mas01mc@248
|
370 } else {
|
mas01mc@248
|
371 adbQueryResponse->result.__sizeRlist=size;
|
mas01mc@248
|
372 adbQueryResponse->result.__sizeDist=size;
|
mas01mc@248
|
373 adbQueryResponse->result.__sizeQpos=size;
|
mas01mc@248
|
374 adbQueryResponse->result.__sizeSpos=size;
|
mas01mc@248
|
375 adbQueryResponse->result.Rlist= new char*[size];
|
mas01mc@248
|
376 adbQueryResponse->result.Dist = new double[size];
|
mas01mc@248
|
377 adbQueryResponse->result.Qpos = new unsigned int[size];
|
mas01mc@248
|
378 adbQueryResponse->result.Spos = new unsigned int[size];
|
mas01mc@248
|
379 unsigned int k = 0;
|
mas01mc@248
|
380 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
|
mas01mc@248
|
381 r = *rit;
|
mas01mc@248
|
382 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR];
|
mas01mc@248
|
383 adbQueryResponse->result.Dist[k] = r.dist;
|
mas01mc@248
|
384 adbQueryResponse->result.Qpos[k] = r.qpos;
|
mas01mc@248
|
385 adbQueryResponse->result.Spos[k] = r.spos;
|
mas01cr@256
|
386 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE);
|
mas01mc@248
|
387 }
|
mas01mc@248
|
388 }
|
mas01mc@248
|
389 // clean up
|
mas01mc@248
|
390 delete[] point_queues;
|
mas01mc@248
|
391 }
|
mas01mc@250
|
392
|
mas01mc@250
|
393
|
mas01mc@250
|
394 // track Sequence Query Radius NN Reporter
|
mas01mc@250
|
395 // retrieve tracks ordered by query-point matches (one per track per query point)
|
mas01mc@250
|
396 //
|
mas01mc@250
|
397 // as well as sorted n-NN points per retrieved track
|
mas01mc@250
|
398 class trackSequenceQueryRadNNReporter : public Reporter {
|
mas01mc@250
|
399 public:
|
mas01mc@250
|
400 trackSequenceQueryRadNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
|
mas01mc@250
|
401 ~trackSequenceQueryRadNNReporter();
|
mas01mc@250
|
402 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
|
mas01mc@250
|
403 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
|
mas01mc@250
|
404 protected:
|
mas01mc@250
|
405 unsigned int pointNN;
|
mas01mc@250
|
406 unsigned int trackNN;
|
mas01mc@250
|
407 unsigned int numFiles;
|
mas01mc@250
|
408 std::set< NNresult > *set;
|
mas01mc@250
|
409 std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> > *point_queues;
|
mas01mc@250
|
410 unsigned int *count;
|
mas01mc@250
|
411 };
|
mas01mc@250
|
412
|
mas01mc@250
|
413 trackSequenceQueryRadNNReporter::trackSequenceQueryRadNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles):
|
mas01mc@250
|
414 pointNN(pointNN), trackNN(trackNN), numFiles(numFiles) {
|
mas01mc@250
|
415 // Where to count Radius track matches (one-to-one)
|
mas01mc@250
|
416 set = new std::set< NNresult >;
|
mas01mc@250
|
417 // Where to insert individual point matches (one-to-many)
|
mas01mc@250
|
418 point_queues = new std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> >[numFiles];
|
mas01mc@250
|
419
|
mas01mc@250
|
420 count = new unsigned int[numFiles];
|
mas01mc@250
|
421 for (unsigned i = 0; i < numFiles; i++) {
|
mas01mc@250
|
422 count[i] = 0;
|
mas01mc@250
|
423 }
|
mas01mc@250
|
424 }
|
mas01mc@250
|
425
|
mas01mc@250
|
426 trackSequenceQueryRadNNReporter::~trackSequenceQueryRadNNReporter() {
|
mas01mc@250
|
427 delete set;
|
mas01mc@250
|
428 delete [] count;
|
mas01mc@250
|
429 }
|
mas01mc@250
|
430
|
mas01mc@250
|
431 void trackSequenceQueryRadNNReporter::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
|
mas01mc@250
|
432 std::set< NNresult >::iterator it;
|
mas01mc@250
|
433 NNresult r;
|
mas01mc@250
|
434 r.trackID = trackID;
|
mas01mc@250
|
435 r.qpos = qpos;
|
mas01mc@250
|
436 r.dist = dist;
|
mas01mc@250
|
437 r.spos = spos;
|
mas01mc@250
|
438
|
mas01mc@250
|
439 // Record all matching points (within radius)
|
mas01mc@250
|
440 if (!isnan(dist)) {
|
mas01mc@250
|
441 point_queues[trackID].push(r);
|
mas01mc@250
|
442 if(point_queues[trackID].size() > pointNN)
|
mas01mc@250
|
443 point_queues[trackID].pop();
|
mas01mc@250
|
444 }
|
mas01mc@250
|
445
|
mas01mc@250
|
446 // Record counts of <trackID,qpos> pairs
|
mas01mc@250
|
447 it = set->find(r);
|
mas01mc@250
|
448 if (it == set->end()) {
|
mas01mc@250
|
449 set->insert(r);
|
mas01mc@250
|
450 count[trackID]++;
|
mas01mc@250
|
451 }
|
mas01mc@250
|
452 }
|
mas01mc@250
|
453
|
mas01mc@250
|
454 void trackSequenceQueryRadNNReporter::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
|
mas01mc@275
|
455 std::priority_queue < Radresult, std::vector<Radresult>, std::greater<Radresult> > result;
|
mas01mc@250
|
456 // KLUDGE: doing this backwards in an attempt to get the same
|
mas01mc@250
|
457 // tiebreak behaviour as before.
|
mas01mc@250
|
458 for (int i = numFiles-1; i >= 0; i--) {
|
mas01mc@250
|
459 Radresult r;
|
mas01mc@250
|
460 r.trackID = i;
|
mas01mc@250
|
461 r.count = count[i];
|
mas01mc@250
|
462 if(r.count > 0) {
|
mas01mc@250
|
463 result.push(r);
|
mas01mc@250
|
464 if (result.size() > trackNN) {
|
mas01mc@250
|
465 result.pop();
|
mas01mc@250
|
466 }
|
mas01mc@250
|
467 }
|
mas01mc@250
|
468 }
|
mas01mc@250
|
469
|
mas01mc@250
|
470 Radresult r;
|
mas01mc@250
|
471 std::vector<Radresult> v;
|
mas01mc@250
|
472 unsigned int size = result.size();
|
mas01mc@250
|
473 for(unsigned int k = 0; k < size; k++) {
|
mas01mc@250
|
474 r = result.top();
|
mas01mc@250
|
475 v.push_back(r);
|
mas01mc@250
|
476 result.pop();
|
mas01mc@250
|
477 }
|
mas01mc@264
|
478
|
mas01mc@264
|
479
|
mas01mc@264
|
480 // Traverse tracks in descending order of count cardinality
|
mas01mc@250
|
481 std::vector<Radresult>::reverse_iterator rit;
|
mas01mc@264
|
482 std::priority_queue< NNresult, std::vector< NNresult>, std::greater<NNresult> > point_queue;
|
mas01mc@264
|
483
|
mas01mc@250
|
484 if(adbQueryResponse==0) {
|
mas01mc@250
|
485 for(rit = v.rbegin(); rit < v.rend(); rit++) {
|
mas01mc@250
|
486 r = *rit;
|
mas01cr@256
|
487 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " " << r.count << std::endl;
|
mas01mc@264
|
488
|
mas01mc@264
|
489 // Reverse the order of the points stored in point_queues
|
mas01mc@264
|
490 unsigned int qsize=point_queues[r.trackID].size();
|
mas01mc@264
|
491 for(unsigned int k=0; k < qsize; k++){
|
mas01mc@264
|
492 point_queue.push(point_queues[r.trackID].top());
|
mas01mc@264
|
493 point_queues[r.trackID].pop();
|
mas01mc@264
|
494 }
|
mas01mc@264
|
495
|
mas01mc@264
|
496 for(unsigned int k=0; k < qsize; k++){
|
mas01mc@264
|
497 NNresult rk = point_queue.top();
|
mas01mc@250
|
498 std::cout << rk.dist << " " << rk.qpos << " " << rk.spos << std::endl;
|
mas01mc@264
|
499 point_queue.pop();
|
mas01mc@250
|
500 }
|
mas01mc@250
|
501 }
|
mas01mc@250
|
502 } else {
|
mas01mc@250
|
503 // FIXME
|
mas01mc@250
|
504 }
|
mas01mc@264
|
505 delete[] point_queues;
|
mas01mc@250
|
506 }
|
mas01mc@263
|
507
|
mas01mc@263
|
508
|
mas01mc@264
|
509 /********** ONE-TO-ONE REPORTERS *****************/
|
mas01mc@263
|
510
|
mas01mc@264
|
511 // track Sequence Query Radius NN Reporter One-to-One
|
mas01mc@264
|
512 // for each query point find the single best matching target point in all database
|
mas01mc@264
|
513 // report qpos, spos and trackID
|
mas01mc@263
|
514 class trackSequenceQueryRadNNReporterOneToOne : public Reporter {
|
mas01mc@263
|
515 public:
|
mas01mc@263
|
516 trackSequenceQueryRadNNReporterOneToOne(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
|
mas01mc@263
|
517 ~trackSequenceQueryRadNNReporterOneToOne();
|
mas01mc@263
|
518 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
|
mas01mc@263
|
519 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
|
mas01mc@263
|
520 protected:
|
mas01mc@263
|
521 unsigned int pointNN;
|
mas01mc@263
|
522 unsigned int trackNN;
|
mas01mc@263
|
523 unsigned int numFiles;
|
mas01mc@263
|
524 std::set< NNresult > *set;
|
mas01mc@263
|
525 std::vector< NNresult> *point_queue;
|
mas01mc@263
|
526 unsigned int *count;
|
mas01mc@263
|
527
|
mas01mc@263
|
528 };
|
mas01mc@263
|
529
|
mas01mc@263
|
530 trackSequenceQueryRadNNReporterOneToOne::trackSequenceQueryRadNNReporterOneToOne(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles):
|
mas01mc@263
|
531 pointNN(pointNN), trackNN(trackNN), numFiles(numFiles) {
|
mas01mc@263
|
532 // Where to count Radius track matches (one-to-one)
|
mas01mc@263
|
533 set = new std::set< NNresult >;
|
mas01mc@263
|
534 // Where to insert individual point matches (one-to-many)
|
mas01mc@263
|
535 point_queue = new std::vector< NNresult >;
|
mas01mc@263
|
536
|
mas01mc@263
|
537 count = new unsigned int[numFiles];
|
mas01mc@263
|
538 for (unsigned i = 0; i < numFiles; i++) {
|
mas01mc@263
|
539 count[i] = 0;
|
mas01mc@263
|
540 }
|
mas01mc@263
|
541 }
|
mas01mc@263
|
542
|
mas01mc@263
|
543 trackSequenceQueryRadNNReporterOneToOne::~trackSequenceQueryRadNNReporterOneToOne() {
|
mas01mc@263
|
544 delete set;
|
mas01mc@263
|
545 delete [] count;
|
mas01mc@263
|
546 }
|
mas01mc@263
|
547
|
mas01mc@263
|
548 void trackSequenceQueryRadNNReporterOneToOne::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
|
mas01mc@263
|
549 std::set< NNresult >::iterator it;
|
mas01mc@263
|
550 NNresult r;
|
mas01mc@264
|
551
|
mas01mc@263
|
552 r.qpos = qpos;
|
mas01mc@263
|
553 r.trackID = trackID;
|
mas01mc@263
|
554 r.spos = spos;
|
mas01mc@263
|
555 r.dist = dist;
|
mas01mc@263
|
556
|
mas01mc@263
|
557 if(point_queue->size() < r.qpos + 1){
|
mas01mc@263
|
558 point_queue->resize( r.qpos + 1 );
|
mas01mc@263
|
559 (*point_queue)[r.qpos].dist = 1e6;
|
mas01mc@263
|
560 }
|
mas01mc@263
|
561
|
mas01mc@263
|
562 if (r.dist < (*point_queue)[r.qpos].dist)
|
mas01mc@263
|
563 (*point_queue)[r.qpos] = r;
|
mas01mc@263
|
564
|
mas01mc@263
|
565 }
|
mas01mc@263
|
566
|
mas01mc@263
|
567 void trackSequenceQueryRadNNReporterOneToOne::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
|
mas01mc@263
|
568 if(adbQueryResponse==0) {
|
mas01mc@263
|
569 std::vector< NNresult >::iterator vit;
|
mas01mc@263
|
570 NNresult rk;
|
mas01mc@263
|
571 for( vit = point_queue->begin() ; vit < point_queue->end() ; vit++ ){
|
mas01mc@263
|
572 rk = *vit;
|
mas01mc@263
|
573 std::cout << rk.dist << " "
|
mas01mc@263
|
574 << rk.qpos << " "
|
mas01mc@263
|
575 << rk.spos << " "
|
mas01mc@263
|
576 << fileTable + rk.trackID*O2_FILETABLE_ENTRY_SIZE
|
mas01mc@263
|
577 << std::endl;
|
mas01mc@263
|
578 }
|
mas01mc@263
|
579 } else {
|
mas01mc@263
|
580 // FIXME
|
mas01mc@263
|
581 }
|
mas01mc@263
|
582 }
|