annotate reporter.h @ 254:fe922b9d87f8

Fixed side-effect error in trackSwquqnceRadNNReporter point reporter loop.
author mas01mc
date Sat, 12 Apr 2008 13:28:30 +0000
parents d248a3ac699d
children 4dcb09f5fe85
rev   line source
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@239 93 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << " ";
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@239 112 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLESIZE);
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@239 194 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << " ";
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@239 213 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLESIZE);
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@239 286 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << " " << 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;
mas01mc@250 352 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << " " << 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;
mas01mc@248 375 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLESIZE);
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;
mas01mc@250 472 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << " " << 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 }