private DbRefSpectra RefSpectrumFromPeaks(SpectrumMzInfo spectrum) { var peaksInfo = spectrum.SpectrumPeaks; var refSpectra = new DbRefSpectra { PeptideSeq = FastaSequence.StripModifications(spectrum.Key.Sequence), PrecursorMZ = spectrum.PrecursorMz, PrecursorCharge = spectrum.Key.Charge, PeptideModSeq = spectrum.Key.Sequence, Copies = 1, NumPeaks = (ushort)peaksInfo.Peaks.Length }; refSpectra.Peaks = new DbRefSpectraPeaks { RefSpectra = refSpectra, PeakIntensity = IntensitiesToBytes(peaksInfo.Peaks), PeakMZ = MZsToBytes(peaksInfo.Peaks) }; ModsFromModifiedSequence(refSpectra); return(refSpectra); }
public bool BuildLibrary(IProgressMonitor progress) { RetentionTimeRegression regr = null; var standardSpectra = new List <SpectrumMzInfo>(); if (IrtStandard != null && !ReferenceEquals(IrtStandard, IrtStandard.EMPTY)) { // Align Prosit iRTs with iRT standard var standardPeptidesToAdd = SkylineWindow.ReadStandardPeptides(IrtStandard); if (standardPeptidesToAdd != null && standardPeptidesToAdd.Count > 0) { // Get iRTs var standardIRTMap = _rtModel.Predict(_prositClient, _document.Settings, standardPeptidesToAdd.Select(p => (PrositRetentionTimeModel.PeptideDocNodeWrapper)p.NodePep).ToArray(), CancellationToken.None); var original = standardIRTMap.ToDictionary(p => p.Key.ModifiedTarget, p => p.Value); var target = IrtStandard.Peptides.ToDictionary(p => p.ModifiedTarget, p => p.Irt); var aligned = AlignedRetentionTimes.AlignLibraryRetentionTimes(target, original, 0.0, RegressionMethodRT.linear, CancellationToken.None); regr = aligned.Regression; // Get spectra var standardMS = _intensityModel.PredictBatches(_prositClient, progress, _document.Settings, standardPeptidesToAdd.Select(p => p.WithNCE(_nce)).ToArray(), CancellationToken.None); // Merge iRT and MS2 into SpecMzInfos standardSpectra = standardMS.Spectra.Select(m => m.SpecMzInfo).ToList(); for (var i = 0; i < standardSpectra.Count; ++i) { if (standardIRTMap.TryGetValue(standardMS.Spectra[i].PeptidePrecursorNCE.NodePep, out var iRT)) { standardSpectra[i].RetentionTime = iRT; } } } } // Predict fragment intensities PrositMS2Spectra ms = _intensityModel.PredictBatches(_prositClient, progress, _document.Settings, _peptides.Zip(_precursors, (pep, prec) => new PrositIntensityModel.PeptidePrecursorNCE(pep, prec, _nce)).ToArray(), CancellationToken.None); var specMzInfo = ms.Spectra.Select(m => m.SpecMzInfo).ToList(); // Predict iRTs for peptides var distinctPeps = _peptides.Select(p => (PrositRetentionTimeModel.PeptideDocNodeWrapper)p).Distinct( new SystemLinqExtensionMethods.FuncEqualityComparer <PrositRetentionTimeModel.PeptideDocNodeWrapper>( (p1, p2) => p1.Node.ModifiedSequence == p2.Node.ModifiedSequence)).ToArray(); var iRTMap = _rtModel.PredictBatches(_prositClient, progress, _document.Settings, distinctPeps, CancellationToken.None); for (var i = 0; i < specMzInfo.Count; ++i) { if (iRTMap.TryGetValue(ms.Spectra[i].PeptidePrecursorNCE.NodePep, out var iRT)) { specMzInfo[i].RetentionTime = regr?.Conversion?.GetY(iRT) ?? iRT; } } // Build library var librarySpectra = SpectrumMzInfo.RemoveDuplicateSpectra(standardSpectra.Concat(specMzInfo).ToList()); // Delete if already exists, no merging with Prosit var libraryExists = File.Exists(LibrarySpec.FilePath); if (libraryExists) { var replace = _replaceLibrary(); if (!replace) { return(false); } FileEx.SafeDelete(LibrarySpec.FilePath); } if (!librarySpectra.Any()) { return(true); } // Build the library using (var blibDb = BlibDb.CreateBlibDb(LibrarySpec.FilePath)) { var docLibrarySpec = new BiblioSpecLiteSpec(LibrarySpec.Name, LibrarySpec.FilePath); BiblioSpecLiteLibrary docLibraryNew = null; var docLibrarySpec2 = docLibrarySpec; docLibraryNew = blibDb.CreateLibraryFromSpectra(docLibrarySpec2, librarySpectra, LibrarySpec.Name, progress); if (docLibraryNew == null) { return(false); } } return(true); }
private DbRefSpectra RefSpectrumFromPeaks(SpectrumMzInfo spectrum) { var peaksInfo = spectrum.SpectrumPeaks; var refSpectra = new DbRefSpectra { PeptideSeq = FastaSequence.StripModifications(spectrum.Key.Sequence), PrecursorMZ = spectrum.PrecursorMz, PrecursorCharge = spectrum.Key.Charge, PeptideModSeq = spectrum.Key.Sequence, Copies = 1, NumPeaks = (ushort)peaksInfo.Peaks.Length }; refSpectra.Peaks = new DbRefSpectraPeaks { RefSpectra = refSpectra, PeakIntensity = IntensitiesToBytes(peaksInfo.Peaks), PeakMZ = MZsToBytes(peaksInfo.Peaks) }; ModsFromModifiedSequence(refSpectra); return refSpectra; }
private bool BuildLibraryOrThrow(IProgressMonitor progress, ref IProgressStatus progressStatus) { progressStatus = progressStatus.ChangeSegments(0, 5); var standardSpectra = new List <SpectrumMzInfo>(); // First get predictions for iRT standards specified by the user which may or may not be in the document if (IrtStandard != null && !ReferenceEquals(IrtStandard, IrtStandard.EMPTY) && !ReferenceEquals(IrtStandard, IrtStandard.AUTO)) { var standardPeptidesToAdd = ReadStandardPeptides(IrtStandard); if (standardPeptidesToAdd != null && standardPeptidesToAdd.Count > 0) { // Get iRTs var standardIRTMap = _rtModel.Predict(_prositClient, _document.Settings, standardPeptidesToAdd.Select(p => (PrositRetentionTimeModel.PeptideDocNodeWrapper)p.NodePep).ToArray(), CancellationToken.None); // Get spectra var standardMS = _intensityModel.PredictBatches(_prositClient, progress, ref progressStatus, _document.Settings, standardPeptidesToAdd.Select(p => p.WithNCE(_nce)).ToArray(), CancellationToken.None); // Merge iRT and MS2 into SpecMzInfos standardSpectra = standardMS.Spectra.Select(m => m.SpecMzInfo).ToList(); for (var i = 0; i < standardSpectra.Count; ++i) { if (standardIRTMap.TryGetValue(standardMS.Spectra[i].PeptidePrecursorNCE.NodePep, out var iRT)) { standardSpectra[i].RetentionTime = iRT; } } } } progressStatus = progressStatus.NextSegment(); // Predict fragment intensities PrositMS2Spectra ms = _intensityModel.PredictBatches(_prositClient, progress, ref progressStatus, _document.Settings, _peptides.Zip(_precursors, (pep, prec) => new PrositIntensityModel.PeptidePrecursorNCE(pep, prec, IsotopeLabelType.light, _nce)).ToArray(), CancellationToken.None); progressStatus = progressStatus.NextSegment(); var specMzInfo = ms.Spectra.Select(m => m.SpecMzInfo).ToList(); // Predict iRTs for peptides var distinctModifiedSequences = new HashSet <string>(); var distinctPeps = new List <PrositRetentionTimeModel.PeptideDocNodeWrapper>(); foreach (var p in _peptides) { if (distinctModifiedSequences.Add(p.ModifiedSequence)) { distinctPeps.Add(new PrositRetentionTimeModel.PeptideDocNodeWrapper(p)); } } var iRTMap = _rtModel.PredictBatches(_prositClient, progress, ref progressStatus, _document.Settings, distinctPeps, CancellationToken.None); progressStatus = progressStatus.NextSegment(); for (var i = 0; i < specMzInfo.Count; ++i) { if (iRTMap.TryGetValue(ms.Spectra[i].PeptidePrecursorNCE.NodePep, out var iRT)) { specMzInfo[i].RetentionTime = iRT; } } // Build library var librarySpectra = SpectrumMzInfo.RemoveDuplicateSpectra(standardSpectra.Concat(specMzInfo).ToList()); // Delete if already exists, no merging with Prosit var libraryExists = File.Exists(LibrarySpec.FilePath); if (libraryExists) { var replace = _replaceLibrary(); if (!replace) { return(false); } FileEx.SafeDelete(LibrarySpec.FilePath); } if (!librarySpectra.Any()) { return(true); } progressStatus = progressStatus.NextSegment().ChangeMessage(Resources.SkylineWindow_SaveDocument_Saving___); // Build the library using (var blibDb = BlibDb.CreateBlibDb(LibrarySpec.FilePath)) { var docLibrarySpec = new BiblioSpecLiteSpec(LibrarySpec.Name, LibrarySpec.FilePath); BiblioSpecLiteLibrary docLibraryNew = null; var docLibrarySpec2 = docLibrarySpec; docLibraryNew = blibDb.CreateLibraryFromSpectra(docLibrarySpec2, librarySpectra, LibrarySpec.Name, progress, ref progressStatus); if (docLibraryNew == null) { return(false); } } return(true); }
private void ProcessTransitionGroup(IDictionary <LibKey, SpectrumMzInfo> spectra, PeptideGroupDocNode nodePepGroup, PeptideDocNode nodePep, TransitionGroupDocNode nodeTranGroup, int replicateIndex) { LibKey key; if (nodePep.IsProteomic) { var sequence = Document.Settings.GetPrecursorCalc(nodeTranGroup.TransitionGroup.LabelType, nodePep.ExplicitMods) .GetModifiedSequence(nodePep.Peptide.Target, SequenceModFormatType.lib_precision, false); key = new LibKey(sequence, nodeTranGroup.PrecursorAdduct.AdductCharge); } else { // For small molecules, the "modification" is expressed in the adduct key = new LibKey(nodeTranGroup.CustomMolecule.GetSmallMoleculeLibraryAttributes(), nodeTranGroup.PrecursorAdduct); } var mi = new List <SpectrumPeaksInfo.MI>(); var rt = 0.0; var im = IonMobilityAndCCS.EMPTY; var imGroup = TransitionGroupIonMobilityInfo.EMPTY; // CCS may be available only at group level var groupChromInfos = nodeTranGroup.GetSafeChromInfo(replicateIndex); if (!groupChromInfos.IsEmpty) { var chromInfo = groupChromInfos.First(info => info.OptimizationStep == 0); imGroup = chromInfo.IonMobilityInfo; } var maxApex = float.MinValue; var maxApexMs1 = float.MinValue; string chromFileName = null; double?mobilityMs1 = null; // Track MS1 ion mobility in order to derive high energy ion mobility offset value foreach (var nodeTran in nodeTranGroup.Transitions) { var chromInfos = nodeTran.GetSafeChromInfo(replicateIndex); if (chromInfos.IsEmpty) { continue; } var chromInfo = chromInfos.First(info => info.OptimizationStep == 0); if (chromInfo.Area == 0) { continue; } if (nodeTran.IsMs1) { // Track MS1 ion mobility in order to derive high energy ion mobility offset value if (chromInfo.Height > maxApexMs1) { maxApexMs1 = chromInfo.Height; mobilityMs1 = chromInfo.IonMobility.IonMobility.Mobility; } continue; } if (chromFileName == null) { var chromFileInfo = Document.Settings.MeasuredResults.Chromatograms[replicateIndex].MSDataFileInfos.FirstOrDefault(file => ReferenceEquals(file.Id, chromInfo.FileId)); if (chromFileInfo != null) { chromFileName = chromFileInfo.FilePath.GetFileName(); } } List <SpectrumPeakAnnotation> annotations = null; if (nodeTran.Transition.IsNonReporterCustomIon()) // CONSIDER(bspratt) include annotation for all non-peptide-fragment transitions? { var smallMoleculeLibraryAttributes = nodeTran.Transition.CustomIon.GetSmallMoleculeLibraryAttributes(); var ion = new CustomIon(smallMoleculeLibraryAttributes, nodeTran.Transition.Adduct, nodeTran.GetMoleculeMass()); annotations = new List <SpectrumPeakAnnotation> { SpectrumPeakAnnotation.Create(ion, nodeTran.Annotations.Note) }; } mi.Add(new SpectrumPeaksInfo.MI { Mz = nodeTran.Mz, Intensity = chromInfo.Area, Quantitative = nodeTran.ExplicitQuantitative, Annotations = annotations }); if (chromInfo.Height > maxApex) { maxApex = chromInfo.Height; rt = chromInfo.RetentionTime; var mobility = chromInfo.IonMobility.IonMobility; var mobilityHighEnergyOffset = 0.0; if (mobilityMs1.HasValue && mobility.HasValue && mobility.Mobility != mobilityMs1) { // Note any difference in MS1 and MS2 ion mobilities - the "high energy ion mobility offset" mobilityHighEnergyOffset = mobility.Mobility.Value - mobilityMs1.Value; mobility = mobility.ChangeIonMobility(mobilityMs1); } im = IonMobilityAndCCS.GetIonMobilityAndCCS(mobility, chromInfo.IonMobility.CollisionalCrossSectionSqA ?? imGroup.CollisionalCrossSection, mobilityHighEnergyOffset); } } if (chromFileName == null) { return; } SpectrumMzInfo spectrumMzInfo; if (!spectra.TryGetValue(key, out spectrumMzInfo)) { spectrumMzInfo = new SpectrumMzInfo { SourceFile = DocumentFilePath, Key = key, PrecursorMz = nodeTranGroup.PrecursorMz, SpectrumPeaks = new SpectrumPeaksInfo(mi.ToArray()), RetentionTimes = new List <SpectrumMzInfo.IonMobilityAndRT>(), IonMobility = im, Protein = nodePepGroup.Name, RetentionTime = rt }; spectra[key] = spectrumMzInfo; } var isBest = replicateIndex == nodePep.BestResult; if (isBest) { spectrumMzInfo.IonMobility = im; spectrumMzInfo.RetentionTime = rt; } spectrumMzInfo.RetentionTimes.Add(new SpectrumMzInfo.IonMobilityAndRT(chromFileName, im, rt, isBest)); }
public TransitionGroupLibraryIrtTriple(SpectrumMzInfo spectrumInfo, TransitionGroupDocNode nodeGroup, double? irt, double precursorMz) { SpectrumInfo = spectrumInfo; NodeGroup = nodeGroup; Irt = irt; PrecursorMz = precursorMz; }