annotate reporter.h @ 250:a6ee49f10296

Added trackSequenceQueryRadNNReporter: orders retrieved tracks by one-to-one point counts per track and also reports the N nearest neighbour points per track. This reporter is accessed via -Q nsequence and will give identical results to the averaging NN reporter if the search radius is set at or above the furthest point in the returned set.
author mas01mc
date Mon, 18 Feb 2008 10:47:03 +0000
parents 1da9a9ed55a3
children d248a3ac699d
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
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 }