Пример #1
0
        public IEnumerable <TransitionGroup> GetTransitionGroups(SrmSettings settings, PeptideDocNode nodePep, ExplicitMods mods, bool useFilter)
        {
            if (IsCustomIon)
            {
                // We can't generate nodes as we do with peptides, so just filter what we do have on instrument mz range
                foreach (var group in nodePep.TransitionGroups.Where(tranGroup => tranGroup.TransitionGroup.IsCustomIon))
                {
                    if (!useFilter || settings.TransitionSettings.IsMeasurablePrecursor(group.PrecursorMz))
                    {
                        yield return(group.TransitionGroup);
                    }
                }
            }
            else
            {
                IList <int> precursorCharges = settings.TransitionSettings.Filter.PrecursorCharges;
                if (!useFilter)
                {
                    precursorCharges = new List <int>();
                    for (int i = TransitionGroup.MIN_PRECURSOR_CHARGE; i < TransitionGroup.MAX_PRECURSOR_CHARGE; i++)
                    {
                        precursorCharges.Add(i);
                    }
                }

                var modSettings = settings.PeptideSettings.Modifications;

                double precursorMassLight  = settings.GetPrecursorMass(IsotopeLabelType.light, Sequence, mods);
                var    listPrecursorMasses = new List <KeyValuePair <IsotopeLabelType, double> >
                {
                    new KeyValuePair <IsotopeLabelType, double>(IsotopeLabelType.light, precursorMassLight)
                };

                foreach (var typeMods in modSettings.GetHeavyModifications())
                {
                    IsotopeLabelType labelType     = typeMods.LabelType;
                    double           precursorMass = precursorMassLight;
                    if (settings.HasPrecursorCalc(labelType, mods))
                    {
                        precursorMass = settings.GetPrecursorMass(labelType, Sequence, mods);
                    }

                    listPrecursorMasses.Add(new KeyValuePair <IsotopeLabelType, double>(labelType, precursorMass));
                }

                foreach (int charge in precursorCharges)
                {
                    if (useFilter && !settings.Accept(settings, this, mods, charge))
                    {
                        continue;
                    }

                    for (int i = 0; i < listPrecursorMasses.Count; i++)
                    {
                        var pair = listPrecursorMasses[i];
                        IsotopeLabelType labelType     = pair.Key;
                        double           precursorMass = pair.Value;
                        // Only return a heavy group, if the precursor masses differ
                        // between the light and heavy calculators
                        if (i == 0 || precursorMass != precursorMassLight)
                        {
                            if (settings.TransitionSettings.IsMeasurablePrecursor(SequenceMassCalc.GetMZ(precursorMass, charge)))
                            {
                                yield return(new TransitionGroup(this, null, charge, labelType));
                            }
                        }
                    }
                }
            }
        }
Пример #2
0
        public IEnumerable <TransitionGroup> GetTransitionGroups(SrmSettings settings, PeptideDocNode nodePep, ExplicitMods mods, bool useFilter)
        {
            if (IsCustomMolecule)
            {
                // TODO(bspratt) WHY NOT USING TRANSITION SETTINGS FILTER PRECURSOR ADDUCTS?
                // We can't generate precursors as we do with peptides, so just filter what we do have on instrument mz range
                //var precursorAdducts = settings.TransitionSettings.Filter.SmallMoleculePrecursorAdducts;
                // TODO(bspratt) generate precursor transitions if doc has no fragments
                // CONSIDER(bspratt) could we reasonably reuse fragments with proposed precursors of suitable charge and polarity (say, add an M+Na node that mimics an existing M+H node and children)
                foreach (var group in nodePep.TransitionGroups.Where(tranGroup => tranGroup.TransitionGroup.IsCustomIon))
                {
                    if (!useFilter || settings.TransitionSettings.IsMeasurablePrecursor(group.PrecursorMz))
                    {
                        yield return(group.TransitionGroup);
                    }
                }
            }
            else
            {
                var precursorCharges = settings.TransitionSettings.Filter.PeptidePrecursorCharges;
                if (!useFilter)
                {
                    precursorCharges = new List <Adduct>();
                    for (int i = TransitionGroup.MIN_PRECURSOR_CHARGE; i < TransitionGroup.MAX_PRECURSOR_CHARGE; i++)
                    {
                        precursorCharges.Add(Adduct.FromChargeProtonated(i));
                    }
                }

                var modSettings = settings.PeptideSettings.Modifications;

                var precursorMassLight  = settings.GetPrecursorMass(IsotopeLabelType.light, Target, mods);
                var listPrecursorMasses = new List <KeyValuePair <IsotopeLabelType, TypedMass> >
                {
                    new KeyValuePair <IsotopeLabelType, TypedMass>(IsotopeLabelType.light, precursorMassLight)
                };

                foreach (var typeMods in modSettings.GetHeavyModifications())
                {
                    IsotopeLabelType labelType = typeMods.LabelType;
                    var precursorMass          = precursorMassLight;
                    if (settings.HasPrecursorCalc(labelType, mods))
                    {
                        precursorMass = settings.GetPrecursorMass(labelType, Target, mods);
                    }

                    listPrecursorMasses.Add(new KeyValuePair <IsotopeLabelType, TypedMass>(labelType, precursorMass));
                }

                foreach (var adduct in precursorCharges)
                {
                    if (useFilter && !settings.Accept(settings, this, mods, adduct))
                    {
                        continue;
                    }

                    for (int i = 0; i < listPrecursorMasses.Count; i++)
                    {
                        var pair = listPrecursorMasses[i];
                        IsotopeLabelType labelType = pair.Key;
                        var precursorMass          = pair.Value;
                        // Only return a heavy group, if the precursor masses differ
                        // between the light and heavy calculators
                        if (i == 0 || precursorMass != precursorMassLight)
                        {
                            if (settings.TransitionSettings.IsMeasurablePrecursor(SequenceMassCalc.GetMZ(precursorMass, adduct)))
                            {
                                yield return(new TransitionGroup(this, adduct, labelType));
                            }
                        }
                    }
                }
            }
        }