Пример #1
0
        public void Add(SpectrumSource ss)
        {
            byte[] msdataBytes = null;
            if (ss.Metadata != null)
            {
                string tmpFilepath = Path.GetTempFileName() + ".mz5";
                msdata.MSDataFile.write(ss.Metadata, tmpFilepath,
                                        new msdata.MSDataFile.WriteConfig
                {
                    format      = MSDataFile.Format.Format_MZ5,
                    compression = MSDataFile.Compression.Compression_Zlib
                });
                msdataBytes = File.ReadAllBytes(tmpFilepath);
                File.Delete(tmpFilepath);
            }

            insertRow(Table.SpectrumSource, new object[] { ss.Id, ss.Name, ss.URL, ss.Group.Id });
            insertRow(Table.SpectrumSourceMetadata, new object[] { ss.Id, msdataBytes });
        }
Пример #2
0
        public IList <string> WriteIdpXml(bool includeScores, bool writeModFormula)
        {
            // get the set of distinct analysis/source pairs
            var analysisSourcePairs = session.CreateQuery("SELECT psm.Analysis, psm.Spectrum.Source " +
                                                          "FROM PeptideSpectrumMatch psm " +
                                                          "GROUP BY psm.Analysis.id, psm.Spectrum.Source.id")
                                      .List <object[]>();

            // get the set of sources that have been in more than one analysis
            var multiAnalyzedSources = session.CreateQuery("SELECT psm.Spectrum.Source.id " +
                                                           "FROM PeptideSpectrumMatch psm " +
                                                           "GROUP BY psm.Spectrum.Source.id " +
                                                           "HAVING COUNT(DISTINCT psm.Analysis.id) > 1")
                                       .List <long>();

            var outputPaths = new List <string>();

            foreach (object[] analysisSourcePair in analysisSourcePairs)
            {
                Analysis       a  = analysisSourcePair[0] as Analysis;
                SpectrumSource ss = analysisSourcePair[1] as SpectrumSource;

                var settings = new XmlWriterSettings()
                {
                    NewLineHandling = NewLineHandling.Replace,
                    NewLineChars    = "\n",
                    Indent          = true,
                    IndentChars     = "\t"
                };

                string outputSuffix = ".idpXML";
                if (multiAnalyzedSources.Contains(ss.Id.GetValueOrDefault()))
                {
                    outputSuffix = "-" + a.Software.Name + "-" + a.StartTime.GetValueOrDefault().ToUniversalTime().ToString("yyyyMMddTHHmmss'Z'") + outputSuffix;
                }
                outputPaths.Add(ss.Name + outputSuffix);

                var writer = XmlWriter.Create(outputPaths.Last(), settings);
                writer.WriteStartDocument();
                writer.WriteStartElement("idPickerPeptides");

                #region <proteinIndex>
                var proteinRows = session.CreateQuery("SELECT DISTINCT pro " +
                                                      "FROM Protein pro " +
                                                      "JOIN pro.Peptides pi " +
                                                      "JOIN pi.Peptide.Matches psm " +
                                                      "WHERE psm.Spectrum.Source.id = " + ss.Id)
                                  .List <Protein>();
                writer.WriteStartElement("proteinIndex");
                writer.WriteAttribute("count", proteinRows.Count);
                foreach (Protein pro in proteinRows)
                {
                    writer.WriteStartElement("protein");
                    writer.WriteAttribute("id", pro.Id);
                    writer.WriteAttribute("locus", pro.Accession);
                    writer.WriteAttribute("decoy", 0);
                    writer.WriteAttribute("length", pro.Length);
                    writer.WriteAttribute("description", pro.Description);
                    writer.WriteEndElement();
                }
                writer.WriteEndElement(); // proteinIndex
                #endregion

                #region <peptideIndex>
                var peptideRows = session.CreateQuery("SELECT DISTINCT psm.Peptide " +
                                                      "FROM PeptideSpectrumMatch psm " +
                                                      "WHERE psm.Spectrum.Source.id = " + ss.Id)
                                  .List <Peptide>();
                writer.WriteStartElement("peptideIndex");
                writer.WriteAttribute("count", peptideRows.Count);
                foreach (Peptide pep in peptideRows)
                {
                    writer.WriteStartElement("peptide");
                    writer.WriteAttribute("id", pep.Id);
                    writer.WriteAttribute("sequence", pep.Sequence);
                    writer.WriteAttribute("mass", pep.MonoisotopicMass);
                    writer.WriteAttribute("unique", pep.Instances.Count > 1 ? 0 : 1);
                    writer.WriteAttribute("NTerminusIsSpecific", pep.Instances[0].NTerminusIsSpecific ? 1 : 0);
                    writer.WriteAttribute("CTerminusIsSpecific", pep.Instances[0].CTerminusIsSpecific ? 1 : 0);

                    foreach (PeptideInstance pi in pep.Instances)
                    {
                        writer.WriteStartElement("locus");
                        writer.WriteAttribute("id", pi.Protein.Id);
                        writer.WriteAttribute("offset", pi.Offset);
                        writer.WriteEndElement(); // locus
                    }

                    writer.WriteEndElement(); // peptide
                }
                writer.WriteEndElement();     // peptideIndex
                #endregion

                writer.WriteStartElement("spectraSources");
                writer.WriteAttribute("count", 1);
                {
                    writer.WriteStartElement("spectraSource");
                    writer.WriteAttribute("name", ss.Name);
                    writer.WriteAttribute("group", ss.Group.Name);
                    writer.WriteAttribute("count", ss.Spectra.Count);
                    {
                        #region <processingEventList>
                        writer.WriteStartElement("processingEventList");
                        writer.WriteAttribute("count", 2);
                        {
                            writer.WriteStartElement("processingEvent");
                            writer.WriteAttribute("type", "identification");
                            writer.WriteAttribute("start", a.StartTime.GetValueOrDefault().ToString("MM/dd/yyyy@HH:mm:ss"));
                            writer.WriteAttribute("end", a.StartTime.GetValueOrDefault().ToString("MM/dd/yyyy@HH:mm:ss")); // TODO: do we need end time?
                            writer.WriteAttribute("params", a.Parameters.Count);

                            if (a.Software != null)
                            {
                                a.Parameters.Add(new AnalysisParameter()
                                {
                                    Name = "software name", Value = a.Software.Name
                                });
                                a.Parameters.Add(new AnalysisParameter()
                                {
                                    Name = "software version", Value = a.Software.Version
                                });
                            }

                            foreach (AnalysisParameter ap in a.Parameters)
                            {
                                writer.WriteStartElement("processingParam");
                                writer.WriteAttribute("name", ap.Name);
                                writer.WriteAttribute("value", ap.Value);
                                writer.WriteEndElement(); // processingParam
                            }

                            if (a.Software != null)
                            {
                                a.Parameters.Remove(a.Parameters.Last());
                                a.Parameters.Remove(a.Parameters.Last());
                            }

                            writer.WriteEndElement(); // processingEvent

                            writer.WriteStartElement("processingEvent");
                            writer.WriteAttribute("type", "validation");
                            writer.WriteAttribute("start", DateTime.Now.ToString("MM/dd/yyyy@HH:mm:ss"));
                            writer.WriteAttribute("end", DateTime.Now.ToString("MM/dd/yyyy@HH:mm:ss"));
                            writer.WriteAttribute("params", a.Parameters.Count);

                            var validationParameters = new KeyValuePair <string, string>[]
                            {
                                new KeyValuePair <string, string>("software name", "IDPicker"),
                                new KeyValuePair <string, string>("software version", IDPicker.Util.Version),
                                new KeyValuePair <string, string>("MaxFDR", "1"),
                            };

                            foreach (var ap in validationParameters)
                            {
                                writer.WriteStartElement("processingParam");
                                writer.WriteAttribute("name", ap.Key);
                                writer.WriteAttribute("value", ap.Value);
                                writer.WriteEndElement(); // processingParam
                            }
                            writer.WriteEndElement();     // processingEvent
                        }
                        writer.WriteEndElement();         // processingEventList
                        #endregion

                        foreach (Spectrum s in ss.Spectra)
                        {
                            var psmList = s.Matches.Where(o => o.Analysis.Id == a.Id).OrderBy(o => o.Charge).ToList();
                            var distinctChargeStates = psmList.Select(o => o.Charge).Distinct();

                            // idpXML spectra are written per distinct charge state
                            foreach (int charge in distinctChargeStates)
                            {
                                var psmListAtCharge       = psmList.Where(o => o.Charge == charge).ToList();
                                var distinctRanksAtCharge = psmListAtCharge.Select(o => o.Rank).OrderBy(o => o).Distinct();

                                #region <spectrum ...>
                                writer.WriteStartElement("spectrum");
                                writer.WriteAttribute("id", s.NativeID);
                                writer.WriteAttribute("index", s.Index);
                                writer.WriteAttribute("z", charge);
                                writer.WriteAttribute("mass", (s.PrecursorMZ * charge) - (pwiz.CLI.chemistry.Proton.Mass * charge));
                                // TODO: writer.WriteAttribute("time", s.ScanStartTime);
                                writer.WriteAttribute("results", distinctRanksAtCharge.Count());

                                // a result is a set of ids at a distinct rank
                                foreach (int rank in distinctRanksAtCharge)
                                {
                                    var psmListAtRank = psmList.Where(o => o.Rank == rank).ToList();

                                    writer.WriteStartElement("result");
                                    writer.WriteAttribute("rank", rank);
                                    writer.WriteAttribute("FDR", psmListAtRank[0].QValue);
                                    writer.WriteAttribute("ids", psmListAtRank.Count);

                                    if (includeScores)
                                    {
                                        string scores = String.Join(" ", psmListAtRank[0].Scores.Select(o => String.Format("{0}={1}", o.Key, o.Value)).ToArray());
                                        writer.WriteAttribute("scores", scores);
                                    }

                                    foreach (PeptideSpectrumMatch psm in psmListAtRank)
                                    {
                                        writer.WriteStartElement("id");
                                        writer.WriteAttribute("peptide", psm.Peptide.Id);

                                        if (psm.Modifications.Count > 0)
                                        {
                                            var mods = new List <string>();
                                            foreach (PeptideModification pm in psm.Modifications)
                                            {
                                                string offset;
                                                switch (pm.Offset)
                                                {
                                                case int.MinValue: offset = "n"; break;

                                                case int.MaxValue: offset = "c"; break;

                                                default: offset = (pm.Offset + 1).ToString(); break;
                                                }
                                                mods.Add(String.Format("{0}:{1}", offset, writeModFormula ? pm.Modification.Formula : pm.Modification.MonoMassDelta.ToString()));
                                            }
                                            writer.WriteAttribute("mods", String.Join(" ", mods.ToArray()));
                                        }

                                        writer.WriteEndElement(); // id
                                    }
                                    writer.WriteEndElement();     // result
                                }
                                writer.WriteEndElement();         // spectrum
                                #endregion
                            }
                        }
                    }
                    writer.WriteEndElement(); // spectraSource
                }

                writer.WriteEndElement(); // spectraSources

                writer.WriteEndDocument();
                writer.Close();
            }

            return(outputPaths);
        }