public void AddAtomicCount(AtomicCount cnt, double monoMass, double avgMass) { var numElements = ElementalComposition.Count; for (var elemNum = 0; elemNum < numElements; elemNum++) { if (ElementalComposition[elemNum].Index == cnt.Index) { ElementalComposition[elemNum].NumCopies += cnt.NumCopies; MonoisotopicMass += monoMass; AverageMass += avgMass; TotalAtomCount += cnt.NumCopies; return; } } ElementalComposition.Add(cnt); MonoisotopicMass += monoMass; AverageMass += avgMass; TotalAtomCount += cnt.NumCopies; }
public MolecularFormula GetAverageFormulaForMass(double mw) { // still need to add tag mass. if (_useTag && mw > _tagMass) { mw -= _tagMass; } var empiricalFormula = new MolecularFormula(); var numElements = _averagineFormula.NumElements; //var totalElementCount = _averagineFormula.TotalAtomCount; empiricalFormula.ElementalComposition.Clear(); double averageMass = 0; double monoMass = 0; var hydrogenIndex = -1; double totalAtomCount = 0; for (var elementNum = 0; elementNum < numElements; elementNum++) { var elementCount = new AtomicCount(_averagineFormula.ElementalComposition[elementNum]); var numAtoms = (int)(mw / _averagineFormula.MonoisotopicMass * elementCount.NumCopies + 0.5); if ( string.Compare(_elementIsotopeAbundance.ElementalIsotopesList[elementCount.Index].Symbol, "H", StringComparison.InvariantCulture) == 0) { // Hydrogen is used as the remainder mass, so we skip it in the formula calculation by assigning it to 0 // for now and later below assigning the remainder to it. hydrogenIndex = elementNum; numAtoms = 0; } else { var elementAvgMass = _elementIsotopeAbundance.ElementalIsotopesList[elementCount.Index].AverageMass; var elementMonoMass = _elementIsotopeAbundance.ElementalIsotopesList[elementCount.Index].Isotopes[0].Mass; averageMass += elementAvgMass * numAtoms; monoMass += elementMonoMass * numAtoms; } totalAtomCount += numAtoms; elementCount.NumCopies = numAtoms; empiricalFormula.ElementalComposition.Add(elementCount); } // if tag mass is enabled, add it to the formula. if (_useTag) { var numElementsTag = _tagFormula.NumElements; //var totalElementCountTag = _tagFormula.TotalAtomCount; for (var elementNum = 0; elementNum < numElementsTag; elementNum++) { var elementCount = _tagFormula.ElementalComposition[elementNum]; var numAtoms = (int)elementCount.NumCopies; var elementAvgMass = _elementIsotopeAbundance.ElementalIsotopesList[elementCount.Index].AverageMass; var elementMonoMass = _elementIsotopeAbundance.ElementalIsotopesList[elementCount.Index].Isotopes[0].Mass; averageMass += elementAvgMass * numAtoms; monoMass += elementMonoMass * numAtoms; totalAtomCount += numAtoms; elementCount.NumCopies = numAtoms; // now go through each elementCount. If already added, then just add to its count. // otherwise, create new. var elementNumAlreadyPushed = -1; for (var elementNumPushed = 0; elementNumPushed < empiricalFormula.ElementalComposition.Count; elementNumPushed++) { if (empiricalFormula.ElementalComposition[elementNumPushed].Index == elementCount.Index) { elementNumAlreadyPushed = elementNumPushed; break; } } if (elementNumAlreadyPushed == -1) { empiricalFormula.ElementalComposition.Add(elementCount); } else { empiricalFormula.ElementalComposition[elementNumAlreadyPushed].NumCopies += elementCount.NumCopies; } } } // now whatever's left over in mass, is assigned to hydrogen because it is not expected to cause // much of a distortion in the isotope profile. var remainderMass = mw - averageMass; if (_useTag) { remainderMass += _tagMass; } var numHydrogens = (int) (remainderMass / _elementIsotopeAbundance.ElementalIsotopesList[_hydrogenElementIndex].AverageMass + 0.5); averageMass += numHydrogens * _elementIsotopeAbundance.ElementalIsotopesList[_hydrogenElementIndex].AverageMass; monoMass += numHydrogens * _elementIsotopeAbundance.ElementalIsotopesList[_hydrogenElementIndex].Isotopes[0].Mass; totalAtomCount += numHydrogens; if (numHydrogens > 0) { if (hydrogenIndex != -1) { empiricalFormula.ElementalComposition[hydrogenIndex].NumCopies += numHydrogens; } else { empiricalFormula.ElementalComposition.Add(new AtomicCount(_hydrogenElementIndex, numHydrogens)); } } empiricalFormula.MonoisotopicMass = monoMass; empiricalFormula.AverageMass = averageMass; empiricalFormula.TotalAtomCount = totalAtomCount; return(empiricalFormula); }