From: Chris P. <cp...@sy...> - 2009-10-15 17:00:29
|
Sorry not getting to this faster. -----Original Message----- From: Darren Kessner [mailto:da...@pr...] Sent: Tuesday, October 13, 2009 9:33 PM To: proteowizard-developer Subject: [proteowizard-developer] Build failure -- SpectrumList_PeakFilter.cpp Hi Chris, It looks like these errors come from a missing SpectrumList_PeakFilter.cpp: error: Unable to find file or target named [11:29:52]: error: 'SpectrumList_PeakFilter.cpp' [11:29:52]: error: referred from project at [11:29:52]: error: '/TeamCity/work/pwiz/pwiz/analysis/spectrum_processing' Could you please check in the missing file? I've added you to proteowizard-commit so you can monitor commits and auto build results -- the rest of us got a bunch of failed build messages today. Darren On Tue, Oct 13, 2009 at 3:51 PM, Robert Burke <rob...@pr...> wrote: > Is there a SpectrumList_PeakFilter.cpp in pwiz/analysis/spectrum_processing > that can be checked in? > > On Tue, Oct 13, 2009 at 11:22 AM, <cp...@us...> wrote: >> >> Revision: 1411 >> >> http://proteowizard.svn.sourceforge.net/proteowizard/?rev=1411&view=rev >> Author: cpaulse >> Date: 2009-10-13 18:22:55 +0000 (Tue, 13 Oct 2009) >> >> Log Message: >> ----------- >> EDT/ECD MS2 precursor removal filter. Read possible charge state tag from >> mzXML. >> >> Modified Paths: >> -------------- >> trunk/pwiz/pwiz/analysis/peakdetect/MZTolerance.cpp >> trunk/pwiz/pwiz/analysis/peakdetect/MZTolerance.hpp >> trunk/pwiz/pwiz/analysis/spectrum_processing/Jamfile.jam >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumListFactory.cpp >> trunk/pwiz/pwiz/data/msdata/SpectrumList_mzXML.cpp >> trunk/pwiz/pwiz/data/msdata/cv.hpp >> >> Added Paths: >> ----------- >> trunk/pwiz/pwiz/analysis/common/IDataFilter.hpp >> trunk/pwiz/pwiz/analysis/spectrum_processing/PrecursorMassFilter.cpp >> trunk/pwiz/pwiz/analysis/spectrum_processing/PrecursorMassFilter.hpp >> >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumList_PeakFilterTest.cp p >> trunk/pwiz/pwiz/analysis/spectrum_processing/ThresholdFilter.cpp >> trunk/pwiz/pwiz/analysis/spectrum_processing/ThresholdFilter.hpp >> >> Removed Paths: >> ------------- >> >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumList_Thresholder.cpp >> >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumList_Thresholder.hpp >> >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumList_ThresholderTest.c pp >> >> Added: trunk/pwiz/pwiz/analysis/common/IDataFilter.hpp >> =================================================================== >> --- trunk/pwiz/pwiz/analysis/common/IDataFilter.hpp >> (rev 0) >> +++ trunk/pwiz/pwiz/analysis/common/IDataFilter.hpp 2009-10-13 >> 18:22:55 UTC (rev 1411) >> @@ -0,0 +1,48 @@ >> +// >> +// $Id: SpectrumList_PeakFilter.hpp 1191 2009-08-14 19:33:05Z chambm $ >> +// >> +// >> +// Original author: Chris Paulse <cpaulse <a.t> systemsbiology.org> >> +// >> +// Copyright 2009 Institute for Systems Biology, Seattle, WA >> +// >> +// Licensed under the Apache License, Version 2.0 (the "License"); >> +// you may not use this file except in compliance with the License. >> +// You may obtain a copy of the License at >> +// >> +// http://www.apache.org/licenses/LICENSE-2.0 >> +// >> +// Unless required by applicable law or agreed to in writing, software >> +// distributed under the License is distributed on an "AS IS" BASIS, >> +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >> implied. >> +// See the License for the specific language governing permissions and >> +// limitations under the License. >> +// >> + >> + >> +#ifndef _IDATAFILTER_HPP_ >> +#define _IDATAFILTER_HPP_ >> + >> + >> +namespace pwiz { >> +namespace analysis { >> + >> +struct ISpectrumDataFilter >> +{ >> + virtual void operator () (const pwiz::msdata::SpectrumPtr) const = 0; >> + virtual void describe(pwiz::msdata::ProcessingMethod&) const = 0; >> + virtual ~ISpectrumDataFilter() {} >> +}; >> + >> +struct IChromatogramDataFilter >> +{ >> + virtual void operator () (const pwiz::msdata::ChromatogramPtr) const >> = 0; >> + virtual void describe(pwiz::msdata::ProcessingMethod&) const = 0; >> + virtual ~IChromatogramDataFilter() {} >> +}; >> + >> +} // namespace analysis >> +} // namespace pwiz >> + >> + >> +#endif // _ISPECTRUMDATAFILTER_HPP_ >> >> Modified: trunk/pwiz/pwiz/analysis/peakdetect/MZTolerance.cpp >> =================================================================== >> --- trunk/pwiz/pwiz/analysis/peakdetect/MZTolerance.cpp 2009-10-12 >> 22:31:59 UTC (rev 1410) >> +++ trunk/pwiz/pwiz/analysis/peakdetect/MZTolerance.cpp 2009-10-13 >> 18:22:55 UTC (rev 1411) >> @@ -110,7 +110,12 @@ >> return (a > b-tolerance) && (a < b+tolerance); >> } >> >> +bool PWIZ_API_DECL lessThanTolerance(double a, double b, const >> MZTolerance& tolerance) >> +{ >> + return (a < b-tolerance); >> +} >> >> + >> } // namespace analysis >> } // namespace pwiz >> >> >> Modified: trunk/pwiz/pwiz/analysis/peakdetect/MZTolerance.hpp >> =================================================================== >> --- trunk/pwiz/pwiz/analysis/peakdetect/MZTolerance.hpp 2009-10-12 >> 22:31:59 UTC (rev 1410) >> +++ trunk/pwiz/pwiz/analysis/peakdetect/MZTolerance.hpp 2009-10-13 >> 18:22:55 UTC (rev 1411) >> @@ -60,6 +60,8 @@ >> >> /// returns true iff a is in (b-tolerance, b+tolerance) >> bool PWIZ_API_DECL isWithinTolerance(double a, double b, const >> MZTolerance& tolerance); >> +/// returns true iff b - a is greater than the value in tolerance (useful >> for matching sorted mass lists) >> +bool PWIZ_API_DECL lessThanTolerance(double a, double b, const >> MZTolerance& tolerance); >> >> >> } // namespace analysis >> >> Modified: trunk/pwiz/pwiz/analysis/spectrum_processing/Jamfile.jam >> =================================================================== >> --- trunk/pwiz/pwiz/analysis/spectrum_processing/Jamfile.jam 2009-10-12 >> 22:31:59 UTC (rev 1410) >> +++ trunk/pwiz/pwiz/analysis/spectrum_processing/Jamfile.jam 2009-10-13 >> 18:22:55 UTC (rev 1411) >> @@ -27,15 +27,15 @@ >> ; >> >> >> -rule vendor-reader-libraries ( properties * ) >> -{ >> +rule vendor-reader-libraries ( properties * ) >> +{ >> local libraries ; >> local core_vendor_reader_path = >> $(PWIZ_ROOT_PATH)/pwiz/data/vendor_readers ; >> local msrc_vendor_reader_path = >> $(PWIZ_ROOT_PATH)/pwiz_aux/msrc/data/vendor_readers ; >> - if [ project-exists $(core_vendor_reader_path) ] { libraries += >> <library>$(core_vendor_reader_path)//pwiz_data_vendor_readers ; } >> - if [ project-exists $(msrc_vendor_reader_path)/ABI ] { libraries += >> <library>$(msrc_vendor_reader_path)/ABI//pwiz_aux_msrc_reader_abi ; } >> - if [ project-exists $(msrc_vendor_reader_path)/Bruker ] { libraries >> += <library>$(msrc_vendor_reader_path)/Bruker//pwiz_aux_msrc_reader_bruker ; >> } >> - if [ project-exists $(msrc_vendor_reader_path)/Waters ] { libraries >> += <library>$(msrc_vendor_reader_path)/Waters//pwiz_aux_msrc_reader_waters ; >> } >> + if [ project-exists $(core_vendor_reader_path) ] { libraries += >> <library>$(core_vendor_reader_path)//pwiz_data_vendor_readers ; } >> + if [ project-exists $(msrc_vendor_reader_path)/ABI ] { libraries += >> <library>$(msrc_vendor_reader_path)/ABI//pwiz_aux_msrc_reader_abi ; } >> + if [ project-exists $(msrc_vendor_reader_path)/Bruker ] { libraries >> += <library>$(msrc_vendor_reader_path)/Bruker//pwiz_aux_msrc_reader_bruker ; >> } >> + if [ project-exists $(msrc_vendor_reader_path)/Waters ] { libraries >> += <library>$(msrc_vendor_reader_path)/Waters//pwiz_aux_msrc_reader_waters ; >> } >> return $(libraries) ; >> } >> >> @@ -47,10 +47,12 @@ >> SpectrumList_PrecursorRecalculator.cpp >> SpectrumList_Smoother.cpp >> SpectrumList_PeakPicker.cpp >> - SpectrumList_Thresholder.cpp >> + SpectrumList_PeakFilter.cpp >> SpectrumList_ChargeStateCalculator.cpp >> SpectrumList_MZWindow.cpp >> PrecursorRecalculatorDefault.cpp >> + PrecursorMassFilter.cpp >> + ThresholdFilter.cpp >> : # requirements >> <library>../../data/msdata//pwiz_data_msdata >> <library>../peakdetect//pwiz_analysis_peakdetect >> @@ -74,7 +76,7 @@ >> >> unit-test SpectrumList_SorterTest : SpectrumList_SorterTest.cpp >> pwiz_analysis_spectrum_processing >> ../../data/msdata//pwiz_data_msdata_examples ; >> unit-test SpectrumList_FilterTest : SpectrumList_FilterTest.cpp >> pwiz_analysis_spectrum_processing >> ../../data/msdata//pwiz_data_msdata_examples ; >> -unit-test SpectrumList_ThresholderTest : SpectrumList_ThresholderTest.cpp >> pwiz_analysis_spectrum_processing >> ../../data/msdata//pwiz_data_msdata_examples ; >> +unit-test SpectrumList_PeakFilterTest : SpectrumList_PeakFilterTest.cpp >> pwiz_analysis_spectrum_processing >> ../../data/msdata//pwiz_data_msdata_examples ; >> unit-test SpectrumList_ChargeStateCalculatorTest : >> SpectrumList_ChargeStateCalculatorTest.cpp pwiz_analysis_spectrum_processing >> ; >> unit-test SpectrumListFactoryTest : SpectrumListFactoryTest.cpp >> pwiz_analysis_spectrum_processing >> ../../data/msdata//pwiz_data_msdata_examples ; >> unit-test SpectrumList_MZWindowTest : SpectrumList_MZWindowTest.cpp >> pwiz_analysis_spectrum_processing ; >> >> Added: >> trunk/pwiz/pwiz/analysis/spectrum_processing/PrecursorMassFilter.cpp >> =================================================================== >> --- trunk/pwiz/pwiz/analysis/spectrum_processing/PrecursorMassFilter.cpp >> (rev 0) >> +++ trunk/pwiz/pwiz/analysis/spectrum_processing/PrecursorMassFilter.cpp >> 2009-10-13 18:22:55 UTC (rev 1411) >> @@ -0,0 +1,237 @@ >> +// >> +// $Id: SpectrumList_PeakFilter.cpp 1191 2009-08-14 19:33:05Z chambm $ >> +// >> +// >> +// Original author: Chris Paulse <cpaulse <a.t> systemsbiology.org> >> +// >> +// Copyright 2009 Institute for Systems Biology, Seattle, WA >> +// >> +// Licensed under the Apache License, Version 2.0 (the "License"); >> +// you may not use this file except in compliance with the License. >> +// You may obtain a copy of the License at >> +// >> +// http://www.apache.org/licenses/LICENSE-2.0 >> +// >> +// Unless required by applicable law or agreed to in writing, software >> +// distributed under the License is distributed on an "AS IS" BASIS, >> +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >> implied. >> +// See the License for the specific language governing permissions and >> +// limitations under the License. >> +// >> + >> + >> +#include "pwiz/data/msdata/MSData.hpp" >> +#include "pwiz/analysis/common/IDataFilter.hpp" >> +#include "PrecursorMassFilter.hpp" >> +#include "pwiz/utility/misc/String.hpp" >> + >> +#include "boost/foreach.hpp" >> + >> +#include <iostream> >> + >> +namespace pwiz { >> +namespace analysis { >> + >> + >> +using namespace std; >> +using namespace msdata; >> +using namespace pwiz::util; >> +using namespace pwiz::proteome; >> + >> +///TODO: this struct probably belongs in a more visible location >> +struct MassLessThan >> +{ >> + MassLessThan(const MZTolerance& tolerance_) : tolerance(tolerance_) >> + { >> + } >> + >> + bool operator () (double lhs, double rhs) >> + { >> + return lessThanTolerance(lhs, rhs, tolerance); >> + } >> + >> + const MZTolerance tolerance; >> +}; >> + >> +// Filter params class initialization >> + >> +PrecursorMassFilter::Config::Config( >> + MZTolerance tolerance, >> + bool removePrecursor_, >> + bool removeReducedChargePrecursors_, >> + bool removePossibleChargePrecursors_, >> + bool removeMostIntensePeakInWindow_, >> + bool useBlanketFiltering_, >> + int numNeutralLossSpecies, >> + char* neutralLossSpecies_[]) >> + : >> + matchingTolerance(tolerance), >> + removePrecursor(removePrecursor_), >> + removeReducedChargePrecursors(removeReducedChargePrecursors_), >> + removePossibleChargePrecursors(removePossibleChargePrecursors_), >> + removeMostIntensePeakInWindow(removeMostIntensePeakInWindow_), >> + useBlanketFiltering(useBlanketFiltering_) >> +{ >> + for (int i=0; i<numNeutralLossSpecies; i++) >> + { >> + >> neutralLossSpecies.push_back(Chemistry::Formula(neutralLossSpecies_[i])); >> + } >> +} >> + >> +void PrecursorMassFilter::describe(ProcessingMethod& method) const >> +{ >> + method.set(MS_ECD_ETD_Precursor_Mass_Filter); >> + method.userParams.push_back(UserParam("remove precursor", >> lexical_cast<string>(params.removePrecursor))); >> + method.userParams.push_back(UserParam("filter charge reduced >> precursors", lexical_cast<string>(params.removeReducedChargePrecursors))); >> + method.userParams.push_back(UserParam("remove neutral loss masses", >> lexical_cast<string>(params.neutralLossSpecies.size() > 0))); >> + method.userParams.push_back(UserParam("selective removal of >> precursors (most intense peak in tolerance window)", >> lexical_cast<string>(params.removeMostIntensePeakInWindow))); >> + method.userParams.push_back(UserParam("blanket removal of neutral >> loss masses", lexical_cast<string>(params.useBlanketFiltering))); >> + method.userParams.push_back(UserParam("matching tolerance", >> lexical_cast<string>(params.matchingTolerance))); >> +} >> + >> +void PrecursorMassFilter::operator () (const SpectrumPtr spectrum) const >> +{ >> + if (spectrum->cvParam(MS_ms_level).valueAs<int>() > 1 && >> + spectrum->cvParam(MS_MSn_spectrum).empty() == false && >> + spectrum->precursors[0].empty() == false && >> + spectrum->precursors[0].selectedIons.empty() == false && >> + spectrum->precursors[0].selectedIons[0].empty() == false) >> + { >> + vector<double>& inputMasses = spectrum->getMZArray()->data; >> + vector<double>& intensity = spectrum->getIntensityArray()->data; >> + >> + if (inputMasses.size() < 1) >> + { >> + //TODO: log encounter with empty spectrum? >> + return; >> + } >> + >> + vector<PrecursorReferenceMass> filterMassList; >> + BOOST_FOREACH(Precursor& precursor, spectrum->precursors) >> + { >> + BOOST_FOREACH(SelectedIon& selectedIon, >> precursor.selectedIons) >> + { >> + double mz = 0.; >> + vector<int> chargeStates; >> + if (selectedIon.hasCVParam(MS_m_z)) >> + { >> + mz = selectedIon.cvParam(MS_m_z).valueAs<double>(); >> + } >> + else if (selectedIon.hasCVParam(MS_selected_ion_m_z)) >> + { >> + mz = >> selectedIon.cvParam(MS_selected_ion_m_z).valueAs<double>(); >> + } >> + else >> + { >> + //TODO: log warning, unable to read precursor mz >> + //cout << "unable to read precursor mz: " << >> spectrum->index << endl; >> + } >> + >> + if (selectedIon.hasCVParam(MS_charge_state)) >> + { >> + >> chargeStates.push_back(selectedIon.cvParam(MS_charge_state).valueAs<int>()) ; >> + } >> + else >> + { >> + //TODO: log warning, unable to read precursor charge >> state >> + //cout << "unable to read precursor charge: " << >> spectrum->index << endl; >> + } >> + >> + if (params.removePossibleChargePrecursors) >> + { >> + BOOST_FOREACH(const CVParam& param, >> selectedIon.cvParams) >> + { >> + if (param.cvid == MS_possible_charge_state) >> + chargeStates.push_back(param.valueAs<int>()); >> + } >> + } >> + >> + if (params.removePrecursor) >> + { >> + >> filterMassList.push_back(PrecursorReferenceMass(PrecursorReferenceMass::ePr ecursor, >> mz, 0, params.removeMostIntensePeakInWindow)); >> + } >> + >> + if (params.removeReducedChargePrecursors) >> + { >> + BOOST_FOREACH(const int charge, chargeStates) >> + { >> + double mass = mz * charge; >> + for (int i = charge - 1; i > 0; --i) >> + { >> + double mzVal = (mass + (charge - i) * >> Chemistry::Electron) / (double) i; >> + >> filterMassList.push_back(PrecursorReferenceMass(PrecursorReferenceMass::eCh argeReducedPrecursor, >> + >> mzVal, >> + >> i, >> + >> params.removeMostIntensePeakInWindow)); >> + // ignore removeMostIntensePeakInWindow flag >> for neutral losses pending >> + // a detailed examination of whether the flag >> should be used. >> + BOOST_FOREACH(Chemistry::Formula neutralLoss, >> params.neutralLossSpecies) >> + { >> + mzVal = (mass + (charge - i) * >> Chemistry::Electron - neutralLoss.monoisotopicMass()) / (double) i; >> + >> filterMassList.push_back(PrecursorReferenceMass(PrecursorReferenceMass::eNe utralLoss, >> mzVal)); >> + } >> + } >> + } >> + } >> + } >> + } >> + >> + if (filterMassList.size() > 0) >> + { >> + //TODO: we should construct this list so that it doesn't >> require sorting. >> + sort(filterMassList.begin(), filterMassList.end(), >> ReferenceMassByMass()); >> + >> + BOOST_FOREACH(PrecursorReferenceMass mass, filterMassList) >> + { >> + MZTolerance matchingToleranceLeft = 0; >> + MZTolerance matchingToleranceRight = 0; >> + matchingToleranceLeft = matchingToleranceRight = >> params.matchingTolerance; >> + >> + if (params.useBlanketFiltering && mass.massType == >> PrecursorReferenceMass::eChargeReducedPrecursor) >> + { >> + matchingToleranceLeft = MZTolerance(60. / (double) >> mass.charge); >> + } >> + >> + // use STL's binary search algorithm to locate fragment >> ions within the mass tolerance window of the reference mass >> + // this is an O(m*log(n)) operation for all matches. >> + vector<double>::iterator lowerBound = >> lower_bound(inputMasses.begin(), inputMasses.end(), mass.mass, >> MassLessThan(matchingToleranceLeft)); >> + vector<double>::iterator upperBound = >> upper_bound(inputMasses.begin(), inputMasses.end(), mass.mass, >> MassLessThan(matchingToleranceRight)); >> + >> + int iLowerBound = lowerBound - inputMasses.begin(); >> + int iUpperBound = upperBound - inputMasses.begin(); >> + >> + if (lowerBound != inputMasses.end()) >> + { >> + if (mass.matchMostIntense) >> + { >> + if (iUpperBound - iLowerBound > 0) >> + { >> + double maxIntensity = 0; >> + int itemToDelete = iLowerBound; // >> arbitrarily default to first item in current match list >> + for (vector<double>::iterator it = >> intensity.begin() + iLowerBound; it < intensity.begin() + iUpperBound; it++) >> + { >> + if (*it > maxIntensity) >> + { >> + maxIntensity = *it; >> + itemToDelete = it - >> intensity.begin(); >> + } >> + } >> + inputMasses.erase(inputMasses.begin() + >> itemToDelete); >> + intensity.erase(intensity.begin() + >> itemToDelete); >> + } >> + } >> + else // remove all masses within the matching >> tolerance window >> + { >> + inputMasses.erase(lowerBound, upperBound); >> + intensity.erase(intensity.begin() + iLowerBound, >> intensity.begin() + iUpperBound); >> + } >> + } >> + >> + spectrum->defaultArrayLength = inputMasses.size(); >> + } >> + } >> + } >> +} >> + >> +} // namespace analysis >> +} // namespace pwiz >> >> Added: >> trunk/pwiz/pwiz/analysis/spectrum_processing/PrecursorMassFilter.hpp >> =================================================================== >> --- trunk/pwiz/pwiz/analysis/spectrum_processing/PrecursorMassFilter.hpp >> (rev 0) >> +++ trunk/pwiz/pwiz/analysis/spectrum_processing/PrecursorMassFilter.hpp >> 2009-10-13 18:22:55 UTC (rev 1411) >> @@ -0,0 +1,133 @@ >> +// >> +// $Id: SpectrumList_PeakFilter.hpp 1191 2009-08-14 19:33:05Z chambm $ >> +// >> +// >> +// Original author: Chris Paulse <cpaulse <a.t> systemsbiology.org> >> +// >> +// Copyright 2009 Institute for Systems Biology, Seattle, WA >> +// >> +// Licensed under the Apache License, Version 2.0 (the "License"); >> +// you may not use this file except in compliance with the License. >> +// You may obtain a copy of the License at >> +// >> +// http://www.apache.org/licenses/LICENSE-2.0 >> +// >> +// Unless required by applicable law or agreed to in writing, software >> +// distributed under the License is distributed on an "AS IS" BASIS, >> +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >> implied. >> +// See the License for the specific language governing permissions and >> +// limitations under the License. >> +// >> + >> + >> +#ifndef _PRECURSORMASSFILTER_HPP_ >> +#define _PRECURSORMASSFILTER_HPP_ >> + >> +#include "pwiz/analysis/peakdetect/MZTolerance.hpp" >> +#include "pwiz/utility/proteome/Chemistry.hpp" >> + >> + >> +namespace pwiz { >> +namespace analysis { >> + >> +// See Table 1 of >> +// "Post Acquisition ETD Spectral Processing of Increased Peptide >> Identifications" >> +// by D. M. Good et al >> +///TODO: locate a more complete list (Zubarev Lab) >> +static char* defaultNeutralLossFormulae[] = { >> + "N1H3", >> + "H2O1", >> + "C1O1", >> + "C1H4O1", >> + "N2H6", // 2 * NH3 >> + "H5N1O1", // Typo in original source NH3 + H2O >> + "H4O2", // 2 * H2O >> + "C1H4N2", >> + "C1H3N1O1", >> + "C1H2O2", >> + "C2H6O1", >> + "C2H5N1O1", >> + "C1H5N3", >> +}; >> + >> + >> +/** >> + * Predicted mass value for identification and removal in ETD/ECD MS2 >> spectra >> + */ >> +struct PrecursorReferenceMass >> +{ >> + enum eMassType {ePrecursor, eChargeReducedPrecursor, eNeutralLoss}; >> + >> + PrecursorReferenceMass( eMassType massType_ = >> PrecursorReferenceMass::ePrecursor, >> + double mass_ = 0.0, >> + int charge_ = 0, >> + bool matchMostIntense_ = false) >> + : massType(massType_), mass(mass_), charge(charge_), >> matchMostIntense(matchMostIntense_) {} >> + >> + eMassType massType; >> + double mass; >> + int charge; >> + /** >> + * flag used to indicate that the most intense mass within a >> tolerance window is to be identified as a unique match >> + * >> + * specifed on a per mass basis, as it may be something only >> applicable to certain mass values/types >> + */ >> + bool matchMostIntense; >> +}; >> + >> +struct ReferenceMassByMass >> +{ >> + bool operator() (const PrecursorReferenceMass& a, const >> PrecursorReferenceMass& b) >> + { >> + return a.mass < b.mass; >> + } >> +}; >> + >> +struct PrecursorMassFilter : public ISpectrumDataFilter >> +{ >> + /// PrecursorMassFilter's parameters >> + struct Config >> + { >> + Config( >> + MZTolerance tolerance = MZTolerance(0.1), >> + bool removePrecursor_ = true, >> + bool removeReducedChargePrecursors_ = true, >> + bool removePossibleChargePrecursors_ = true, >> + bool selectiveRemovalofPrecursors_ = false, >> + bool useBlanketFiltering_ = false, >> + int numNeutralLossSpecies = 13, >> + char* neutralLossSpecies_[] = >> defaultNeutralLossFormulae >> + ); >> + >> + MZTolerance matchingTolerance; >> + /// remove the precursor m/z from the MS2 spectrum >> + bool removePrecursor; >> + /** electron transfer in ETD or ECD creates intact precursors >> with reduced charge states >> + * this flag specifies their removal. */ >> + bool removeReducedChargePrecursors; >> + /** intact precursors can undergo loss of neutral molecules after >> the dissociation event >> + * this flag specifies the removal of these "neutral loss" ions >> (precursor mass - neutral loss mass)/charge */ >> + std::vector<pwiz::proteome::Chemistry::Formula> >> neutralLossSpecies; >> + /** in cases where the precursor charge is indeterminate, but >> defined as being one of a series of values, >> + * we use the following flag to remove precursors for all >> hypothetical values of the parent charge */ >> + bool removePossibleChargePrecursors; >> + /** since precursors and charge reduced precursors are prominent >> features in an etd ms2 spectrum, an option >> + * permits removal of only the most intense peak within a given >> matching tolerance. The flag is ignored >> + * currently for neutral loss masses */ >> + bool removeMostIntensePeakInWindow; >> + /// flag indicates neutral loss removal by applying a charge >> scaled 60 Da exclusion window below the charge reduced precursor >> + bool useBlanketFiltering; >> + }; >> + >> + PrecursorMassFilter(const PrecursorMassFilter::Config& params_) : >> params(params_) {} >> + virtual void operator () (const pwiz::msdata::SpectrumPtr) const; >> + virtual void describe(pwiz::msdata::ProcessingMethod&) const; >> + >> + const PrecursorMassFilter::Config params; >> +}; >> + >> +} // namespace analysis >> +} // namespace pwiz >> + >> + >> +#endif // _PRECURSORMASSFILTER_HPP_ >> >> Modified: >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumListFactory.cpp >> =================================================================== >> --- trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumListFactory.cpp >> 2009-10-12 22:31:59 UTC (rev 1410) >> +++ trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumListFactory.cpp >> 2009-10-13 18:22:55 UTC (rev 1411) >> @@ -25,10 +25,11 @@ >> #include "pwiz/analysis/spectrum_processing/SpectrumList_Filter.hpp" >> #include "pwiz/analysis/spectrum_processing/SpectrumList_PeakPicker.hpp" >> #include "pwiz/analysis/spectrum_processing/SpectrumList_Smoother.hpp" >> -#include "pwiz/analysis/spectrum_processing/SpectrumList_Thresholder.hpp" >> +#include "pwiz/analysis/spectrum_processing/SpectrumList_PeakFilter.hpp" >> #include >> "pwiz/analysis/spectrum_processing/SpectrumList_ChargeStateCalculator.hpp" >> #include >> "pwiz/analysis/spectrum_processing/SpectrumList_PrecursorRecalculator.hpp" >> #include "pwiz/analysis/spectrum_processing/SpectrumList_MZWindow.hpp" >> +#include "pwiz/analysis/spectrum_processing/PrecursorMassFilter.hpp" >> #include "pwiz/data/msdata/SpectrumInfo.hpp" >> #include <iostream> >> >> @@ -126,7 +127,51 @@ >> msLevelsToCentroid)); >> } >> >> +SpectrumListPtr filterCreator_ETDFilter(const MSData& msd, const string& >> arg) >> +{ >> + istringstream parser(arg); >> >> + string removeMS1; >> + parser >> removeMS1; >> + bool bRemoveMS1 = removeMS1 == "false" ? false : true; >> + string removePrecursor; >> + parser >> removePrecursor; >> + bool bRemPrecursor = removePrecursor == "false" ? false : true; >> + string removeChargeReduced; >> + parser >> removeChargeReduced; >> + bool bRemChgRed = removeChargeReduced == "false" ? false : true; >> + string removeNeutralLoss; >> + parser >> removeNeutralLoss; >> + bool bRemNeutralLoss = removeNeutralLoss == "false" ? false : true; >> + string selectiveRemoval; >> + parser >> selectiveRemoval; >> + bool bSelectiveRemoval = selectiveRemoval == "false" ? false : true; >> + string useBlanketFiltering; >> + parser >> useBlanketFiltering; >> + bool bUseBlanketFiltering = useBlanketFiltering == "false" ? false >> : true; >> + >> + MZTolerance mzt; >> + parser >> mzt; >> + >> + PrecursorMassFilter::Config params(mzt, bRemPrecursor, bRemChgRed, >> bRemNeutralLoss, bSelectiveRemoval, bUseBlanketFiltering); >> + PrecursorMassFilter* filter = new PrecursorMassFilter(params); >> + >> + if (bRemoveMS1 == false) >> + { >> + return SpectrumListPtr(new >> + SpectrumList_PeakFilter(msd.run.spectrumListPtr, >> + filter)); >> + } >> + else >> + { >> + return SpectrumListPtr(new >> + SpectrumList_PeakFilter( >> + SpectrumListPtr(new >> SpectrumList_Filter(msd.run.spectrumListPtr, >> + >> SpectrumList_FilterPredicate_MSLevelSet(IntegerSet(2)))), >> + filter)); >> + } >> +} >> + >> struct StripIonTrapSurveyScans : public SpectrumList_Filter::Predicate >> { >> virtual boost::logic::tribool accept(const SpectrumIdentity& >> spectrumIdentity) const >> @@ -196,6 +241,7 @@ >> {"msLevel", "int_set", filterCreator_msLevel}, >> {"mzWindow", "[mzLow,mzHigh]", filterCreator_mzWindow}, >> {"peakPicking", "prefer_vendor:<true|false> int_set(MS levels)", >> filterCreator_nativeCentroid}, >> + {"ETDFilter", "removeMS2:<true|false> removePrecursor:<true|false> >> removeChargeReduced:<true|false> removeNeutralLoss:<true|false> >> mostIntenseInWindow:<true|false> blanketRemoval<true|false> >> MatchingTolerance:(val <PPM|MZ>)", filterCreator_ETDFilter}, >> {"precursorRecalculation", " (based on ms1 data)", >> filterCreator_precursorRecalculation}, >> {"scanNumber", "int_set", filterCreator_scanNumber}, >> {"scanEvent", "int_set", filterCreator_scanEvent}, >> >> Added: >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumList_PeakFilterTest.cpp >> =================================================================== >> --- >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumList_PeakFilterTest.cpp >> (rev 0) >> +++ >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumList_PeakFilterTest.cpp >> 2009-10-13 18:22:55 UTC (rev 1411) >> @@ -0,0 +1,350 @@ >> +// >> +// $Id: SpectrumList_ThresholderTest.cpp 1191 2009-08-14 19:33:05Z chambm >> $ >> +// >> +// >> +// Original author: Matt Chambers <matt.chambers <a.t> vanderbilt.edu> >> +// >> +// Copyright 2008 Vanderbilt University - Nashville, TN 37232 >> +// >> +// Licensed under the Apache License, Version 2.0 (the "License"); >> +// you may not use this file except in compliance with the License. >> +// You may obtain a copy of the License at >> +// >> +// http://www.apache.org/licenses/LICENSE-2.0 >> +// >> +// Unless required by applicable law or agreed to in writing, software >> +// distributed under the License is distributed on an "AS IS" BASIS, >> +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >> implied. >> +// See the License for the specific language governing permissions and >> +// limitations under the License. >> +// >> + >> +#include "pwiz/data/msdata/MSData.hpp" >> +#include "pwiz/analysis/common/IDataFilter.hpp" >> +#include "PrecursorMassFilter.hpp" >> +#include "ThresholdFilter.hpp" >> +#include "SpectrumList_PeakFilter.hpp" >> +#include "pwiz/utility/misc/unit.hpp" >> +#include <vector> >> +#include <iostream> >> +#include <iterator> >> +#include "pwiz/data/msdata/examples.hpp" >> +#include "pwiz/data/msdata/TextWriter.hpp" >> +#include "pwiz/utility/misc/String.hpp" >> + >> + >> +using namespace std; >> +using namespace pwiz::util; >> +using namespace pwiz; >> +using namespace pwiz::msdata; >> +using namespace pwiz::analysis; >> + >> +ostream* os_ = 0; >> + >> +ostream& operator<< (ostream& os, const vector<double>& v) >> +{ >> + os << "("; >> + for (size_t i=0; i < v.size(); ++i) >> + os << " " << v[i]; >> + os << " )"; >> + return os; >> +} >> + >> +vector<double> parseDoubleArray(const string& doubleArray) >> +{ >> + vector<double> doubleVector; >> + vector<string> tokens; >> + bal::split(tokens, doubleArray, bal::is_space()); >> + if (!tokens.empty() && !tokens[0].empty()) >> + for (size_t i=0; i < tokens.size(); ++i) >> + doubleVector.push_back(lexical_cast<double>(tokens[i])); >> + return doubleVector; >> +} >> + >> + >> +struct TestETDMassFilter >> +{ >> + // space-delimited doubles >> + const char* inputMZArray; >> + const char* inputIntensityArray; >> + const char* outputMZArray; >> + const char* outputIntensityArray; >> + >> + double matchingTolerance; >> + bool usePPM; >> + bool removePrecursor; >> + bool removeReducedChargePrecursors; >> + bool removeNeutralLossPrecursors; >> + bool selectiveRemovalofPrecursors; >> + bool blanketRemovalofNeutralLoss; >> +}; >> + >> +#define PRECURSOR_CHARGE 2 >> +#define PRECURSOR_MASS 445.34 >> + >> +TestETDMassFilter testETDMassFilterData[] = >> +{ >> + { >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 445.34 831.632 844.674 845.659 >> 846.643 854.659 855.643 856.627 858.654 862.685 872.669 873.653 890.68 >> 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 >> 190 200 210 220 230 240 250 260 270 280", >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 445.34 831.632 844.674 845.659 >> 846.643 854.659 855.643 856.627 858.654 862.685 872.669 873.653 890.68 >> 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 >> 190 200 210 220 230 240 250 260 270 280", >> + 0.1234, false, false, false, false, false, false >> + }, // do nothing >> + >> + { >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 445.34 445.35 831.632 844.674 >> 845.659 846.643 854.659 855.643 856.627 858.654 862.685 872.669 873.653 >> 890.68 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 >> 190 200 210 220 230 240 250 260 270 280 290", >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 831.632 844.674 845.659 846.643 >> 854.659 855.643 856.627 858.654 862.685 872.669 873.653 890.68 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 170 180 190 200 >> 210 220 230 240 250 260 270 280 290", >> + 0.1234, false, true, false, false, false, false >> + }, // remove precursor only >> + >> + { >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 445.34 831.632 844.674 845.659 >> 846.643 854.659 855.643 856.627 858.654 862.685 872.669 873.653 890.68 >> 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 >> 190 200 210 220 230 240 250 260 270 280", >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 445.34 831.632 844.674 845.659 >> 846.643 854.659 855.643 856.627 858.654 862.685 872.669 873.653 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 >> 190 200 210 220 230 240 250 260 280", >> + 0.1234, false, false, true, false, false, false >> + }, // remove charge reduced precursors only >> + >> + { >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 445.34 831.632 844.674 845.659 >> 846.643 854.659 855.643 856.627 858.654 862.685 872.669 873.653 890.68 >> 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 >> 190 200 210 220 230 240 250 260 270 280", >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 831.632 844.674 845.659 846.643 >> 854.659 855.643 856.627 858.654 862.685 872.669 873.653 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 160 170 180 190 >> 200 210 220 230 240 250 260 280", >> + 0.1234, false, true, true, false, false, false >> + }, // remove precursor and charge reduced precursors >> + >> + { >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 445.34 831.632 844.674 845.659 >> 846.643 854.659 855.643 856.627 858.654 862.685 872.669 873.653 890.68 >> 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 >> 190 200 210 220 230 240 250 260 270 280", >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 280", >> + 0.1234, false, true, true, true, false, false >> + }, // remove precursor charge reduced precursors, and neutral losses >> + >> + { >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 445.34 445.35 831.632 844.674 >> 845.659 846.643 854.659 855.643 856.627 858.654 862.685 872.669 873.653 >> 890.68 890.69 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 15000 150 160 170 >> 180 190 200 210 220 230 240 250 260 2700 280 290", >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 445.35 890.69 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 280 290", >> + 0.3, false, true, true, true, true, false >> + }, // remove precursor charge reduced precursors, and neutral losses >> -- most intense peak near precursor and charge reduced >> + >> + { >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 445.34 445.35 831.632 844.674 >> 845.659 846.643 854.659 855.643 856.627 858.654 862.685 872.669 873.653 >> 890.68 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 15000 150 160 170 >> 180 190 200 210 220 230 240 250 260 270 280", >> + "100 110 120 130 415.8215 422.337 422.8295 423.3215 427.3295 >> 427.8215 428.3135 429.327 431.3425 436.3345 1000.0", >> + "10 20 30 40 50 60 70 80 90 100 110 120 130 140 280", >> + 1.0, false, true, true, true, false, true >> + }, // remove precursor charge reduced precursors, and neutral losses >> -- blanket removal of neutral losses (60 Da window) >> + >> +}; >> + >> +const size_t testETDMassFilterDataSize = sizeof(testETDMassFilterData) / >> sizeof(TestETDMassFilter); >> + >> +void testMassRemoval() >> +{ >> + for (size_t i=0; i < testETDMassFilterDataSize; ++i) >> + { >> + SpectrumListSimple* sl = new SpectrumListSimple; >> + SpectrumListPtr originalList(sl); >> + SpectrumPtr s(new Spectrum); >> + sl->spectra.push_back(s); >> + >> + TestETDMassFilter& t = testETDMassFilterData[i]; >> + >> + vector<double> inputMZArray = parseDoubleArray(t.inputMZArray); >> + vector<double> inputIntensityArray = >> parseDoubleArray(t.inputIntensityArray); >> + s->set(MS_MSn_spectrum); >> + s->set(MS_ms_level, 2); >> + >> + s->setMZIntensityArrays(inputMZArray, inputIntensityArray, >> MS_number_of_counts); >> + s->precursors.resize(1); >> + s->precursors[0].selectedIons.resize(1); >> + s->precursors[0].selectedIons[0].set(MS_selected_ion_m_z, >> PRECURSOR_MASS, MS_m_z); >> + s->precursors[0].selectedIons[0].set(MS_charge_state, >> PRECURSOR_CHARGE); >> + >> + MZTolerance tol(t.matchingTolerance, t.usePPM ? MZTolerance::PPM >> : MZTolerance::MZ); >> + PrecursorMassFilter* filter = 0; >> + if (t.removeNeutralLossPrecursors) >> + { >> + PrecursorMassFilter::Config params(tol, t.removePrecursor, >> t.removeReducedChargePrecursors, true, t.selectiveRemovalofPrecursors, >> t.blanketRemovalofNeutralLoss); >> + filter = new PrecursorMassFilter(params); >> + } >> + else >> + { >> + PrecursorMassFilter::Config params(tol, t.removePrecursor, >> t.removeReducedChargePrecursors, true, t.selectiveRemovalofPrecursors, >> t.blanketRemovalofNeutralLoss, 0); >> + filter = new PrecursorMassFilter(params); >> + } >> + SpectrumListPtr peakFilter( >> + new SpectrumList_PeakFilter(originalList, filter)); >> + >> + SpectrumPtr pFiltered = peakFilter->spectrum(0, true); >> + >> + vector<double> outputMZArray = parseDoubleArray(t.outputMZArray); >> + vector<double> outputIntensityArray = >> parseDoubleArray(t.outputIntensityArray); >> + >> + unit_assert(pFiltered->getMZArray()->data.size() == >> outputMZArray.size()); >> + unit_assert(pFiltered->getIntensityArray()->data.size() == >> outputIntensityArray.size()); >> + for (size_t ii=0; ii < outputMZArray.size(); ++ii) >> + { >> + unit_assert_equal(pFiltered->getMZArray()->data[ii], >> outputMZArray[ii], 0.001); >> + unit_assert_equal(pFiltered->getIntensityArray()->data[ii], >> outputIntensityArray[ii], 0.001); >> + } >> + } >> +} >> + >> +struct TestThresholder >> +{ >> + // space-delimited doubles >> + const char* inputMZArray; >> + const char* inputIntensityArray; >> + const char* outputMZArray; >> + const char* outputIntensityArray; >> + >> + ThresholdingParams::ThresholdingBy_Type byType; >> + double threshold; >> + ThresholdingParams::ThresholdingOrientation orientation; >> +}; >> + >> +TestThresholder testThresholders[] = >> +{ >> + // absolute thresholding, keeping the most intense points >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 3 4 5", "10 20 30 20 10", >> ThresholdingParams::ThresholdingBy_AbsoluteIntensity, 5, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "2 3 4", "20 30 20", >> ThresholdingParams::ThresholdingBy_AbsoluteIntensity, 10, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "2 3 4", "20 30 20", >> ThresholdingParams::ThresholdingBy_AbsoluteIntensity, 15, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "", "", >> ThresholdingParams::ThresholdingBy_AbsoluteIntensity, 30, >> ThresholdingParams::Orientation_MostIntense }, >> + >> + // absolute thresholding, keeping the least intense points >> + { "1 2 3 4 5", "10 20 30 20 10", "", "", >> ThresholdingParams::ThresholdingBy_AbsoluteIntensity, 5, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "", "", >> ThresholdingParams::ThresholdingBy_AbsoluteIntensity, 10, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 5", "10 10", >> ThresholdingParams::ThresholdingBy_AbsoluteIntensity, 15, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 4 5", "10 20 20 10", >> ThresholdingParams::ThresholdingBy_AbsoluteIntensity, 30, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 3 4 5", "10 20 30 20 10", >> ThresholdingParams::ThresholdingBy_AbsoluteIntensity, 50, >> ThresholdingParams::Orientation_LeastIntense }, >> + >> + // relative thresholding to the base peak, keeping the most intense >> peaks >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 3 4 5", "10 20 30 20 10", >> ThresholdingParams::ThresholdingBy_FractionOfBasePeakIntensity, 0.1, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "2 3 4", "20 30 20", >> ThresholdingParams::ThresholdingBy_FractionOfBasePeakIntensity, 0.34, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "2 3 4", "20 30 20", >> ThresholdingParams::ThresholdingBy_FractionOfBasePeakIntensity, 0.65, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "3", "30", >> ThresholdingParams::ThresholdingBy_FractionOfBasePeakIntensity, 0.67, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "", "", >> ThresholdingParams::ThresholdingBy_FractionOfBasePeakIntensity, 1.0, >> ThresholdingParams::Orientation_MostIntense }, >> + >> + // relative thresholding to the base peak, keeping the least intense >> peaks >> + { "1 2 3 4 5", "10 20 30 20 10", "", "", >> ThresholdingParams::ThresholdingBy_FractionOfBasePeakIntensity, 0.1, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "", "", >> ThresholdingParams::ThresholdingBy_FractionOfBasePeakIntensity, 0.32, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 5", "10 10", >> ThresholdingParams::ThresholdingBy_FractionOfBasePeakIntensity, 0.34, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 4 5", "10 20 20 10", >> ThresholdingParams::ThresholdingBy_FractionOfBasePeakIntensity, 0.67, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 4 5", "10 20 20 10", >> ThresholdingParams::ThresholdingBy_FractionOfBasePeakIntensity, 1.0, >> ThresholdingParams::Orientation_LeastIntense }, >> + >> + // relative thresholding to total intensity, keeping the most intense >> peaks >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 3 4 5", "10 20 30 20 10", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensity, 0.1, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "2 3 4", "20 30 20", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensity, 0.12, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "2 3 4", "20 30 20", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensity, 0.21, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "3", "30", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensity, 0.23, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "", "", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensity, 0.34, >> ThresholdingParams::Orientation_MostIntense }, >> + >> + // relative thresholding to total intensity, keeping the least >> intense peaks >> + { "1 2 3 4 5", "10 20 30 20 10", "", "", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensity, 0.1, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 5", "10 10", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensity, 0.12, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 5", "10 10", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensity, 0.21, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 4 5", "10 20 20 10", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensity, 0.23, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 3 4 5", "10 20 30 20 10", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensity, 0.34, >> ThresholdingParams::Orientation_LeastIntense }, >> + >> + // threshold against cumulative total intensity fraction, keeping the >> most intense peaks >> + { "1 2 3 4 5", "10 20 30 20 10", "", "", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensityCutoff, 0.32, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "3", "30", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensityCutoff, 0.34, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "3", "30", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensityCutoff, 0.76, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "2 3 4", "20 30 20", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensityCutoff, 0.78, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 3 4 5", "10 20 30 20 10", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensityCutoff, 1.0, >> ThresholdingParams::Orientation_MostIntense }, >> + >> + // threshold against cumulative total intensity fraction, keeping the >> least intense peaks >> + { "1 2 3 4 5", "10 20 30 20 10", "", "", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensityCutoff, 0.21, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 5", "10 10", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensityCutoff, 0.23, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 5", "10 10", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensityCutoff, 0.65, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 4 5", "10 20 20 10", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensityCutoff, 0.67, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 3 4 5", "10 20 30 20 10", >> ThresholdingParams::ThresholdingBy_FractionOfTotalIntensityCutoff, 1.0, >> ThresholdingParams::Orientation_LeastIntense }, >> + >> + // keep the <threshold> most intense points, excluding ties >> + { "1 2 3 4 5", "10 20 30 20 10", "3", "30", >> ThresholdingParams::ThresholdingBy_Count, 1, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "3", "30", >> ThresholdingParams::ThresholdingBy_Count, 2, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "2 3 4", "20 30 20", >> ThresholdingParams::ThresholdingBy_Count, 3, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "2 3 4", "20 30 20", >> ThresholdingParams::ThresholdingBy_Count, 4, >> ThresholdingParams::Orientation_MostIntense }, >> + >> + // keep the <threshold> least intense points, excluding ties >> + { "1 2 3 4 5", "10 20 30 20 10", "", "", >> ThresholdingParams::ThresholdingBy_Count, 1, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 5", "10 10", >> ThresholdingParams::ThresholdingBy_Count, 2, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 5", "10 10", >> ThresholdingParams::ThresholdingBy_Count, 3, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 4 5", "10 20 20 10", >> ThresholdingParams::ThresholdingBy_Count, 4, >> ThresholdingParams::Orientation_LeastIntense }, >> + >> + // keep the <threshold> most intense points, including ties >> + { "1 2 3 4 5", "10 20 30 20 10", "3", "30", >> ThresholdingParams::ThresholdingBy_CountAfterTies, 1, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "2 3 4", "20 30 20", >> ThresholdingParams::ThresholdingBy_CountAfterTies, 2, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "2 3 4", "20 30 20", >> ThresholdingParams::ThresholdingBy_CountAfterTies, 3, >> ThresholdingParams::Orientation_MostIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 3 4 5", "10 20 30 20 10", >> ThresholdingParams::ThresholdingBy_CountAfterTies, 4, >> ThresholdingParams::Orientation_MostIntense }, >> + >> + // keep the <threshold> least intense points, including ties >> + { "1 2 3 4 5", "10 20 30 20 10", "1 5", "10 10", >> ThresholdingParams::ThresholdingBy_CountAfterTies, 1, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 5", "10 10", >> ThresholdingParams::ThresholdingBy_CountAfterTies, 2, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 4 5", "10 20 20 10", >> ThresholdingParams::ThresholdingBy_CountAfterTies, 3, >> ThresholdingParams::Orientation_LeastIntense }, >> + { "1 2 3 4 5", "10 20 30 20 10", "1 2 4 5", "10 20 20 10", >> ThresholdingParams::ThresholdingBy_CountAfterTies, 4, >> ThresholdingParams::Orientation_LeastIntense } >> +}; >> + >> +const size_t testThresholdersSize = sizeof(testThresholders) / >> sizeof(TestThresholder); >> + >> +void testIntensityThresholding() >> +{ >> + for (size_t i=0; i < testThresholdersSize; ++i) >> + { >> + >> + SpectrumListSimple* sl = new SpectrumListSimple; >> + SpectrumListPtr originalList(sl); >> + SpectrumPtr s(new Spectrum); >> + sl->spectra.push_back(s); >> + >> + TestThresholder& t = testThresholders[i]; >> + >> + vector<double> inputMZArray = parseDoubleArray(t.inputMZArray); >> + vector<double> inputIntensityArray = >> parseDoubleArray(t.inputIntensityArray); >> + s->setMZIntensityArrays(inputMZArray, inputIntensityArray, >> MS_number_of_counts); >> + >> + ThresholdingFilter* pFilter = new >> ThresholdingFilter(ThresholdingParams(t.byType, t.threshold, >> t.orientation)); >> + SpectrumListPtr thresholder( >> + new SpectrumList_PeakFilter(originalList, pFilter)); >> + >> + vector<double> outputMZArray = parseDoubleArray(t.outputMZArray); >> + vector<double> outputIntensityArray = >> parseDoubleArray(t.outputIntensityArray); >> + >> + SpectrumPtr thresholdedSpectrum = thresholder->spectrum(0, true); >> + //if (os_) cout << s1->defaultArrayLength << ": " << >> s1->getMZArray()->data << " " << s1->getIntensityArray()->data << endl; >> + unit_assert(thresholdedSpectrum->defaultArrayLength == >> outputMZArray.size()); >> + for (size_t i=0; i < outputMZArray.size(); ++i) >> + { >> + unit_assert(thresholdedSpectrum->getMZArray()->data[i] == >> outputMZArray[i]); >> + unit_assert(thresholdedSpectrum->getIntensityArray()->data[i] >> == outputIntensityArray[i]); >> + } >> + } >> +} >> + >> +void test() >> +{ >> + testIntensityThresholding(); >> + testMassRemoval(); >> +} >> + >> +int main(int argc, char* argv[]) >> +{ >> + try >> + { >> + if (argc>1 && !strcmp(argv[1],"-v")) os_ = &cout; >> + test(); >> + return 0; >> + } >> + catch (exception& e) >> + { >> + cerr << e.what() << endl; >> + } >> + >> + return 1; >> +} >> >> Deleted: >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumList_Thresholder.cpp >> =================================================================== >> --- >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumList_Thresholder.cpp >> 2009-10-12 22:31:59 UTC (rev 1410) >> +++ >> trunk/pwiz/pwiz/analysis/spectrum_processing/SpectrumList_Thresholder.cpp >> 2009-10-13 18:22:55 UTC (rev 1411) >> @@ -1,313 +0,0 @@ >> -// >> -// $Id$ >> -// >> -// >> -// Original author: Matt Chambers <matt.chambers <a.t> vanderbilt.edu> >> -// >> -// Copyright 2008 Vanderbilt University - Nashville, TN 37232 >> -// >> -// Licensed under the Apache License, Version 2.0 (the "License"); >> -// you may not use this file except in compliance with the License. >> -// You may obtain a copy of the License at >> -// >> -// http://www.apache.org/licenses/LICENSE-2.0 >> -// >> -// Unless required by applicable law or agreed to in writing, software >> -// distributed under the License is distributed on an "AS IS" BASIS, >> -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >> implied. >> -// See the License for the specific language governing permissions and >> -// limitations under the License. >> -// >> - >> - >> -#define PWIZ_SOURCE >> - >> - >> -#include "SpectrumList_Thresholder.hpp" >> -#include "pwiz/utility/misc/Container.hpp" >> -#include "pwiz/utility/misc/String.hpp" >> -#include "pwiz/utility/math/round.hpp" >> -#include <iterator> >> -#include <numeric> >> - >> - >> -// workaround for MSVC's ADL gimpiness >> -namespace std >> -{ >> - bool operator< (const pwiz::msdata::MZIntensityPair& lhs, const >> pwiz::msdata::MZIntensityPair& rhs) >> - { >> - return lhs.intensity < rhs.intensity; >> - } >> - >> - bool operator> (const pwiz::msdata::MZIntensityPair& lhs, const >> pwiz::msdata::MZIntensityPair& rhs) >> - { >> - return lhs.intensity > rhs.intensity; >> - } >> - >> - struct MZIntensityPairSortByMZ >> - { >> - bool operator() (const pwiz::msdata::MZIntensityPair& lhs, const >> pwiz::msdata::MZIntensityPair& rhs) const >> - { >> - return lhs.mz < rhs.mz; >> - } >> - }; >> - >> - struct MZIntensityPairIntensitySum >> - { >> - double operator() (double lhs, const >> pwiz::msdata::MZIntensityPair& rhs) >> - { >> - return lhs + rhs.intensity; >> - } >> - }; >> - >> - struct MZIntensityPairIntensityFractionLessThan >> - { >> - MZIntensityPairIntensityFractionLessThan(double denominator) >> - : denominator_(denominator) >> - { >> - } >> - >> - bool operator() (const pwiz::msdata::MZIntensityPair& lhs, const >> pwiz::msdata::MZIntensityPair& rhs) >> - { >> - return (lhs.intensity / denominator_) < (rhs.intensity / >> denominator_); >> - } >> - >> - private: >> - double denominator_; >> - }; >> - >> - struct MZIntensityPairIntensityFractionGreaterThan >> - { >> - MZIntensityPairIntensityFractionGreaterThan(double denominator) >> - : denominator_(denominator) >> - { >> - } >> - >> - bool operator() (const pwiz::msdata::MZIntensityPair& lhs, const >> pwiz::msdata::MZIntensityPair& rhs) >> - { >> - return (lhs.intensity / denominator_) > (rhs.intensity / >> denominator_); >> - } >> - >> - private: >> - double denominator_; >> - }; >> -} >> - >> - >> -namespace pwiz { >> -namespace analysis { >> - >> - >> -using namespace std; >> -using namespace msdata; >> -using namespace pwiz::util; >> - >> - >> -namespace >> -{ >> - const char* byTypeMostIntenseName[] = {"most intense count (excluding >> ties at the threshold)", >> - "most intense count (including >> ties at the threshold)", >> - "absolute intensity greater >> than", >> - "with greater intensity >> relative to BPI", >> - "with greater intensity >> relative to TIC", >> - "most intense TIC cutoff"}; >> - >> - const char* byTypeLeastIntenseName[] = {"least intense count >> (excluding ties at the threshold)", >> - "least intense count >> (including ties at the threshold)", >> - "absolute intensity less >> than", >> - "with less intensity relative >> to BPI", >> - "with less intensity relative >> to TIC", >> - "least intense TIC cutoff"}; >> - >> - void threshold(const SpectrumPtr s, >> - ThresholdingBy_Type byType, >> - double threshold, >> - ThresholdingOrientation orientation) >> - { >> - if (byType == ThresholdingBy_Count || >> - byType == ThresholdingBy_CountAfterTies) >> - { >> - // if count threshold is greater than number of data points, >> return as is >> - if (s->defaultArrayLength <= threshold) >> - return;... [truncated message content] |