void PeakDetectorNaiveImpl::findPeaks(const FrequencyData& fd, peakdata::Scan& result) const { result.scanNumber = fd.scanNumber(); result.retentionTime = fd.retentionTime(); result.observationDuration = fd.observationDuration(); result.calibrationParameters = fd.calibrationParameters(); result.peakFamilies.clear(); const double noiseLevel = sqrt(fd.variance()); const double threshold = noiseLevel * noiseFactor_; for (FrequencyData::const_iterator it=fd.data().begin(); it!=fd.data().end(); ++it) if (isPeak(it, fd.data(), threshold, detectionRadius_)) { result.peakFamilies.push_back(PeakFamily()); PeakFamily& peakFamily = result.peakFamilies.back(); peakFamily.peaks.push_back(Peak()); Peak& peak = peakFamily.peaks.back(); peak.frequency = it->x; peak.intensity = it->y.real(); peak.phase = it->y.imag(); } }
void test() { // create some data, f(x) = abs(5-(x-2)) FrequencyData fd; FrequencyData::container& data = fd.data(); for (int i=-5; i<=5; i++) data.push_back(FrequencyDatum(i+2, 5-abs(i))); fd.analyze(); // recache after changing data // verify peak() FrequencyData::const_iterator max = fd.max(); unit_assert(max->x == 2); unit_assert(max->y == 5.); // verify stats unit_assert(fd.mean() == 25./11); unit_assert(fd.meanSquare() == 85./11); unit_assert(fd.sumSquares() == 85.); unit_assert_equal(fd.variance(), 85./11 - 25.*25/11/11, 1e-12); // write out data if (os_) *os_ << "Writing " << filename1 << endl; fd.write(filename1, FrequencyData::Text); // read into const FrequencyData string filename2 = "FrequencyDataTest.output2.txt"; FrequencyData fd2(filename1, FrequencyData::Text); // verify normalize() fd2.normalize(); unit_assert(fd2.shift() == -2); unit_assert(fd2.scale() == 1./5); max = fd2.max(); unit_assert(max->x == 0); unit_assert(max->y == 1.); // verify transform(shift, scale) fd2.transform(-fd2.shift(), 1./fd2.scale()); // verify read/write if (os_) *os_ << "Writing " << filename2 << endl; fd2.write(filename2, FrequencyData::Text); diff(filename1, filename2); // test subrange string filename3 = "FrequencyDataTest.output3.txt"; FrequencyData fd3(fd2, fd2.data().begin(), fd2.max()); // copy first half if (os_) *os_ << "Writing " << filename3 << endl; fd3.write(filename3, FrequencyData::Text); FrequencyData fd4(fd2, fd2.max(), fd2.data().end()); // copy second half ofstream os(filename3.c_str(), ios::app); fd4.write(os, FrequencyData::Text); os.close(); diff(filename1, filename3); // read/write binary, and metadata fd.scanNumber(555); fd.retentionTime(444); fd.calibrationParameters(CalibrationParameters(1,1)); fd.observationDuration(666); fd.noiseFloor(777); string filename4a = "FrequencyDataTest.output4a.txt"; if (os_) *os_ << "Writing " << filename4a << endl; fd.write(filename4a, FrequencyData::Text); string filenameBinary1 = "FrequencyDataTest.output1.cfd"; if (os_) *os_ << "Writing " << filenameBinary1 << endl; fd.write(filenameBinary1); FrequencyData fd5(filenameBinary1); unit_assert(fd5.observationDuration() == 666); fd5.observationDuration(fd.observationDurationEstimatedFromData()); unit_assert(fd5.scanNumber() == 555); unit_assert(fd5.retentionTime() == 444); unit_assert(fd5.observationDuration() == 1); unit_assert(fd5.noiseFloor() == 777); if (os_) *os_ << "Calibration: " << fd5.calibrationParameters().A << " " << fd5.calibrationParameters().B << endl; string filename4b = "FrequencyDataTest.output4b.txt"; if (os_) *os_ << "Writing " << filename4b << endl; fd5.write(filename4b, FrequencyData::Text); diff(filename4a, filename4b); fd.calibrationParameters(CalibrationParameters()); // test window FrequencyData window1(fd, data.begin()+1, 2); FrequencyData window2(fd, fd.max(), 1); FrequencyData window3(fd, data.end()-2, 2); string filename5 = "FrequencyDataTest.output5.txt"; if (os_) *os_ << "Writing " << filename5 << endl; ofstream os5(filename5.c_str()); window1.write(os5, FrequencyData::Text); window2.write(os5, FrequencyData::Text); window3.write(os5, FrequencyData::Text); os5.close(); diff(filename1, filename5); }