void SimplePairFinder::run(const std::vector<ConsensusMap> & input_maps, ConsensusMap & result_map) { if (input_maps.size() != 2) throw Exception::IllegalArgument(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "exactly two input maps required"); checkIds_(input_maps); // progress dots Int progress_dots = 0; if (this->param_.exists("debug::progress_dots")) { progress_dots = (Int) this->param_.getValue("debug:progress_dots"); } Int number_of_considered_element_pairs = 0; // For each element in map 0, find its best friend in map 1 std::vector<UInt> best_companion_index_0(input_maps[0].size(), UInt(-1)); std::vector<double> best_companion_quality_0(input_maps[0].size(), 0); for (UInt fi0 = 0; fi0 < input_maps[0].size(); ++fi0) { double best_quality = -std::numeric_limits<double>::max(); for (UInt fi1 = 0; fi1 < input_maps[1].size(); ++fi1) { double quality = similarity_(input_maps[0][fi0], input_maps[1][fi1]); if (quality > best_quality) { best_quality = quality; best_companion_index_0[fi0] = fi1; } ++number_of_considered_element_pairs; if (progress_dots && !(number_of_considered_element_pairs % progress_dots)) { std::cout << '-' << std::flush; } } best_companion_quality_0[fi0] = best_quality; } // For each element in map 1, find its best friend in map 0 std::vector<UInt> best_companion_index_1(input_maps[1].size(), UInt(-1)); std::vector<double> best_companion_quality_1(input_maps[1].size(), 0); for (UInt fi1 = 0; fi1 < input_maps[1].size(); ++fi1) { double best_quality = -std::numeric_limits<double>::max(); for (UInt fi0 = 0; fi0 < input_maps[0].size(); ++fi0) { double quality = similarity_(input_maps[0][fi0], input_maps[1][fi1]); if (quality > best_quality) { best_quality = quality; best_companion_index_1[fi1] = fi0; } ++number_of_considered_element_pairs; if (progress_dots && !(number_of_considered_element_pairs % progress_dots)) { std::cout << '+' << std::flush; } } best_companion_quality_1[fi1] = best_quality; } // And if both like each other, they become a pair. // element_pairs_->clear(); for (UInt fi0 = 0; fi0 < input_maps[0].size(); ++fi0) { // fi0 likes someone ... if (best_companion_quality_0[fi0] > pair_min_quality_) { // ... who likes him too ... UInt best_companion_of_fi0 = best_companion_index_0[fi0]; if (best_companion_index_1[best_companion_of_fi0] == fi0 && best_companion_quality_1[best_companion_of_fi0] > pair_min_quality_ ) { ConsensusFeature f; f.insert(input_maps[0][fi0]); f.insert(input_maps[1][best_companion_of_fi0]); f.computeConsensus(); f.setQuality(best_companion_quality_0[fi0] + best_companion_quality_1[best_companion_of_fi0]); result_map.push_back(f); } } } return; }
void QTClusterFinder::makeConsensusFeature_(list<QTCluster> & clustering, ConsensusFeature & feature, OpenMSBoost::unordered_map<GridFeature *, std::vector< QTCluster * > > & element_mapping) { // find the best cluster (a valid cluster with the highest score) list<QTCluster>::iterator best = clustering.begin(); while (best != clustering.end() && best->isInvalid()) {++best;} for (list<QTCluster>::iterator it = best; it != clustering.end(); ++it) { if (!it->isInvalid()) { if (it->getQuality() > best->getQuality()) { best = it; } } } // no more clusters to process -> clear clustering and return if (best == clustering.end()) { clustering.clear(); return; } OpenMSBoost::unordered_map<Size, GridFeature *> elements; best->getElements(elements); // cout << "Elements: " << elements.size() << " with best " << best->getQuality() << " invalid " << best->isInvalid() << endl; // create consensus feature from best cluster: feature.setQuality(best->getQuality()); for (OpenMSBoost::unordered_map<Size, GridFeature *>::const_iterator it = elements.begin(); it != elements.end(); ++it) { feature.insert(it->first, it->second->getFeature()); } feature.computeConsensus(); // update the clustering: // 1. remove current "best" cluster // 2. update all clusters accordingly and invalidate elements whose central // element is removed best->setInvalid(); for (OpenMSBoost::unordered_map<Size, GridFeature *>::const_iterator it = elements.begin(); it != elements.end(); ++it) { for (std::vector< QTCluster* >::iterator cluster = element_mapping[&(*it->second)].begin(); cluster != element_mapping[&(*it->second)].end(); ++cluster) { // we do not want to update invalid features (saves time and does not // recompute the quality) if (!(*cluster)->isInvalid()) { if (!(*cluster)->update(elements)) // cluster is invalid (center point removed): { (*cluster)->setInvalid(); } } } } }