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)); } } } } } }
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)); } } } } } }