MassDistribution multiply(const MassDistribution& m, const MassDistribution& n) { MassDistribution result; for (MassDistribution::const_iterator i=m.begin(); i!=m.end(); ++i) for (MassDistribution::const_iterator j=n.begin(); j!=n.end(); ++j) result.push_back(MassAbundance(i->mass + j->mass, i->abundance * j->abundance)); return result; }
void printEnvelope(const MassDistribution& md, int charge) { using namespace pwiz::calibration; // for Ion for (MassDistribution::const_iterator it=md.begin(); it!=md.end(); ++it) { if (it->abundance < .0001) continue; cout << Ion::mz(it->mass, charge) << " " << it->abundance << endl; } }
void calculateIsotopeEnvelope(const PepDatum& peptide) { using namespace Peptide; const string& name = peptide.first; const Peptide::Formula f = peptide.second; cout << name << endl << endl; MassDistribution c = calculateDistributionFor2Isotopes(isotopes[C], f[C]); cout << "C envelope:\n"; copy(c.begin(), c.end(), ostream_iterator<MassAbundance>(cout, "\n")); cout << endl; MassDistribution n = calculateDistributionFor2Isotopes(isotopes[N], f[N]); cout << "N envelope:\n"; copy(n.begin(), n.end(), ostream_iterator<MassAbundance>(cout, "\n")); cout << endl; // calculate product of C and N envelopes MassDistribution cn = multiply(c,n); sort(cn.begin(), cn.end(), isMoreAbundant); cout << "C*N envelope:\n"; copy(cn.begin(), cn.begin()+5, ostream_iterator<MassAbundance>(cout, "\n")); cout << endl; // hack to add back in H, O, S Peptide::Formula hack(0, f[H], 0, f[O], f[S]); double hackMass = hack.monoisotopicMass(); for (MassDistribution::iterator it=cn.begin(); it!=cn.end(); ++it) it->mass += hackMass; // print envelopes by charge state for (int i=1; i<5; i++) { cout << "charge state " << i << endl; printEnvelope(cn, i); cout << endl; } }
void testNormalization(const IsotopeCalculator& calc) { if (os_) *os_ << "mass normalized:\n" << calc.distribution(Formula("C100"), 0, IsotopeCalculator::NormalizeMass) << endl; if (os_) *os_ << "abundance normalized:\n" << calc.distribution(Formula("C100"), 0, IsotopeCalculator::NormalizeAbundance) << endl; MassDistribution md = calc.distribution(Formula("C100"), 0, IsotopeCalculator::NormalizeMass | IsotopeCalculator::NormalizeAbundance); if (os_) *os_ << "both normalized:\n" << md << endl; double sumSquares = 0; for (MassDistribution::iterator it=md.begin(); it!=md.end(); ++it) sumSquares += it->abundance * it->abundance; if (os_) *os_ << "sumSquares: " << sumSquares << endl; unit_assert_equal(sumSquares, 1, 1e-12); unit_assert(md[0].mass == 0); }
void test() { using namespace Peptide; cout.precision(12); initializeIsotopes(); for (Element e=ElementBegin; e!=ElementEnd; ++e) { cout << e << ":\n"; copy(isotopes[e].begin(), isotopes[e].end(), ostream_iterator<MassAbundance>(cout, "\n")); } cout << endl; for (Element e=ElementBegin; e!=ElementEnd; ++e) { if (isotopes[e].size() != 2) continue; MassDistribution test = calculateDistributionFor2Isotopes(isotopes[e], 100); cout << e << ":\n"; copy(test.begin(), test.end(), ostream_iterator<MassAbundance>(cout, "\n")); cout << endl; } }