void FeatureMap::updateRanges() { this->clearRanges(); updateRanges_(this->begin(), this->end()); //enlarge the range by the convex hull points for (Size i = 0; i < this->size(); ++i) { DBoundingBox<2> box = this->operator[](i).getConvexHull().getBoundingBox(); if (!box.isEmpty()) { //update RT if (box.minPosition()[Peak2D::RT] < this->pos_range_.minPosition()[Peak2D::RT]) { this->pos_range_.setMinX(box.minPosition()[Peak2D::RT]); } if (box.maxPosition()[Peak2D::RT] > this->pos_range_.maxPosition()[Peak2D::RT]) { this->pos_range_.setMaxX(box.maxPosition()[Peak2D::RT]); } //update m/z if (box.minPosition()[Peak2D::MZ] < this->pos_range_.minPosition()[Peak2D::MZ]) { this->pos_range_.setMinY(box.minPosition()[Peak2D::MZ]); } if (box.maxPosition()[Peak2D::MZ] > this->pos_range_.maxPosition()[Peak2D::MZ]) { this->pos_range_.setMaxY(box.maxPosition()[Peak2D::MZ]); } } } }
void markFeatureLocations_(FeatureMap & feature_map, MSExperiment<> & exp, QImage & image, bool transpose, QColor color) { double xcoef = image.width(), ycoef = image.height(); if (transpose) { xcoef /= exp.getMaxRT() - exp.getMinRT(); ycoef /= exp.getMaxMZ() - exp.getMinMZ(); } else { xcoef /= exp.getMaxMZ() - exp.getMinMZ(); ycoef /= exp.getMaxRT() - exp.getMinRT(); } for (FeatureMap::Iterator feat_iter = feature_map.begin(); feat_iter != feature_map.end(); ++feat_iter) { const ConvexHull2D convex_hull = feat_iter->getConvexHull(); DBoundingBox<2> box = convex_hull.getBoundingBox(); double rt = feat_iter->getRT(); double mz = feat_iter->getMZ(); double lower_mz = box.minY(); double lower_rt = box.minX(); double upper_mz = box.maxY(); double upper_rt = box.maxX(); int lx, ly, ux, uy, cx, cy; if (transpose) { lx = int(xcoef * (lower_rt - exp.getMinRT())); ly = int(ycoef * (exp.getMaxMZ() - lower_mz)); ux = int(xcoef * (upper_rt - exp.getMinRT())); uy = int(ycoef * (exp.getMaxMZ() - upper_mz)); cx = int(xcoef * (rt - exp.getMinRT())); cy = int(ycoef * (mz - lower_mz)); } else { lx = int(xcoef * (lower_mz - exp.getMinMZ())); ly = int(ycoef * (exp.getMaxRT() - lower_rt)); ux = int(xcoef * (upper_mz - exp.getMinMZ())); uy = int(ycoef * (exp.getMaxRT() - upper_rt)); cx = int(xcoef * (mz - exp.getMinMZ())); cy = int(ycoef * (exp.getMaxRT() - rt)); } addFeatureBox_(ly, lx, uy, ux, image, color); addPoint_(cx, cy, image, Qt::black); // mark center } }
void IDMapper::increaseBoundingBox_(DBoundingBox<2> & box) { DPosition<2> sub_min(rt_tolerance_, getAbsoluteMZTolerance_(box.minPosition().getY())), add_max(rt_tolerance_, getAbsoluteMZTolerance_(box.maxPosition().getY())); box.setMin(box.minPosition() - sub_min); box.setMax(box.maxPosition() + add_max); }
ConvexHull2D& Feature::getConvexHull() const { //recalculate convex hull if necessary if (convex_hulls_modified_) { //only one mass trace convex hull => use it as overall convex hull if (convex_hulls_.size() == 1) { convex_hull_ = convex_hulls_[0]; } else { convex_hull_.clear(); if (convex_hulls_.size() > 0) { /* -- this does not work with our current approach of "non-convex"hull computation as the mass traces of features cannot be combined -- meaningfully. We thus print only the bounding box of the traces (for now) for (Size hull=0; hull<convex_hulls_.size(); ++hull) { convex_hull_.addPoints(convex_hulls_[hull].getHullPoints()); } */ DBoundingBox<2> box; for (Size hull = 0; hull < convex_hulls_.size(); ++hull) { box.enlarge(convex_hulls_[hull].getBoundingBox().minPosition()[0], convex_hulls_[hull].getBoundingBox().minPosition()[1]); box.enlarge(convex_hulls_[hull].getBoundingBox().maxPosition()[0], convex_hulls_[hull].getBoundingBox().maxPosition()[1]); } convex_hull_.addPoint(ConvexHull2D::PointType(box.minX(), box.minY())); convex_hull_.addPoint(ConvexHull2D::PointType(box.maxX(), box.minY())); convex_hull_.addPoint(ConvexHull2D::PointType(box.minX(), box.maxY())); convex_hull_.addPoint(ConvexHull2D::PointType(box.maxX(), box.maxY())); } } convex_hulls_modified_ = false; } return convex_hull_; }
bool overlaps_(const Feature& feature, const double rt, const double pc_mz, const double rt_tolerance) const { if (feature.getConvexHulls().empty()) { LOG_WARN << "HighResPrecursorMassCorrector warning: at least one feature has no convex hull - omitting feature for matching" << std::endl; } // get bounding box and extend by retention time tolerance DBoundingBox<2> box = feature.getConvexHull().getBoundingBox(); DPosition<2> extend_rt(rt_tolerance, 0.01); box.setMin(box.minPosition() - extend_rt); box.setMax(box.maxPosition() + extend_rt); DPosition<2> pc_pos(rt, pc_mz); if (box.encloses(pc_pos)) { return true; } else { return false; } }
// // V_MarkRect // void V_MarkRect (int x, int y, int width, int height) { dirtybox.AddToBox (x, y); dirtybox.AddToBox (x+width-1, y+height-1); }
void Spectrum2DWidget::showGoToDialog() { Spectrum2DGoToDialog goto_dialog(this); //set range const DRange<2>& area = canvas()->getVisibleArea(); goto_dialog.setRange(area.minY(), area.maxY(), area.minX(), area.maxX()); goto_dialog.setMinMaxOfRange(canvas()->getDataRange().minY(), canvas()->getDataRange().maxY(), canvas()->getDataRange().minX(), canvas()->getDataRange().maxX()); // feature numbers only for consensus&feature maps goto_dialog.enableFeatureNumber(canvas()->getCurrentLayer().type == LayerData::DT_FEATURE || canvas()->getCurrentLayer().type == LayerData::DT_CONSENSUS); //execute if (goto_dialog.exec()) { if (goto_dialog.showRange()) { goto_dialog.fixRange(); SpectrumCanvas::AreaType area(goto_dialog.getMinMZ(), goto_dialog.getMinRT(), goto_dialog.getMaxMZ(), goto_dialog.getMaxRT()); if (goto_dialog.clip_checkbox->checkState() == Qt::Checked) correctAreaToObeyMinMaxRanges_(area); canvas()->setVisibleArea(area); } else { String feature_id = goto_dialog.getFeatureNumber(); //try to convert to UInt64 id UniqueIdInterface uid; uid.setUniqueId(feature_id); Size feature_index(-1); // TODO : not use -1 if (canvas()->getCurrentLayer().type == LayerData::DT_FEATURE) feature_index = canvas()->getCurrentLayer().getFeatureMap()->uniqueIdToIndex(uid.getUniqueId()); else if (canvas()->getCurrentLayer().type == LayerData::DT_CONSENSUS) feature_index = canvas()->getCurrentLayer().getConsensusMap()->uniqueIdToIndex(uid.getUniqueId()); if (feature_index == Size(-1)) // UID does not exist { try { feature_index = feature_id.toInt(); // normal feature index as stored in map } catch (...) // we might still deal with a UID, so toInt() will throw as the number is too big { feature_index = Size(-1); } } //check if the feature index exists if ((canvas()->getCurrentLayer().type == LayerData::DT_FEATURE && feature_index >= canvas()->getCurrentLayer().getFeatureMap()->size()) || (canvas()->getCurrentLayer().type == LayerData::DT_CONSENSUS && feature_index >= canvas()->getCurrentLayer().getConsensusMap()->size())) { QMessageBox::warning(this, "Invalid feature number", "Feature number too large/UniqueID not found.\nPlease select a valid feature!"); return; } //display feature with a margin if (canvas()->getCurrentLayer().type == LayerData::DT_FEATURE) { const FeatureMapType& map = *canvas()->getCurrentLayer().getFeatureMap(); DBoundingBox<2> bb = map[feature_index].getConvexHull().getBoundingBox(); double rt_margin = (bb.maxPosition()[0] - bb.minPosition()[0]) * 0.5; double mz_margin = (bb.maxPosition()[1] - bb.minPosition()[1]) * 2; SpectrumCanvas::AreaType narea(bb.minPosition()[1] - mz_margin, bb.minPosition()[0] - rt_margin, bb.maxPosition()[1] + mz_margin, bb.maxPosition()[0] + rt_margin); canvas()->setVisibleArea(narea); } else // Consensus Feature { const ConsensusFeature& cf = (*canvas()->getCurrentLayer().getConsensusMap())[feature_index]; double rt_margin = 30; double mz_margin = 5; SpectrumCanvas::AreaType narea(cf.getMZ() - mz_margin, cf.getRT() - rt_margin, cf.getMZ() + mz_margin, cf.getRT() + rt_margin); canvas()->setVisibleArea(narea); } } } }
TEST_REAL_SIMILAR(tmp.getConvexHulls()[0].getHullPoints()[0][0],1.0) TEST_REAL_SIMILAR(tmp.getConvexHulls()[0].getHullPoints()[0][1],2.0) TEST_REAL_SIMILAR(tmp.getConvexHulls()[0].getHullPoints()[1][0],3.0) TEST_REAL_SIMILAR(tmp.getConvexHulls()[0].getHullPoints()[1][1],4.0) TEST_REAL_SIMILAR(tmp.getConvexHulls()[1].getHullPoints()[0][0],0.5) TEST_REAL_SIMILAR(tmp.getConvexHulls()[1].getHullPoints()[0][1],0.0) TEST_REAL_SIMILAR(tmp.getConvexHulls()[1].getHullPoints()[1][0],1.0) TEST_REAL_SIMILAR(tmp.getConvexHulls()[1].getHullPoints()[1][1],1.0) END_SECTION START_SECTION((ConvexHull2D& getConvexHull() const)) Feature tmp; tmp.setConvexHulls(hulls); //check if the bounding box is ok DBoundingBox<2> bb = tmp.getConvexHull().getBoundingBox(); TEST_REAL_SIMILAR(bb.minPosition()[0],0.5) TEST_REAL_SIMILAR(bb.minPosition()[1],0.0) TEST_REAL_SIMILAR(bb.maxPosition()[0],3.0) TEST_REAL_SIMILAR(bb.maxPosition()[1],4.0) //check the convex hull points TEST_EQUAL(tmp.getConvexHull().getHullPoints().size(),4) TEST_REAL_SIMILAR(tmp.getConvexHull().getHullPoints()[0][0],0.5) TEST_REAL_SIMILAR(tmp.getConvexHull().getHullPoints()[0][1],0.0) TEST_REAL_SIMILAR(tmp.getConvexHull().getHullPoints()[1][0],3.0) TEST_REAL_SIMILAR(tmp.getConvexHull().getHullPoints()[1][1],0.0) TEST_REAL_SIMILAR(tmp.getConvexHull().getHullPoints()[2][0],3.0) TEST_REAL_SIMILAR(tmp.getConvexHull().getHullPoints()[2][1],4.0) TEST_REAL_SIMILAR(tmp.getConvexHull().getHullPoints()[3][0],0.5) TEST_REAL_SIMILAR(tmp.getConvexHull().getHullPoints()[3][1],4.0)