private void DoCreateAnalyses(char[] excludeAas, int minTracerCount) { var peptides = new List <DbPeptide>(); bool includeMissingMs2 = cbxIncludeMissingMS2.Checked; _statusMessage = "Listing peptides"; using (var session = Workspace.OpenWriteSession()) { session.CreateCriteria(typeof(DbPeptide)).List(peptides); for (int i = 0; i < peptides.Count(); i++) { _statusMessage = "Peptide " + (i + 1) + "/" + peptides.Count; _progress = 100 * i / peptides.Count; if (_cancelled) { break; } var peptide = peptides[i]; if (peptide.Sequence.IndexOfAny(excludeAas) >= 0) { continue; } if (Workspace.GetMaxTracerCount(peptide.Sequence) < minTracerCount) { continue; } var dbPeptideAnalysis = (DbPeptideAnalysis)session.CreateCriteria(typeof(DbPeptideAnalysis)) .Add(Restrictions.Eq("Peptide", peptide)).UniqueResult(); if (dbPeptideAnalysis == null) { dbPeptideAnalysis = Peptide.CreateDbPeptideAnalysis(session, peptide); } var idList = new List <long>(); if (dbPeptideAnalysis.Id.HasValue) { var dataFileIdQuery = session.CreateQuery("SELECT A.MsDataFile.Id FROM " + typeof(DbPeptideFileAnalysis) + " A WHERE A.PeptideAnalysis.Id = :peptideAnalysisId") .SetParameter("peptideAnalysisId", dbPeptideAnalysis.Id); dataFileIdQuery.List(idList); } var existingDataFileIds = new HashSet <long>(idList); var psmTimesByDataFileId = peptide.PsmTimesByDataFileId(session); if (psmTimesByDataFileId.Count == 0) { continue; } session.BeginTransaction(); bool newAnalysis; if (dbPeptideAnalysis.Id.HasValue) { newAnalysis = false; } else { session.Save(dbPeptideAnalysis); newAnalysis = true; } var sqlStatementBuilder = new SqlStatementBuilder(session.GetSessionImplementation().Factory.Dialect); var insertStatements = new List <string>(); IList <MsDataFile> dataFiles; if (includeMissingMs2) { dataFiles = Workspace.MsDataFiles .Where(msDataFile => !existingDataFileIds.Contains(msDataFile.Id)) .ToArray(); } else { dataFiles = new List <MsDataFile>(); foreach (var grouping in psmTimesByDataFileId) { MsDataFile dataFile; if (existingDataFileIds.Contains(grouping.Key) || !Workspace.MsDataFiles.TryGetValue(grouping.Key, out dataFile)) { continue; } dataFiles.Add(dataFile); } } foreach (var msDataFile in dataFiles) { var dbPeptideFileAnalysis = PeptideFileAnalysis.CreatePeptideFileAnalysis(session, msDataFile, dbPeptideAnalysis, psmTimesByDataFileId); insertStatements.Add(sqlStatementBuilder.GetInsertStatement("DbPeptideFileAnalysis", new Dictionary <string, object> { { "ChromatogramEndTime", dbPeptideFileAnalysis.ChromatogramEndTime }, { "ChromatogramStartTime", dbPeptideFileAnalysis.ChromatogramStartTime }, { "MsDataFile", msDataFile.Id }, { "PeptideAnalysis", dbPeptideAnalysis.Id }, { "AutoFindPeak", 1 }, { "Version", 1 }, { "PeakCount", 0 }, { "PsmCount", dbPeptideFileAnalysis.PsmCount }, { "ValidationStatus", 0 }, } )); dbPeptideAnalysis.FileAnalysisCount++; existingDataFileIds.Add(msDataFile.Id); } sqlStatementBuilder.ExecuteStatements(session, insertStatements); session.Update(dbPeptideAnalysis); if (!newAnalysis) { session.Save(new DbChangeLog(Workspace, dbPeptideAnalysis)); } else { var dbWorkspace = Workspace.LoadDbWorkspace(session); session.Update(dbWorkspace); } session.Transaction.Commit(); } } }
private void AddSearchResults(IList <SearchResult> searchResults, Dictionary <string, DbPeptide> peptides, Dictionary <string, DbMsDataFile> dataFiles) { String baseMessage = _message; if (searchResults == null) { return; } var dbPeptideSearchResults = GetSearchResults(); var modifiedPeptides = new HashSet <DbPeptide>(); var searchResultsToInsert = new Dictionary <SearchResultKey, DbPeptideSpectrumMatch>(); var searchResultsToUpdate = new Dictionary <SearchResultKey, DbPeptideSpectrumMatch>(); using (var session = Workspace.OpenWriteSession()) { var statementBuilder = new SqlStatementBuilder(session.GetSessionImplementation().Factory.Dialect); var dbWorkspace = Workspace.LoadDbWorkspace(session); session.BeginTransaction(); var newPeptides = new Dictionary <String, Dictionary <String, object> >(); foreach (var searchResult in searchResults) { var trimmedSequence = Peptide.TrimSequence(searchResult.Sequence); if (peptides.ContainsKey(trimmedSequence) || newPeptides.ContainsKey(trimmedSequence)) { continue; } newPeptides.Add(trimmedSequence, new Dictionary <string, object> { { "Sequence", trimmedSequence }, { "FullSequence", searchResult.Sequence }, { "Version", 1 }, { "ValidationStatus", 0 } }); } if (newPeptides.Count > 0) { long maxPeptideId = (long?)session.CreateQuery("SELECT Max(T.Id) FROM DbPeptide T").UniqueResult() ?? 0; var insertStatements = new List <String>(); foreach (var dict in newPeptides.Values) { insertStatements.Add(statementBuilder.GetInsertStatement("DbPeptide", dict)); } statementBuilder.ExecuteStatements(session, insertStatements); var criteria = session.CreateCriteria(typeof(DbPeptide)) .Add(Restrictions.Gt("Id", maxPeptideId)); foreach (DbPeptide dbPeptide in criteria.List()) { peptides.Add(dbPeptide.Sequence, dbPeptide); } } foreach (var searchResult in searchResults) { var trimmedSequence = Peptide.TrimSequence(searchResult.Sequence); DbPeptide dbPeptide; if (!peptides.TryGetValue(trimmedSequence, out dbPeptide)) { // should not happen continue; } if (searchResult.Filename == null) { continue; } DbMsDataFile dbMsDataFile; if (!dataFiles.TryGetValue(searchResult.Filename, out dbMsDataFile)) { dbMsDataFile = new DbMsDataFile { Name = searchResult.Filename, Label = searchResult.Filename, }; session.Save(dbMsDataFile); dataFiles.Add(dbMsDataFile.Name, dbMsDataFile); } var key = new SearchResultKey(dbMsDataFile, dbPeptide, searchResult.RetentionTime); DbPeptideSpectrumMatch dbPeptideSpectrumMatch; if (dbPeptideSearchResults.TryGetValue(key, out dbPeptideSpectrumMatch)) { bool changed = false; if (dbPeptideSpectrumMatch.ModifiedSequence == null && searchResult.ModifiedSequence != null) { dbPeptideSpectrumMatch.ModifiedSequence = searchResult.ModifiedSequence; changed = true; } if (!dbPeptideSpectrumMatch.PrecursorMz.HasValue && searchResult.PrecursorMz.HasValue) { dbPeptideSpectrumMatch.PrecursorMz = searchResult.PrecursorMz; dbPeptideSpectrumMatch.PrecursorCharge = searchResult.PrecursorCharge; changed = true; } if (!changed) { continue; } searchResultsToUpdate[key] = dbPeptideSpectrumMatch; } else { if (!searchResultsToInsert.TryGetValue(key, out dbPeptideSpectrumMatch)) { dbPeptideSpectrumMatch = new DbPeptideSpectrumMatch { MsDataFile = dbMsDataFile, Peptide = dbPeptide, RetentionTime = searchResult.RetentionTime, PrecursorCharge = searchResult.PrecursorCharge, PrecursorMz = searchResult.PrecursorMz, ModifiedSequence = searchResult.ModifiedSequence, }; searchResultsToInsert.Add(key, dbPeptideSpectrumMatch); if (!newPeptides.ContainsKey(trimmedSequence)) { modifiedPeptides.Add(dbPeptide); } } } } var statements = new List <string>(); foreach (var dbPeptideSearchResult in searchResultsToInsert.Values) { statements.Add(statementBuilder.GetInsertStatement("DbPeptideSpectrumMatch", new Dictionary <string, object> { { "MsDataFile", dbPeptideSearchResult.MsDataFile.Id }, { "Peptide", dbPeptideSearchResult.Peptide.Id }, { "RetentionTime", dbPeptideSearchResult.RetentionTime }, { "ModifiedSequence", dbPeptideSearchResult.ModifiedSequence }, { "PrecursorMz", dbPeptideSearchResult.PrecursorMz }, { "PrecursorCharge", dbPeptideSearchResult.PrecursorCharge }, { "Version", 1 }, })); } foreach (var dbPeptideSearchResult in searchResultsToUpdate.Values) { statements.Add(statementBuilder.GetUpdateStatement("DbPeptideSearchResult", new Dictionary <string, object> { { "RetentionTime", dbPeptideSearchResult.RetentionTime }, { "ModifiedSequence", dbPeptideSearchResult.ModifiedSequence }, { "PrecursorMz", dbPeptideSearchResult.PrecursorMz }, { "PrecursorCharge", dbPeptideSearchResult.PrecursorCharge }, { "Version", dbPeptideSearchResult.Version + 1 }, }, new Dictionary <string, object> { { "Id", dbPeptideSearchResult.Id.GetValueOrDefault() } } )); } statementBuilder.ExecuteStatements(session, statements); UpdateProgress(baseMessage + "(Committing transaction)", 99); session.Transaction.Commit(); } }