示例#1
0
MassDistribution calculateDistributionFor2Isotopes(const MassDistribution& isotopeDistribution, int atomCount)
{
    MassDistribution result;

    if (isotopeDistribution.size() != 2)
        throw runtime_error("only implemented for 2 isotopes");

    double m0 = isotopeDistribution[0].mass;
    double p0 = isotopeDistribution[0].abundance;
    double m1 = isotopeDistribution[1].mass;
    double p1 = isotopeDistribution[1].abundance;

    double mass = m0 * atomCount;
    double abundance = pow(p0, atomCount);

    //for (int i=0; i<=atomCount; i++)
    for (int i=0; i<=4; i++)
    {
        result.push_back(MassAbundance(mass, abundance));
        mass += (m1-m0);
        abundance *= p1/p0*(atomCount-i)/(i+1);
    }

    return result;
}
示例#2
0
void test4()
{
    const double p0 = .9;
    const double p1 = .09;
    const double p2 = .009;
    const double p3 = 1 - (p0 + p1 + p2);

    const double m0 = 10;
    const double m1 = 11;
    const double m2 = 12.33;
    const double m3 = 13.13;

    MassDistribution md;
    md.push_back(MassAbundance(m0, p0));
    md.push_back(MassAbundance(m1, p1));
    md.push_back(MassAbundance(m2, p2));
    md.push_back(MassAbundance(m3, p3));

    cout << "test4 distribution:\n" << md << endl;

    IsotopeTable table(md, 10, 1e-5);

    compare(md, table.distribution(1));

    MassDistribution test4_2 = table.distribution(2);

    cout << "2 atoms:\n" << test4_2 << endl;
}
示例#3
0
void compare(const MassDistribution& test, const MassDistribution& good)
{
    unit_assert(test.size() == good.size()); 
    for (unsigned int i=0; i<test.size(); i++)
    {
        unit_assert_equal(test[i].mass, good[i].mass, 1e-12);
        unit_assert_equal(test[i].abundance, good[i].abundance, 1e-12);
    }
}
示例#4
0
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;
    }
}
示例#5
0
void test2()
{
    const double p0 = .9;
    const double p1 = 1 - p0;

    MassDistribution md;
    md.push_back(MassAbundance(10, p0));
    md.push_back(MassAbundance(11, p1));

    IsotopeTable table(md, 10, 0);

/*
    for (int i=0; i<=10; i++)
        cout << i << " atoms:\n" << table.distribution(i) << endl;
*/

    // test manually for 1 atom

    MassDistribution test1 = table.distribution(1);
    unit_assert(test1.size() == 2);
    unit_assert(test1[0] == md[0]); 
    unit_assert(test1[1] == md[1]); 

    // test manually for 10 atoms
    
    const int n = 10;
    MassDistribution good10; 
    double abundance = pow(p0, n);
    double mass = 100;

    for (int k=0; k<=n; k++)
    {
        good10.push_back(MassAbundance(mass, abundance));
        abundance *= p1/p0*(n-k)/(k+1);
        mass += 1;
    }

    sort(good10.begin(), good10.end(), hasGreaterAbundance);

    MassDistribution test10 = table.distribution(10);
    sort(test10.begin(), test10.end(), hasGreaterAbundance);

    unit_assert((int)test10.size() == n+1); 

    for (int k=0; k<=n; k++)
        unit_assert_equal(test10[k].abundance, good10[k].abundance, 1e-15);

    // test cutoff
    
    IsotopeTable table_cutoff(md, 10, 1e-8);
    unit_assert(table_cutoff.distribution(10).size() == 9);
}
示例#6
0
void test1()
{
    MassDistribution md;
    md.push_back(MassAbundance(10, 1));

    IsotopeTable table(md, 10, 0);

    for (int i=1; i<=10; i++)
    {
        MassDistribution temp = table.distribution(i);
        unit_assert(temp.size() == 1);
        unit_assert(temp[0] == MassAbundance(i*10, 1));
        //cout << i << " atoms:\n" << temp << endl;
    }
}
示例#7
0
void test3()
{
    const double p0 = .9;
    const double p1 = .09;
    const double p2 = 1 - (p0 + p1);

    const double m0 = 10;
    const double m1 = 11;
    const double m2 = 12.33;

    MassDistribution md;
    md.push_back(MassAbundance(m0, p0));
    md.push_back(MassAbundance(m1, p1));
    md.push_back(MassAbundance(m2, p2));

//    cout << "test3 distribution:\n" << md << endl;

    IsotopeTable table(md, 10, 1e-5);

    // compare distribution for 1 atom
    compare(table.distribution(1), md);

    // compare distribution for 2 atoms
    MassDistribution good3_2;
    good3_2.push_back(MassAbundance(m0*2, p0*p0));
    good3_2.push_back(MassAbundance(m0+m1, p0*p1*2));
    good3_2.push_back(MassAbundance(m0+m2, p0*p2*2));
    good3_2.push_back(MassAbundance(m1+m2, p1*p2*2));
    good3_2.push_back(MassAbundance(m1+m1, p1*p1));
    good3_2.push_back(MassAbundance(m2+m2, p2*p2));
    sort(good3_2.begin(), good3_2.end(), hasGreaterAbundance);

    MassDistribution test3_2 = table.distribution(2);
    sort(test3_2.begin(), test3_2.end(), hasGreaterAbundance);

//    cout << "good:\n" << good3_2 << endl;
//    cout << "test:\n" << test3_2 << endl;

    compare(test3_2, good3_2);
}
示例#8
0
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);
}
示例#9
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;
    }
}
示例#10
0
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;
}
示例#11
0
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;
    }
}