private List<Polynomial> MergeFinePolynomial(List<Polynomial> tPolynomial)
{
// Sort by mass (i.e. power)
tPolynomial.Sort((a, b) => a.Power.CompareTo(b.Power));
int count = tPolynomial.Count;
for (int k = 1; k <= 9; k++)
{
for (int i = 0; i < count; i++)
{
double power = tPolynomial[i].Power;
if (power == 0)
continue;
double probability = tPolynomial[i].Probablity;
Polynomial tempPolynomial;
tempPolynomial.Power = power*probability;
tempPolynomial.Probablity = probability;
for (int j = i + 1; j < count; j++)
{
double value = Math.Abs(tPolynomial[i].Power*_mwResolution - tPolynomial[j].Power*_mwResolution);
double threshold = (k <= 8) ? k*_mergeFineResolution/8 : _mergeFineResolution + _mergeFineResolution/100;
// Combine terms if their mass difference (i.e. power difference) is less than some threshold
if (value <= threshold)
{
tempPolynomial.Power = tempPolynomial.Power + tPolynomial[j].Power*tPolynomial[j].Probablity;
tempPolynomial.Probablity = tempPolynomial.Probablity + tPolynomial[j].Probablity;
tPolynomial[i] = new Polynomial {Power = tempPolynomial.Power/tempPolynomial.Probablity, Probablity = tempPolynomial.Probablity};
tPolynomial[j] = new Polynomial();
}
else
{
break;
}
}
tPolynomial[i] = new Polynomial {Power = tempPolynomial.Power/tempPolynomial.Probablity, Probablity = tempPolynomial.Probablity};
}
}
// return only non-zero terms
return tPolynomial.Where(poly => poly.Power != 0).ToList();
}