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