public void OutputStatistics(ProductSpectrum spectrum, Sequence sequence) { var baseIonTypes = spectrum.ActivationMethod != ActivationMethod.ETD ? BaseIonTypesCid : BaseIonTypesEtd; var cleavages = sequence.GetInternalCleavages().ToArray(); var tolerance = new Tolerance(10); var maxIntensity = spectrum.Peaks.Max(p => p.Intensity); foreach (var c in cleavages) { foreach (var baseIonType in baseIonTypes) { var fragmentComposition = baseIonType.IsPrefix ? c.PrefixComposition + baseIonType.OffsetComposition : c.SuffixComposition + baseIonType.OffsetComposition; for (int charge = MinCharge; charge <= MaxCharge; charge++) { var ion = new Ion(fragmentComposition, charge); var observedPeaks = spectrum.GetAllIsotopePeaks(ion, tolerance, RelativeIsotopeIntensityThreshold); if (observedPeaks == null) continue; var mostAbundantIsotopeIndex = ion.Composition.GetMostAbundantIsotopeZeroBasedIndex(); // representative peak intensity var ionPeakIntensity = observedPeaks[mostAbundantIsotopeIndex].Intensity; // calc. correlation var isotopomerEnvelope = ion.Composition.GetIsotopomerEnvelopeRelativeIntensities(); var observedIntensities = new double[observedPeaks.Length]; for (var i = 0; i < observedPeaks.Length; i++) { var observedPeak = observedPeaks[i]; observedIntensities[i] = observedPeak != null ? (float)observedPeak.Intensity : 0.0; } var corrCoeff = FitScoreCalculator.GetPearsonCorrelation(isotopomerEnvelope, observedIntensities); // mz error var mostAbundantIsotopeMz = ion.GetIsotopeMz(mostAbundantIsotopeIndex); var errorPpm = ((observedPeaks[mostAbundantIsotopeIndex].Mz - mostAbundantIsotopeMz)/ mostAbundantIsotopeMz)*1e6; } } } }
private void GetNodeStatistics(bool isDecoy, ProductSpectrum ms2Spec, Sequence sequence, StreamWriter writer) //, StreamWriter mzErrorWriter) { if (ms2Spec == null) return; if (sequence == null) return; //var refIntensity = ms2Spec.Peaks.Max(p => p.Intensity) * 0.01; //refIntensity = Math.Min(ms2Spec.Peaks.Select(p => p.Intensity).Median(), refIntensity); var BaseIonTypesCID = new[] { BaseIonType.B, BaseIonType.Y }; var BaseIonTypesETD = new[] { BaseIonType.C, BaseIonType.Z }; var tolerance = new Tolerance(15); var minCharge = 1; var maxCharge = 20; var baseIonTypes = ms2Spec.ActivationMethod != ActivationMethod.ETD ? BaseIonTypesCID : BaseIonTypesETD; var refIntensity = ms2Spec.Peaks.Max(p => p.Intensity); var activationMethodFlag = ms2Spec.ActivationMethod == ActivationMethod.ETD ? 1 : 2; var cleavages = sequence.GetInternalCleavages(); var prevPrefixFragMass = 0d; var prevPrefixObsIonMass = 0d; var prevPrefixObsIonCharge = 0; var prevPrefixObsIonIntensity = 0d; var prevSuffixFragMass = 0d; var prevSuffixObsIonMass = 0d; var prevSuffixObsIonCharge = 0; var prevSuffixObsIonIntensity = 0d; var nComplementaryFrags = 0; var cleavageIndex = 0; foreach (var c in cleavages) { var bothObs = true; foreach (var baseIonType in baseIonTypes) { var peakType = baseIonType.IsPrefix ? 1 : 2; // unexplained var fragmentComposition = baseIonType.IsPrefix ? c.PrefixComposition + baseIonType.OffsetComposition : c.SuffixComposition + baseIonType.OffsetComposition; var curFragMass = fragmentComposition.Mass; var curObsIonMass = 0d; var curObsIonCharge = 0; var curObsIonDist = 1.0d; var curObsIonCorr = 0d; var curObsIonIntensity = 0d; var ionMatch = false; for (var charge = minCharge; charge <= maxCharge; charge++) { var ion = new Ion(fragmentComposition, charge); var isotopePeaks = ms2Spec.GetAllIsotopePeaks(ion, tolerance, 0.1); if (isotopePeaks == null) continue; var distCorr = AbstractFragmentScorer.GetDistCorr(ion, isotopePeaks); if (distCorr.Item2 < 0.7 && distCorr.Item1 > 0.07) continue; var mostAbundantIsotopeIndex = ion.Composition.GetMostAbundantIsotopeZeroBasedIndex(); var mostAbuPeak = isotopePeaks[mostAbundantIsotopeIndex]; var summedIntensity = isotopePeaks.Where(p => p != null).Sum(p => p.Intensity); var intScore = summedIntensity/refIntensity; //var intScore = mostAbuPeak.Intensity / medIntensity; //var intScore = summedIntensity / refIntensity; if (ionMatch == false || curObsIonIntensity < intScore) { curObsIonMass = Ion.GetMonoIsotopicMass(mostAbuPeak.Mz, charge, mostAbundantIsotopeIndex); curObsIonCharge = charge; curObsIonCorr = distCorr.Item2; curObsIonDist = distCorr.Item1; curObsIonIntensity = intScore; } ionMatch = true; } if (!ionMatch) { bothObs = false; continue; } writer.Write(activationMethodFlag); writer.Write("\t"); writer.Write(peakType); writer.Write("\t"); writer.Write("{0:0.000}", curFragMass); writer.Write("\t"); writer.Write("{0}", curObsIonCharge); writer.Write("\t"); writer.Write("{0:0.000}", curObsIonDist); writer.Write("\t"); writer.Write("{0:0.000}", curObsIonCorr); writer.Write("\t"); writer.Write("{0:0.000}", curObsIonIntensity); writer.Write("\t"); writer.Write("{0:0.000}", (Math.Abs(curFragMass - curObsIonMass)/curFragMass)*1e6); writer.Write("\n"); // mz error output /* if (baseIonType.IsPrefix && prevPrefixFragMass > 0 & prevPrefixObsIonMass > 0) { var aaMass = Math.Abs(prevPrefixFragMass - curFragMass); var massError = Math.Abs(Math.Abs(prevPrefixObsIonMass - curObsIonMass) - aaMass); var massErrorPpm = (massError / curObsIonMass) * 1e6; mzErrorWriter.WriteLine("{0}\t{1:0.000}\t{2}", activationMethodFlag, massErrorPpm, Math.Abs(prevPrefixObsIonCharge - curObsIonCharge)); } else if (prevSuffixFragMass > 0 & prevSuffixObsIonMass > 0) { var aaMass = Math.Abs(prevSuffixFragMass - curFragMass); var massError = Math.Abs(Math.Abs(prevSuffixObsIonMass - curObsIonMass) - aaMass); var massErrorPpm = (massError / curObsIonMass) * 1e6; mzErrorWriter.WriteLine("{0}\t{1:0.000}\t{2}", activationMethodFlag, massErrorPpm, Math.Abs(prevSuffixObsIonCharge - curObsIonCharge)); } */ if (baseIonType.IsPrefix) { prevPrefixFragMass = curFragMass; prevPrefixObsIonMass = curObsIonMass; prevPrefixObsIonCharge = curObsIonCharge; prevPrefixObsIonIntensity = curObsIonIntensity; //Array.Copy(curObsIonMass, prevPrefixObsIonMass, curObsIonMass.Length); } else { prevSuffixFragMass = curFragMass; prevSuffixObsIonMass = curObsIonMass; prevSuffixObsIonCharge = curObsIonCharge; prevSuffixObsIonIntensity = curObsIonIntensity; //Array.Copy(curObsIonMass, prevSuffixObsIonMass, curObsIonMass.Length); } } if (bothObs) { //pairWriter.Write("{0}\t{1}\t", prevPrefixObsIonIntensity, prevSuffixObsIonIntensity); nComplementaryFrags++; } cleavageIndex++; } Console.WriteLine("{0}\t{1}", nComplementaryFrags, sequence.Count); //if (!isDecoy) Console.WriteLine("{0}", totalExplainedAbundanceRatio); }
private void GetMatchStatistics(ProductSpectrum ms2Spec, Sequence sequence, int parentIonCharge, StreamWriter writer) { if (ms2Spec == null) return; if (sequence == null) return; var BaseIonTypesCID = new[] { BaseIonType.B, BaseIonType.Y }; var BaseIonTypesETD = new[] { BaseIonType.C, BaseIonType.Z }; var tolerance = new Tolerance(12); var MinProductCharge = 1; var MaxProductCharge = Math.Min(parentIonCharge+2, 20); var baseIonTypes = ms2Spec.ActivationMethod != ActivationMethod.ETD ? BaseIonTypesCID : BaseIonTypesETD; var refIntensity = CompositeScorer.GetRefIntensity(ms2Spec.Peaks); var activationMethodFlag = ms2Spec.ActivationMethod == ActivationMethod.ETD ? 2 : 1; var cleavages = sequence.GetInternalCleavages(); var nComplementaryFrags = 0; var prefixStat = new FragmentStat(); var suffixStat = new FragmentStat(); var minMz = ms2Spec.Peaks.First().Mz; var maxMz = ms2Spec.Peaks.Last().Mz; var cleavageIndex = 0; var preFixIonCheck = new bool[sequence.Count + 1]; var sufFixIonCheck = new bool[sequence.Count + 1]; foreach (var c in cleavages) { var prefixHit = false; var suffixHit = false; foreach (var baseIonType in baseIonTypes) { var stat = baseIonType.IsPrefix ? prefixStat : suffixStat; var fragmentComposition = baseIonType.IsPrefix ? c.PrefixComposition + baseIonType.OffsetComposition : c.SuffixComposition + baseIonType.OffsetComposition; if (fragmentComposition.Mass < ms2Spec.Peaks[0].Mz) continue; var curFragMass = fragmentComposition.Mass; /*var curObsIonCharge = 0; var curObsIonDist = 1.0d; var curObsIonCorr = 0d; var curObsIonIntensity = 0d; var curObsIonMassError = 0d;*/ var mostAbundantIsotopeIndex = fragmentComposition.GetMostAbundantIsotopeZeroBasedIndex(); var fragmentIonMostAbuMass = fragmentComposition.Mass + Constants.C13MinusC12 * mostAbundantIsotopeIndex; var maxCharge = (int)Math.Floor(fragmentIonMostAbuMass / (minMz - Constants.Proton)); var minCharge = (int)Math.Ceiling(fragmentIonMostAbuMass / (maxMz - Constants.Proton)); if (maxCharge < 1 || maxCharge > MaxProductCharge) maxCharge = MaxProductCharge; if (minCharge < 1 || minCharge < MinProductCharge) minCharge = MinProductCharge; //var ionMatch = false; for (var charge = minCharge; charge <= maxCharge; charge++) { var ion = new Ion(fragmentComposition, charge); var isotopePeaks = ms2Spec.GetAllIsotopePeaks(ion, tolerance, 0.1); if (isotopePeaks == null) continue; var distCorr = CompositeScorer.GetDistCorr(ion, isotopePeaks); if (distCorr.Item2 < 0.7 && distCorr.Item1 > 0.03) continue; var mostAbuPeak = isotopePeaks[mostAbundantIsotopeIndex]; var intScore = mostAbuPeak.Intensity / refIntensity; /* if (ionMatch == false || curObsIonIntensity < intScore) { curObsIonCharge = charge; curObsIonCorr = distCorr.Item2; curObsIonDist = distCorr.Item1; curObsIonIntensity = intScore; var mostAbuPeakMz = Ion.GetIsotopeMz(curFragMass, charge, mostAbundantIsotopeIndex); curObsIonMassError = (Math.Abs(mostAbuPeak.Mz - mostAbuPeakMz) / mostAbuPeakMz) * 1e6; //var curObsIonMass = Ion.GetMonoIsotopicMass(mostAbuPeak.Mz, charge, mostAbundantIsotopeIndex); //curObsIonMassError = (Math.Abs(curFragMass - curObsIonMass) / curFragMass) * 1e6; } ionMatch = true; */ var mostAbuPeakMz = Ion.GetIsotopeMz(curFragMass, charge, mostAbundantIsotopeIndex); var curObsIonMassError = (Math.Abs(mostAbuPeak.Mz - mostAbuPeakMz) / mostAbuPeakMz) * 1e6; stat.Count++; stat.Intensity += Math.Min(intScore, 1.0); stat.Corr += distCorr.Item2; stat.Dist += distCorr.Item1; stat.MassError += curObsIonMassError; if (baseIonType.IsPrefix) prefixHit = true; else suffixHit = true; } //if (!ionMatch) continue; } if (prefixHit) preFixIonCheck[cleavageIndex] = true; if (suffixHit) sufFixIonCheck[cleavageIndex] = true; if (prefixHit && suffixHit) { nComplementaryFrags++; } cleavageIndex++; } var preContCount = 0; var sufContCount = 0; for (var i = 0; i < preFixIonCheck.Length - 1; i++) { if (preFixIonCheck[i] && preFixIonCheck[i + 1]) preContCount++; if (sufFixIonCheck[i] && sufFixIonCheck[i + 1]) sufContCount++; } writer.Write(activationMethodFlag); writer.Write("\t"); writer.Write(sequence.Composition.Mass); writer.Write("\t"); writer.Write(sequence.Count); writer.Write("\t"); writer.Write(nComplementaryFrags); writer.Write("\t"); writer.Write("{0}\t{1}\t{2}\t{3}\t{4}\t{5}", prefixStat.Count, preContCount, prefixStat.Intensity, prefixStat.Corr, prefixStat.Dist, prefixStat.MassError); writer.Write("\t"); writer.Write("{0}\t{1}\t{2}\t{3}\t{4}\t{5}", suffixStat.Count, sufContCount, suffixStat.Intensity, suffixStat.Corr, suffixStat.Dist, suffixStat.MassError); writer.Write("\n"); }