public string GenerateDocumentXml(SrmDocument doc, string oldXml) { if (doc == null) { return(null); } // Minimize document to only the peptides we need var minimalPeptides = StandardPeptides.ToHashSet(); var oldPeptides = new Dictionary <Target, PeptideDocNode>(); if (!string.IsNullOrEmpty(oldXml)) { try { using (var reader = new StringReader(oldXml)) { var oldDoc = (SrmDocument) new XmlSerializer(typeof(SrmDocument)).Deserialize(reader); oldPeptides = oldDoc.Molecules.Where(pep => minimalPeptides.Contains(pep.Target)).ToDictionary(pep => pep.Target, pep => pep); } } catch { // ignored } } var addPeptides = new List <PeptideDocNode>(); foreach (var nodePep in doc.Molecules.Where(pep => minimalPeptides.Contains(pep.Target))) { if (oldPeptides.TryGetValue(nodePep.Target, out var nodePepOld)) { addPeptides.Add(nodePep.Merge(nodePepOld)); oldPeptides.Remove(nodePep.Target); } else { addPeptides.Add(nodePep); } } addPeptides.AddRange(oldPeptides.Values); var peptides = new List <PeptideDocNode>(); foreach (var nodePep in addPeptides) { var precursors = new List <DocNode>(); foreach (TransitionGroupDocNode nodeTranGroup in nodePep.Children) { var transitions = nodeTranGroup.Transitions.Where(tran => tran.ResultsRank.HasValue).OrderBy(tran => tran.ResultsRank.Value).Cast <DocNode>().ToList(); if (transitions.Count > 0) { precursors.Add(nodeTranGroup.ChangeChildren(transitions)); } } if (precursors.Count > 0) { peptides.Add((PeptideDocNode)nodePep.ChangeChildren(precursors)); } } if (peptides.Count == 0) { return(null); } peptides.Sort((nodePep1, nodePep2) => nodePep1.ModifiedTarget.CompareTo(nodePep2.ModifiedTarget)); doc = (SrmDocument)doc.ChangeChildren(new[] { new PeptideGroupDocNode(new PeptideGroup(), Resources.IrtDb_MakeDocumentXml_iRT_standards, string.Empty, peptides.ToArray()) }); // Clear some settings to make the document smaller and so that they won't get imported into a document // TODO: Convert all modifications to explicit? doc = doc.ChangeMeasuredResults(null); doc = doc.ChangeSettings(doc.Settings.ChangePeptideLibraries(libs => libs.ChangeLibraries(new List <LibrarySpec>(), new List <Library>()))); using (var writer = new StringWriter()) using (var writer2 = new XmlTextWriter(writer)) { doc.Serialize(writer2, null, SkylineVersion.CURRENT, null); return(writer.ToString()); } }