Exemplo n.º 1
0
        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());
                }
        }