double SpectrumAlignmentScore::operator()(const PeakSpectrum & s1, const PeakSpectrum & s2) const { const double tolerance = (double)param_.getValue("tolerance"); bool is_relative_tolerance = param_.getValue("is_relative_tolerance").toBool(); bool use_linear_factor = param_.getValue("use_linear_factor").toBool(); bool use_gaussian_factor = param_.getValue("use_gaussian_factor").toBool(); if (use_linear_factor && use_gaussian_factor) { cerr << "Warning: SpectrumAlignmentScore, use either 'use_linear_factor' or 'use_gaussian_factor'!" << endl; } SpectrumAlignment aligner; Param p; p.setValue("tolerance", tolerance); p.setValue("is_relative_tolerance", (String)param_.getValue("is_relative_tolerance")); aligner.setParameters(p); vector<pair<Size, Size> > alignment; aligner.getSpectrumAlignment(alignment, s1, s2); double score(0), sum(0), sum1(0), sum2(0); for (PeakSpectrum::ConstIterator it1 = s1.begin(); it1 != s1.end(); ++it1) { sum1 += it1->getIntensity() * it1->getIntensity(); } for (PeakSpectrum::ConstIterator it1 = s2.begin(); it1 != s2.end(); ++it1) { sum2 += it1->getIntensity() * it1->getIntensity(); } for (vector<pair<Size, Size> >::const_iterator it = alignment.begin(); it != alignment.end(); ++it) { //double factor(0.0); //factor = (epsilon - fabs(s1[it->first].getPosition()[0] - s2[it->second].getPosition()[0])) / epsilon; double mz_tolerance(tolerance); if (is_relative_tolerance) { mz_tolerance = mz_tolerance * s1[it->first].getPosition()[0] / 1e6; } double mz_difference(fabs(s1[it->first].getPosition()[0] - s2[it->second].getPosition()[0])); double factor = 1.0; if (use_linear_factor || use_gaussian_factor) { factor = getFactor_(mz_tolerance, mz_difference, use_gaussian_factor); } sum += sqrt(s1[it->first].getIntensity() * s2[it->second].getIntensity() * factor); } score = sum / (sqrt(sum1 * sum2)); return score; }
double ZhangSimilarityScore::operator()(const PeakSpectrum & s1, const PeakSpectrum & s2) const { const double tolerance = (double)param_.getValue("tolerance"); bool use_linear_factor = param_.getValue("use_linear_factor").toBool(); bool use_gaussian_factor = param_.getValue("use_gaussian_factor").toBool(); double score(0), sum(0), sum1(0), sum2(0) /*, squared_sum1(0), squared_sum2(0)*/; // TODO remove parameter if (param_.getValue("is_relative_tolerance").toBool() ) { throw Exception::NotImplemented(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION); } for (PeakSpectrum::ConstIterator it1 = s1.begin(); it1 != s1.end(); ++it1) { sum1 += it1->getIntensity(); /* for (PeakSpectrum::ConstIterator it2 = s1.begin(); it2 != s1.end(); ++it2) { if (abs(it1->getPosition()[0] - it2->getPosition()[0]) <= 2 * tolerance) { squared_sum1 += it1->getIntensity() * it2->getIntensity(); } }*/ } /* UInt i_left(0); for (Size i = 0; i != s1.size(); ++i) { sum1 += s1[i].getIntensity(); for (Size j = i_left; j != s1.size(); ++j) { double pos1(s1[i].getPosition()[0]), pos2(s1[j].getPosition()[0]); if (abs(pos1 - pos2) <= 2 * tolerance) { squared_sum1 += s1[i].getIntensity() * s1[j].getIntensity(); } else { if (pos2 > pos1) { break; } else { i_left = i; } } } }*/ /* i_left = 0; for (Size i = 0; i != s2.size(); ++i) { sum2 += s2[i].getIntensity(); for (Size j = i_left; j != s2.size(); ++j) { double pos1(s2[i].getPosition()[0]), pos2(s2[j].getPosition()[0]); if (abs(pos1 - pos2) <= 2 * tolerance) { squared_sum1 += s2[i].getIntensity() * s2[j].getIntensity(); } else { if (pos2 > pos1) { break; } else { i_left = i; } } } }*/ for (PeakSpectrum::ConstIterator it1 = s2.begin(); it1 != s2.end(); ++it1) { sum2 += it1->getIntensity(); /* for (PeakSpectrum::ConstIterator it2 = s2.begin(); it2 != s2.end(); ++it2) { if (abs(it1->getPosition()[0] - it2->getPosition()[0]) <= 2 * tolerance) { squared_sum2 += it1->getIntensity() * it2->getIntensity(); } } */ } Size j_left(0); for (Size i = 0; i != s1.size(); ++i) { for (Size j = j_left; j != s2.size(); ++j) { double pos1(s1[i].getMZ()), pos2(s2[j].getMZ()); if (fabs(pos1 - pos2) < tolerance) { //double factor((tolerance - fabs(pos1 - pos2)) / tolerance); double factor = 1.0; if (use_linear_factor || use_gaussian_factor) { factor = getFactor_(tolerance, fabs(pos1 - pos2), use_gaussian_factor); } sum += sqrt(s1[i].getIntensity() * s2[j].getIntensity() * factor); } else { if (pos2 > pos1) { break; } else { j_left = j; } } } } /* for (PeakSpectrum::ConstIterator it1 = s1.begin(); it1 != s1.end(); ++it1) { for (PeakSpectrum::ConstIterator it2 = s2.begin(); it2 != s2.end(); ++it2) { if (abs(it1->getPosition()[0] - it2->getPosition()[0]) <= 2 * tolerance) { sum += sqrt(it1->getIntensity() * it2->getIntensity()); } } }*/ score = sum / (sqrt(sum1 * sum2)); return score; }