// Returns molecule mass (or massH, for peptides) public TypedMass GetMoleculeMass() { Assume.IsTrue(Transition.IsCustom() || MzMassType.IsMassH()); return(Transition.IsCustom() ? Transition.Adduct.MassFromMz(Mz, MzMassType) : new TypedMass(SequenceMassCalc.GetMH(Mz, Transition.Charge), MzMassType)); }
public double GetMassI(int massIndex, int?decoyMassShift = null) { // Return the original monoisotopic mass + H, if requested to maintain an exact match. if (massIndex == 0 && !decoyMassShift.HasValue) { return(_monoisotopicMass); } // Otherwize use the charge to convert from the peak center m/z values double shift = SequenceMassCalc.GetPeptideInterval(decoyMassShift); // Correct for shift applied to the distribution return(_isMassH ? SequenceMassCalc.GetMH(ExpectedPeaks[MassIndexToPeakIndex(massIndex)].Mz - shift, _charge) : BioMassCalc.CalculateIonMassFromMz(ExpectedPeaks[MassIndexToPeakIndex(massIndex)].Mz - shift, _charge)); }
private MoleculeMasses GetCrosslinkMasses(SrmSettings settings) { var predictDocNode = MakeTransitionGroupWithAllPossibleChildren(settings, TargetInfoObj.TransitionGroupDocNode.LabelType); TransitionGroupDocNode matchDocNode; if (Equals(TargetInfoObj.TransitionGroupDocNode.LabelType, TargetInfoObj.SpectrumLabelType)) { matchDocNode = predictDocNode; } else { matchDocNode = MakeTransitionGroupWithAllPossibleChildren(settings, TargetInfoObj.SpectrumLabelType); } var matchTransitions = matchDocNode.Transitions.ToDictionary(child => child.Key(matchDocNode)); var predictFragments = new List <MatchedFragmentIon>(); var matchFragments = new List <MatchedFragmentIon>(); foreach (var predictedTransition in predictDocNode.Transitions) { var key = predictedTransition.Key(null); TransitionDocNode matchTransition; if (!matchTransitions.TryGetValue(key, out matchTransition)) { continue; } var complexFragmentIonName = predictedTransition.ComplexFragmentIon.GetName(); var ionType = DecideIonType(complexFragmentIonName); string fragmentName = predictedTransition.ComplexFragmentIon.GetFragmentIonName(); var predictedIon = new MatchedFragmentIon(ionType, predictFragments.Count + 1, predictedTransition.Transition.Adduct, fragmentName, predictedTransition.Losses, predictedTransition.Mz) .ChangeComplexFragmentIonName(complexFragmentIonName); predictFragments.Add(predictedIon); matchFragments.Add(predictedIon.ChangePredictedMz(matchTransition.Mz)); } var matchMasses = new IonMasses( SequenceMassCalc.GetMH(matchDocNode.PrecursorMz, matchDocNode.PrecursorAdduct, MassType.MonoisotopicMassH), IonTable <TypedMass> .EMPTY) .ChangeKnownFragments(matchFragments); var predictMasses = new IonMasses( SequenceMassCalc.GetMH(predictDocNode.PrecursorMz, predictDocNode.PrecursorAdduct, MassType.MonoisotopicMassH), IonTable <TypedMass> .EMPTY) .ChangeKnownFragments(predictFragments); return(new MoleculeMasses(predictDocNode.PrecursorMz, matchMasses).ChangePredictIonMasses(predictMasses)); }
public TypedMass GetMassI(int massIndex, int?decoyMassShift = null) { // Return the original monoisotopic mass + H, if requested to maintain an exact match. if (massIndex == 0 && !decoyMassShift.HasValue) { return(_monoisotopicMass); } // Otherwize use the charge to convert from the peak center m/z values double shift = SequenceMassCalc.GetPeptideInterval(decoyMassShift); // Correct for shift applied to the distribution // ReSharper disable ImpureMethodCallOnReadonlyValueField return(_monoisotopicMass.IsMassH() ? new TypedMass(SequenceMassCalc.GetMH(ExpectedPeaks[MassIndexToPeakIndex(massIndex)].Mz - shift, _adduct.AdductCharge), _monoisotopicMass.MassType) : _adduct.MassFromMz(ExpectedPeaks[MassIndexToPeakIndex(massIndex)].Mz - shift, _monoisotopicMass.MassType)); // ReSharper restore ImpureMethodCallOnReadonlyValueField }
public double GetIonMass() { return(Transition.IsCustom() ? BioMassCalc.CalculateIonMassFromMz(Mz, Transition.Charge) : SequenceMassCalc.GetMH(Mz, Transition.Charge)); }
public static Adduct CalcProductCharge(TypedMass productPrecursorMass, int?productZ, Adduct precursorCharge, IList <IonType> acceptedIonTypes, IonTable <TypedMass> productMasses, IList <IList <ExplicitLoss> > potentialLosses, double productMz, double tolerance, MassType massType, MassShiftType massShiftType, out IonType?ionType, out int?ordinal, out TransitionLosses losses, out int massShift) { // Get length of fragment ion mass array int len = productMasses.GetLength(1); // Check all possible ion types and offsets double?minDelta = null; double?minFragmentMass = null, maxFragmentMass = null, maxLoss = null; if (massShiftType == MassShiftType.none) { if (!productZ.HasValue) { minFragmentMass = productMz - tolerance; } else { minFragmentMass = SequenceMassCalc.GetMH(productMz - tolerance, productZ.Value); maxFragmentMass = SequenceMassCalc.GetMH(productMz + tolerance, productZ.Value); } } var bestCharge = Adduct.EMPTY; IonType? bestIonType = null; int? bestOrdinal = null; TransitionLosses bestLosses = null; int bestMassShift = 0; // Check to see if it is the precursor foreach (var lossesTrial in TransitionGroup.CalcTransitionLosses(IonType.precursor, 0, massType, potentialLosses)) { var productMass = productPrecursorMass; if (lossesTrial != null) { productMass -= lossesTrial.Mass; maxLoss = Math.Max(maxLoss ?? 0, lossesTrial.Mass); } int potentialMassShift; int nearestCharge; var charge = CalcProductCharge(productMass, productZ, productMz, tolerance, false, precursorCharge, massShiftType, out potentialMassShift, out nearestCharge); if (Equals(charge, precursorCharge)) { double potentialMz = SequenceMassCalc.GetMZ(productMass, charge) + potentialMassShift; double delta = Math.Abs(productMz - potentialMz); if (CompareIonMatch(delta, lossesTrial, potentialMassShift, minDelta, bestLosses, bestMassShift) < 0) { bestCharge = charge; bestIonType = IonType.precursor; bestOrdinal = len + 1; bestLosses = lossesTrial; bestMassShift = potentialMassShift; minDelta = delta; } } } if (maxLoss.HasValue) { maxFragmentMass += maxLoss.Value; } var categoryLast = -1; foreach (var typeAccepted in GetIonTypes(acceptedIonTypes)) { var type = typeAccepted.IonType; var category = typeAccepted.IonCategory; // Types have priorities. If changing type category, and there is already a // suitable answer stop looking. if (category != categoryLast && minDelta.HasValue && MatchMz(minDelta.Value, tolerance)) { break; } categoryLast = category; // The peptide length is 1 longer than the mass array for (int ord = len; ord > 0; ord--) { int offset = Transition.OrdinalToOffset(type, ord, len + 1); var productMassBase = productMasses[type, offset]; // Until below the maximum fragment mass no possible matches if (maxFragmentMass.HasValue && productMassBase > maxFragmentMass.Value) { continue; } // Once below the minimum fragment mass no more possible matches, so stop if (minFragmentMass.HasValue && productMassBase < minFragmentMass.Value) { break; } foreach (var lossesTrial in TransitionGroup.CalcTransitionLosses(type, offset, massType, potentialLosses)) { // Look for the closest match. var productMass = productMassBase; if (lossesTrial != null) { productMass -= lossesTrial.Mass; } int potentialMassShift; int nearestCharge; var chargeFound = CalcProductCharge(productMass, productZ, productMz, tolerance, false, precursorCharge, massShiftType, out potentialMassShift, out nearestCharge); if (!chargeFound.IsEmpty) { var charge = chargeFound; double potentialMz = SequenceMassCalc.GetMZ(productMass, charge) + potentialMassShift; double delta = Math.Abs(productMz - potentialMz); if (CompareIonMatch(delta, lossesTrial, potentialMassShift, minDelta, bestLosses, bestMassShift) < 0) { bestCharge = charge; bestIonType = type; bestOrdinal = ord; bestLosses = lossesTrial; bestMassShift = potentialMassShift; minDelta = delta; } } } } } ionType = bestIonType; ordinal = bestOrdinal; losses = bestLosses; massShift = bestMassShift; return(bestCharge); }