private void MultiplyFineFinalPolynomial(List<Polynomial> tPolynomial, List<Polynomial> fPolynomial, List<Polynomial> fgidPolynomial)
{
int i = tPolynomial.Count;
int j = fPolynomial.Count;
if (i == 0 || j == 0)
return;
double deltaMass = (_fineResolution/_mwResolution);
double minProbability = _fineMinProb;
int index = 0;
double minMass = tPolynomial[0].Power + fPolynomial[0].Power;
double maxMass = tPolynomial[i - 1].Power + fPolynomial[j - 1].Power;
int maxIndex = (int) (Math.Abs(maxMass - minMass)/deltaMass + 0.5);
if (maxIndex >= fgidPolynomial.Count)
{
j = maxIndex - fgidPolynomial.Count;
for (i = 0; i <= j; i++)
{
fgidPolynomial.Add(new Polynomial());
}
}
for (int t = 0; t < tPolynomial.Count; t++)
{
for (int f = 0; f < fPolynomial.Count; f++)
{
double prob = tPolynomial[t].Probablity*fPolynomial[f].Probablity;
if (prob <= minProbability)
continue;
double power = tPolynomial[t].Power + fPolynomial[f].Power;
index = (int) (Math.Abs(power - minMass)/deltaMass + 0.5);
Polynomial tempPolynomial = fgidPolynomial[index];
fgidPolynomial[index] = new Polynomial {Power = tempPolynomial.Power + power*prob, Probablity = tempPolynomial.Probablity + prob};
}
}
index = tPolynomial.Count;
j = 0;
for (i = 0; i < fgidPolynomial.Count; i++)
{
if (fgidPolynomial[i].Probablity != 0)
{
if (j < index)
{
tPolynomial[j] = new Polynomial {Power = fgidPolynomial[i].Power/fgidPolynomial[i].Probablity, Probablity = fgidPolynomial[i].Probablity};
j++;
}
else
{
tPolynomial.Add(new Polynomial {Power = fgidPolynomial[i].Power/fgidPolynomial[i].Probablity, Probablity = fgidPolynomial[i].Probablity});
}
}
fgidPolynomial[i] = new Polynomial();
}
if (j < index)
{
tPolynomial.RemoveRange(j, tPolynomial.Count - j);
}
}