public MZSpectrum CalculateDistribuition(ChemicalFormula formula, int topNPeaks = int.MaxValue, Normalization normalization = Normalization.Sum)
{
double monoisotopicMass = formula.MonoisotopicMass;
SetResolution(monoisotopicMass);
List<List<Composition>> elementalComposition = new List<List<Composition>>();
// Get all the unique elements of the formula
foreach (Element element in formula.GetElements())
{
int count = formula.Count(element);
List<Composition> isotopeComposition = new List<Composition>();
foreach (Isotope isotope in element.Isotopes.Values.OrderBy(iso => iso.AtomicMass))
{
double probability = isotope.RelativeAbundance;
if (probability <= 0)
continue;
Composition c = new Composition
{
Atoms = count,
MolecularWeight = isotope.AtomicMass,
Power = isotope.AtomicMass,
Probability = isotope.RelativeAbundance
};
isotopeComposition.Add(c);
}
elementalComposition.Add(isotopeComposition);
}
foreach (List<Composition> compositions in elementalComposition)
{
double sumProb = compositions.Sum(t => t.Probability);
foreach (Composition composition in compositions)
{
composition.Probability /= sumProb;
composition.LogProbability = Math.Log(composition.Probability);
composition.Power = Math.Floor(composition.MolecularWeight/_mwResolution + 0.5);
}
}
return CalculateFineGrain(elementalComposition, normalization);
}