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