double BinnedSumAgreeingIntensities::operator()(const BinnedSpectrum & spec1, const BinnedSpectrum & spec2) const { // avoid crash while comparing if (!spec1.checkCompliance(spec2)) { throw IncompatibleBinning(__FILE__, __LINE__, __PRETTY_FUNCTION__, ""); } // shortcut similarity calculation by comparing PrecursorPeaks (PrecursorPeaks more than delta away from each other are supposed to be from another peptide) DoubleReal pre_mz1 = 0.0; if (!spec1.getPrecursors().empty()) pre_mz1 = spec1.getPrecursors()[0].getMZ(); DoubleReal pre_mz2 = 0.0; if (!spec1.getPrecursors().empty()) pre_mz2 = spec2.getPrecursors()[0].getMZ(); if (fabs(pre_mz1 - pre_mz2) > (double)param_.getValue("precursor_mass_tolerance")) { return 0; } double score(0), sharedBins(min(spec1.getBinNumber(), spec2.getBinNumber())), sum1(0), sum2(0), summax(0); // all bins at equal position and similar intensities contribute positively to score for (Size i = 0; i < sharedBins; ++i) { sum1 += spec1.getBins()[i]; sum2 += spec2.getBins()[i]; summax += max((float)0, ((spec1.getBins()[i] + spec2.getBins()[i]) / 2) - fabs(spec1.getBins()[i] - spec2.getBins()[i])); } // resulting score normalized to interval [0,1] score = summax * (2 / (sum1 + sum2)); return score; }
START_SECTION((BinnedSpectrum(const BinnedSpectrum &source))) { BinnedSpectrum copy(*bs1); TEST_EQUAL(copy.getName(), bs1->getName()); TEST_EQUAL(copy.getBinSize(), bs1->getBinSize()); TEST_EQUAL((UInt)copy.getPrecursors()[0].getMZ(),(UInt)bs1->getPrecursors()[0].getMZ()); } END_SECTION START_SECTION((BinnedSpectrum& operator=(const BinnedSpectrum &source))) { BinnedSpectrum copy(*bs1); bs1 = new BinnedSpectrum(1.5,2,s1); TEST_EQUAL(copy.getName(), bs1->getName()); TEST_EQUAL(copy.getBinSize(), bs1->getBinSize()); TEST_EQUAL((UInt)copy.getPrecursors()[0].getMZ(),(UInt)bs1->getPrecursors()[0].getMZ()); } END_SECTION START_SECTION((BinnedSpectrum& operator=(const PeakSpectrum &source))) { bs1 = new BinnedSpectrum(); *bs1 = s1; TEST_EQUAL(bs1->getPrecursors()[0].getMZ(),s1.getPrecursors()[0].getMZ()); bs1->setBinSize(1.5); bs1->setBinSpread(2); } END_SECTION START_SECTION((bool operator==(const BinnedSpectrum &rhs) const )) {