示例#1
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;
}
示例#2
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;
}
示例#3
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;
}
示例#4
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);
}
示例#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;
    }
}