annotate reporter.h @ 275:d209e8470a60

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