private List<TableExporter.TableTreeNode> getSpectrumSourceGroupTree(DataFilter viewFilter, DataFilter dataFilter, ISession session) { var groupTreeHeaders = new List<string> { "'Group'", "'Filtered Spectra'", "'Distinct Peptides'", "'Distinct Matches'", "'Distinct Analyses'", "'Distinct Charges'" }; var sourceTreeHeaders = new List<string> { "'Source'", "'Filtered Spectra'", "'Distinct Peptides'", "'Distinct Matches'", "'Distinct Analyses'", "'Distinct Charges'" }; var groupNodes = new List<TableExporter.TableTreeNode>(); var groups = session.CreateQuery(SpectrumTableForm.AggregateRow.Selection + ", ssgl " + dataFilter.GetFilteredQueryString(DataFilter.FromPeptideSpectrumMatch, DataFilter.PeptideSpectrumMatchToProtein, DataFilter.PeptideSpectrumMatchToSpectrumSourceGroupLink) + "GROUP BY ssgl.Group.id") .List<object[]>() .Select(o => new SpectrumTableForm.SpectrumSourceGroupRow(o, viewFilter)); foreach (var group in groups) { var newNode = new TableExporter.TableTreeNode { Text = group.SpectrumSourceGroup.Name, Headers = groupTreeHeaders, Cells = new List<string> { "'" + group.SpectrumSourceGroup.Name + "'", group.Spectra.ToString(), group.DistinctPeptides.ToString(), group.DistinctMatches.ToString(), group.DistinctAnalyses.ToString(), group.DistinctCharges.ToString() } }; var groupFilter = new DataFilter(viewFilter) { SpectrumSourceGroup = new List<SpectrumSourceGroup> { group.SpectrumSourceGroup } }; var sources = session.CreateQuery(SpectrumTableForm.AggregateRow.Selection + ", s.Source " + groupFilter.GetFilteredQueryString(DataFilter.FromPeptideSpectrumMatch, DataFilter.PeptideSpectrumMatchToProtein, DataFilter.PeptideSpectrumMatchToSpectrumSourceGroupLink) + "GROUP BY s.Source.id") .List<object[]>() .Select(o => new SpectrumTableForm.SpectrumSourceRow(o, groupFilter)); SpectrumTableForm.SpectrumSourceGroupRow ssgr = group; sources = from SpectrumTableForm.SpectrumSourceRow s in sources where s.SpectrumSource.Group == ssgr.SpectrumSourceGroup select s; foreach (var source in sources) { var newSubNode = new TableExporter.TableTreeNode { Text = "source" + source.SpectrumSource.Id ?? string.Empty + ".html", Headers = sourceTreeHeaders, Cells = new List<string> { String.Format("'<a href=\"{0}.html\">{0}</a>'", source.SpectrumSource.Name), source.Spectra.ToString(), source.DistinctPeptides.ToString(), source.DistinctMatches.ToString(), source.DistinctAnalyses.ToString(), source.DistinctCharges.ToString() } }; newNode.Nodes.Add(newSubNode); } groupNodes.Add(newNode); } return groupNodes; }
private Dictionary<string, List<TableExporter.TableTreeNode>> getSourceContentsForHTML(DataFilter viewFilter, DataFilter dataFilter, ISession session) { const int decimalPlaces = 4; var allContents = new Dictionary<string, List<TableExporter.TableTreeNode>>(); //get score info //score gathering is one of the most time-intensive processes in item retreaval //loading everything to memory if possible should speed things up significantly //low speed system should stay in place in case memory cant handle the load var rawScoreList = session.CreateSQLQuery("select name, id from PeptideSpectrumMatchScoreName").List<object[]>(); var scoreList = new List<string>(); var scoreNameToId = new Dictionary<string, string>(); foreach (var item in rawScoreList) { scoreList.Add(item[0].ToString()); if (!scoreNameToId.ContainsKey(item[0].ToString())) scoreNameToId.Add(item[0].ToString(), item[1].ToString()); } var scoresCaptured = true; var scoreCache = new Dictionary<string, Dictionary<string, string>>(); try { var allScores = session.CreateSQLQuery("Select PsmID, ScoreNameId, CAST(Value AS TEXT) from PeptideSpectrumMatchScore").List(); foreach (var row in allScores) { var rowContents = (object[])row; if (!scoreCache.ContainsKey(rowContents[0].ToString())) scoreCache.Add(rowContents[0].ToString(), new Dictionary<string, string>()); if (!scoreCache[rowContents[0].ToString()].ContainsKey(rowContents[1].ToString())) scoreCache[rowContents[0].ToString()].Add(rowContents[1].ToString(), rowContents[2].ToString()); } } catch (Exception e) { scoresCaptured = false; var errorMessage = "[SpectrumTableForm] Error when precaching data. " + "Results may be processed slower than expected - " + Environment.NewLine + e.Message; if (InvokeRequired) Invoke(new Action(() => MessageBox.Show(errorMessage))); else MessageBox.Show(errorMessage); } var sourceTreeHeaders = new List<string> { "'Spectrum'", "'Distinct Peptides'", "'Distinct Analyses'", "'Distinct Charges'", "'Precursor M/Z'" }; var psmHeaders = new List<string>() { "'Rank'", "'Charge'", "'Observed Mass'", "'Monoisotopic Mass'", "'Mass Error'", "'Q Value'", "'Sequence'" }; psmHeaders.AddRange(scoreList.Select(item => string.Format("'{0}'", item))); //get source info var sources = session.QueryOver<SpectrumSource>().List(); foreach (var source in sources) { var exportTable = new List<TableExporter.TableTreeNode>(); var sourceFilter = new DataFilter(dataFilter) { SpectrumSource = new List<SpectrumSource> { source } }; var grouping = new List<Grouping<GroupBy>> { new Grouping<GroupBy>(true) { Mode = GroupBy.Spectrum } }; var spectraRows = SpectrumTableForm.getSpectrumRows(session, grouping, sourceFilter); foreach (SpectrumTableForm.SpectrumRow spectra in spectraRows) { var key = spectra.Spectrum.NativeID; try { key = pwiz.CLI.msdata.id.abbreviate(key); } catch { } var newBranch = new TableExporter.TableTreeNode { Text = key, Headers = sourceTreeHeaders, Cells = new List<string> { "'" + key + "'", spectra.DistinctPeptides.ToString(), spectra.DistinctAnalyses.ToString(), spectra.DistinctCharges.ToString(), Math.Round(spectra.Spectrum.PrecursorMZ,decimalPlaces).ToString() } }; foreach (var match in spectra.Spectrum.Matches) { var observedMass = match.Spectrum.PrecursorMZ * match.Charge - match.Charge * pwiz.CLI.chemistry.Proton.Mass; var matchNode = new TableExporter.TableTreeNode { Text = match.Rank.ToString(), Headers = psmHeaders }; var cells = new List<string> { "'" + match.Rank + "'", match.Charge.ToString(), Math.Round(observedMass,decimalPlaces).ToString(), Math.Round(match.ObservedNeutralMass,decimalPlaces).ToString(), Math.Round(match.MonoisotopicMassError,decimalPlaces).ToString(), Math.Round(match.QValue,decimalPlaces).ToString(), "'" + match.Peptide.Sequence + "'" }; foreach (var score in scoreList) { if (scoresCaptured) { var scoreValue = scoreCache[match.Id.ToString()][scoreNameToId[score]]; cells.Add(Math.Round(double.Parse(scoreValue), decimalPlaces).ToString()); } else { try { cells.Add(Math.Round(match.Scores[score.Trim("'".ToCharArray())], decimalPlaces).ToString()); } catch { cells.Add(string.Empty); } } } matchNode.Cells = cells; newBranch.Nodes.Add(matchNode); } exportTable.Add(newBranch); } allContents.Add(source.Name, exportTable); } return allContents; }