コード例 #1
0
        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;
        }
コード例 #2
0
        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);
        }