public ProgressForm(IEnumerable <string> taskNames, IterationListenerRegistry ilr) { InitializeComponent(); _progressCellByTaskName = new Dictionary <string, DataGridViewProgressCell>(); _textBoxLogByTaskName = new Dictionary <string, TextBox>(); _lastMessageByTaskName = new Dictionary <string, string>(); _rowByTaskName = new Dictionary <string, DataGridViewRow>(); _tasksDone = 0; _ilr = ilr; _ilProxy = new IterationListenerProxy() { form = this }; _ilr.addListener(_ilProxy, 1000); var boxShown = false; foreach (var task in taskNames) { var textBox = _textBoxLogByTaskName[task] = new TextBox { Text = String.Format("{0}{1}{0}Starting...{0}", Environment.NewLine, new string('-', 30)), Dock = DockStyle.Fill, Multiline = true, ScrollBars = ScrollBars.Vertical }; if (boxShown) { textBox.Visible = false; } else { textBox.Visible = true; boxShown = true; } ProgressSplit.Panel2.Controls.Add(textBox); JobDataView.Rows.Add(task, 0); var row = JobDataView.Rows[JobDataView.Rows.Count - 1]; row.Tag = textBox; _rowByTaskName[task] = row; _progressCellByTaskName[task] = row.Cells[1] as DataGridViewProgressCell; _progressCellByTaskName[task].Text = "waiting"; } }
void processFile(string filename, Config config, ReaderList readers) { // read in data file using (var msdList = new MSDataList()) { string msg = String.Format("Opening file \"{0}\" for read...", filename); if (LogUpdate != null) { LogUpdate(msg, _info); } if (StatusUpdate != null) { StatusUpdate(msg, ProgressBarStyle.Marquee, _info); } readers.read(filename, msdList); foreach (var msd in msdList) { var outputFilename = config.outputFilename(filename, msd); if (filename == outputFilename) { throw new ArgumentException("Output filepath is the same as input filepath"); } if (StatusUpdate != null) { StatusUpdate("Waiting...", ProgressBarStyle.Marquee, _info); } // only one thread lock (calculateSHA1Mutex) { if (LogUpdate != null) { LogUpdate("Calculating SHA1 checksum...", _info); } if (StatusUpdate != null) { StatusUpdate("Calculating SHA1 checksum...", ProgressBarStyle.Marquee, _info); } MSDataFile.calculateSHA1Checksums(msd); } if (LogUpdate != null) { LogUpdate("Processing...", _info); } if (StatusUpdate != null) { StatusUpdate("Processing...", ProgressBarStyle.Marquee, _info); } SpectrumListFactory.wrap(msd, config.Filters); if ((msd.run.spectrumList == null) || msd.run.spectrumList.empty()) { if ((msd.run.chromatogramList != null) && !msd.run.chromatogramList.empty()) { msg = "Note: input contains only chromatogram data."; switch (config.WriteConfig.format) { case MSDataFile.Format.Format_MZ5: case MSDataFile.Format.Format_mzML: break; default: msg += " The selected output format can only represent spectra. Consider using mzML instead."; break; } } else { msg = "Note: input contains no spectra or chromatogram data."; } if (LogUpdate != null) { LogUpdate(msg, _info); } if (StatusUpdate != null) { StatusUpdate(msg, ProgressBarStyle.Continuous, _info); } } if (StatusUpdate != null && msd.run.spectrumList != null) { StatusUpdate(String.Format("Processing ({0} of {1})", DataGridViewProgressCell.MessageSpecialValue.CurrentValue, DataGridViewProgressCell.MessageSpecialValue.Maximum), ProgressBarStyle.Continuous, _info); } // write out the new data file var ilr = new IterationListenerRegistry(); ilr.addListener(this, 100); msg = String.Format("Writing \"{0}\"...", outputFilename); if (LogUpdate != null) { LogUpdate(msg, _info); } if (StatusUpdate != null) { StatusUpdate(msg, ProgressBarStyle.Continuous, _info); } MSDataFile.write(msd, outputFilename, config.WriteConfig, ilr); ilr.removeListener(this); } } }
private void embedAllButton_Click(object sender, EventArgs e) { var searchPath = new StringBuilder(searchPathTextBox.Text); string extensions = extensionsTextBox.Text; Application.UseWaitCursor = true; deleteAllButton.Enabled = embedAllButton.Enabled = false; embeddedChanges = true; try { // add location of original idpDBs to the search path var mergedFilepaths = session.CreateSQLQuery("SELECT DISTINCT Filepath FROM MergedFiles").List <string>(); foreach (var filepath in mergedFilepaths) { searchPath.AppendFormat(";{0}", System.IO.Path.GetDirectoryName(filepath)); } } catch { // ignore if MergedFiles does not exist } var quantitationMethodBySource = new Dictionary <int, Embedder.QuantitationConfiguration>(); var xicConfigBySource = new Dictionary <int, Embedder.XICConfiguration> { { 0, _defaultXicConfig } }; foreach (DataGridViewRow row in dataGridView.Rows) { int id = (int)row.Cells[idColumn.Index].Value; var method = QuantitationMethodForRow(row.Index); if (IsLabelFree(method)) { xicConfigBySource[id] = (Embedder.XICConfiguration)row.Cells[quantitationSettingsColumn.Index].Value; quantitationMethodBySource[id] = new Embedder.QuantitationConfiguration(QuantitationMethod.LabelFree, _defaultIsobaricConfig.ToString()); } else if (IsIsobaric(method)) { quantitationMethodBySource[id] = (Embedder.QuantitationConfiguration)row.Cells[quantitationSettingsColumn.Index].Value; } } okButton.Text = "Cancel"; EmbedInProgress = true; new Thread(() => { try { var ilr = new IterationListenerRegistry(); ilr.addListener(new EmbedderIterationListener(this), 1); var tempFolder = string.Empty; var splitSourceList = new List <List <string> >(); if (quantitationMethodBySource.Any(x => IsLabelFree(x.Value.QuantitationMethod)) && xicConfigBySource.Any(x => x.Value.AlignRetentionTime)) { tempFolder = getTempFolder(); splitSourceList = GetRTAlignGroups(); } string idpDbFilepath = session.Connection.GetDataSource(); if (embedScanTimeOnlyBox.Checked) { Embedder.EmbedScanTime(idpDbFilepath, searchPath.ToString(), extensions, quantitationMethodBySource, ilr); } else { Embedder.Embed(idpDbFilepath, searchPath.ToString(), extensions, quantitationMethodBySource, ilr); } if (quantitationMethodBySource.Any(x => IsLabelFree(x.Value.QuantitationMethod))) { BeginInvoke(new MethodInvoker(() => ModeandDefaultPanel.Visible = false)); if (xicConfigBySource.Any(x => x.Value.AlignRetentionTime)) { try { RTAlignPreparations(splitSourceList, tempFolder); foreach (var kvp in xicConfigBySource) { kvp.Value.RTFolder = tempFolder; } } catch (Exception rtError) { MessageBox.Show("Error: Cannot prepare RT alignment. Skipping to next stage." + Environment.NewLine + rtError.Message); foreach (var kvp in xicConfigBySource) { kvp.Value.AlignRetentionTime = false; } } } Embedder.EmbedMS1Metrics(idpDbFilepath, searchPath.ToString(), extensions, quantitationMethodBySource, xicConfigBySource, ilr); if (!string.IsNullOrEmpty(tempFolder) && Directory.Exists(tempFolder)) { Directory.Delete(tempFolder, true); } BeginInvoke(new MethodInvoker(() => ModeandDefaultPanel.Visible = true)); } } catch (Exception ex) { if (ex.Message.Contains("QuantitationConfiguration")) { string message = ex.Message.Replace("[QuantitationConfiguration] ", ""); message = Char.ToUpper(message[0]) + message.Substring(1); MessageBox.Show(message); } else if (ex.Message.Contains("no filepath")) { bool multipleMissingFilepaths = ex.Message.Contains("\n"); string missingFilepaths = ex.Message.Replace("\n", "\r\n"); missingFilepaths = missingFilepaths.Replace("[embed] no", "No"); missingFilepaths = missingFilepaths.Replace("[embedScanTime] no", "No"); MessageBox.Show(missingFilepaths + "\r\n\r\nCheck that " + (multipleMissingFilepaths ? "these source files" : "this source file") + " can be found in the search path with one of the specified extensions."); } else { Program.HandleException(ex); } } BeginInvoke(new MethodInvoker(() => Refresh())); }).Start(); }
void processFile(string filename, Config config, ReaderList readers, Map <string, int> usedOutputFilenames) { // read in data file using (var msdList = new MSDataList()) { string msg = String.Format("Opening file \"{0}\" for read...", filename); var stripCredentialsMatch = Regex.Match(filename, "https?://([^:]+:[^@]+@).*", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); if (stripCredentialsMatch.Success) { msg = msg.Replace(stripCredentialsMatch.Groups[1].Value, ""); } LogUpdate?.Invoke(msg, _info); StatusUpdate?.Invoke(msg, ProgressBarStyle.Marquee, _info); readers.read(filename, msdList, config.ReaderConfig); foreach (var msd in msdList) { try { var outputFilename = config.outputFilename(filename, msd); string deduplicatedFilename = outputFilename; StatusUpdate?.Invoke("Waiting...", ProgressBarStyle.Marquee, _info); // only one thread lock (_calculateSHA1Mutex) { // if output name is same as input name, add a suffix if (filename == outputFilename) { ++usedOutputFilenames[outputFilename]; } if (usedOutputFilenames.Contains(deduplicatedFilename)) { deduplicatedFilename = deduplicatedFilename.Replace(Path.GetExtension(outputFilename), String.Format(" ({0}).{1}", usedOutputFilenames[outputFilename] + 1, Path.GetExtension(outputFilename))); } ++usedOutputFilenames[outputFilename]; LogUpdate?.Invoke("Calculating SHA1 checksum...", _info); StatusUpdate?.Invoke("Calculating SHA1 checksum...", ProgressBarStyle.Marquee, _info); MSDataFile.calculateSHA1Checksums(msd); } var ilr = new IterationListenerRegistry(); ilr.addListenerWithTimer(this, 1); LogUpdate?.Invoke("Processing...", _info); StatusUpdate?.Invoke("Processing...", ProgressBarStyle.Marquee, _info); SpectrumListFactory.wrap(msd, config.Filters, ilr); config.WriteConfig.useWorkerThreads = msd.run.spectrumList.benefitsFromWorkerThreads(); if ((msd.run.spectrumList == null) || msd.run.spectrumList.empty()) { if ((msd.run.chromatogramList != null) && !msd.run.chromatogramList.empty()) { msg = "Note: input contains only chromatogram data."; switch (config.WriteConfig.format) { case MSDataFile.Format.Format_MZ5: case MSDataFile.Format.Format_mzML: break; default: msg += " The selected output format can only represent spectra. Consider using mzML instead."; break; } } else { msg = "Note: input contains no spectra or chromatogram data."; } LogUpdate?.Invoke(msg, _info); StatusUpdate?.Invoke(msg, ProgressBarStyle.Continuous, _info); } if (StatusUpdate != null && msd.run.spectrumList != null) { StatusUpdate(String.Format("Processing ({0} of {1})", DataGridViewProgressCell.MessageSpecialValue.CurrentValue, DataGridViewProgressCell.MessageSpecialValue.Maximum), ProgressBarStyle.Continuous, _info); } // write out the new data file msg = String.Format("Writing \"{0}\"...", deduplicatedFilename); LogUpdate?.Invoke(msg, _info); StatusUpdate?.Invoke(msg, ProgressBarStyle.Continuous, _info); MSDataFile.write(msd, deduplicatedFilename, config.WriteConfig, ilr); ilr.removeListener(this); } finally { msd.Dispose(); } } } }
private void embedAllButton_Click (object sender, EventArgs e) { var searchPath = new StringBuilder(searchPathTextBox.Text); string extensions = extensionsTextBox.Text; Application.UseWaitCursor = true; deleteAllButton.Enabled = embedAllButton.Enabled = false; embeddedChanges = true; try { // add location of original idpDBs to the search path var mergedFilepaths = session.CreateSQLQuery("SELECT DISTINCT Filepath FROM MergedFiles").List<string>(); foreach (var filepath in mergedFilepaths) searchPath.AppendFormat(";{0}", System.IO.Path.GetDirectoryName(filepath)); } catch { // ignore if MergedFiles does not exist } var quantitationMethodBySource = new Dictionary<int, Embedder.QuantitationConfiguration>(); var xicConfigBySource = new Dictionary<int, Embedder.XICConfiguration>{{0, _defaultXicConfig}}; foreach (DataGridViewRow row in dataGridView.Rows) { int id = (int) row.Cells[idColumn.Index].Value; var method = QuantitationMethodForRow(row.Index); if (IsLabelFree(method)) { xicConfigBySource[id] = (Embedder.XICConfiguration) row.Cells[quantitationSettingsColumn.Index].Value; quantitationMethodBySource[id] = new Embedder.QuantitationConfiguration(QuantitationMethod.LabelFree, _defaultIsobaricConfig.ToString()); } else if (IsIsobaric(method)) quantitationMethodBySource[id] = (Embedder.QuantitationConfiguration) row.Cells[quantitationSettingsColumn.Index].Value; } okButton.Text = "Cancel"; EmbedInProgress = true; new Thread(() => { try { var ilr = new IterationListenerRegistry(); ilr.addListener(new EmbedderIterationListener(this), 1); var tempFolder = string.Empty; var splitSourceList = new List<List<string>>(); if (quantitationMethodBySource.Any(x => IsLabelFree(x.Value.QuantitationMethod)) && xicConfigBySource.Any(x => x.Value.AlignRetentionTime)) { tempFolder = getTempFolder(); splitSourceList = GetRTAlignGroups(); } string idpDbFilepath = session.Connection.GetDataSource(); if (embedScanTimeOnlyBox.Checked) Embedder.EmbedScanTime(idpDbFilepath, searchPath.ToString(), extensions, quantitationMethodBySource, ilr); else Embedder.Embed(idpDbFilepath, searchPath.ToString(), extensions, quantitationMethodBySource, ilr); if (quantitationMethodBySource.Any(x => IsLabelFree(x.Value.QuantitationMethod))) { BeginInvoke(new MethodInvoker(() => ModeandDefaultPanel.Visible = false)); if (xicConfigBySource.Any(x => x.Value.AlignRetentionTime)) { try { RTAlignPreparations(splitSourceList, tempFolder); foreach (var kvp in xicConfigBySource) kvp.Value.RTFolder = tempFolder; } catch (Exception rtError) { MessageBox.Show("Error: Cannot prepare RT alignment. Skipping to next stage." + Environment.NewLine + rtError.Message); foreach (var kvp in xicConfigBySource) kvp.Value.AlignRetentionTime = false; } } Embedder.EmbedMS1Metrics(idpDbFilepath, searchPath.ToString(), extensions, quantitationMethodBySource, xicConfigBySource, ilr); if (!string.IsNullOrEmpty(tempFolder) && Directory.Exists(tempFolder)) Directory.Delete(tempFolder,true); BeginInvoke(new MethodInvoker(() => ModeandDefaultPanel.Visible = true)); } } catch (Exception ex) { if (ex.Message.Contains("QuantitationConfiguration")) { string message = ex.Message.Replace("[QuantitationConfiguration] ", ""); message = Char.ToUpper(message[0]) + message.Substring(1); MessageBox.Show(message); } else if (ex.Message.Contains("no filepath")) { bool multipleMissingFilepaths = ex.Message.Contains("\n"); string missingFilepaths = ex.Message.Replace("\n", "\r\n"); missingFilepaths = missingFilepaths.Replace("[embed] no", "No"); missingFilepaths = missingFilepaths.Replace("[embedScanTime] no", "No"); MessageBox.Show(missingFilepaths + "\r\n\r\nCheck that " + (multipleMissingFilepaths ? "these source files" : "this source file") + " can be found in the search path with one of the specified extensions."); } else Program.HandleException(ex); } BeginInvoke(new MethodInvoker(() => Refresh())); }).Start(); }
void processFile(string filename, Config config, ReaderList readers) { if (LogUpdate != null) { LogUpdate("Opening file...", _info); } if (StatusUpdate != null) { StatusUpdate("Opening file...", ProgressBarStyle.Marquee, _info); } // read in data file using (var msdList = new MSDataList()) { readers.read(filename, msdList); foreach (var msd in msdList) { var outputFilename = config.outputFilename(filename, msd); if (filename == outputFilename) { throw new ArgumentException("Output filepath is the same as input filepath"); } if (LogUpdate != null) { LogUpdate("Calculating SHA1 checksum...", _info); } if (StatusUpdate != null) { StatusUpdate("Calculating SHA1 checksum...", ProgressBarStyle.Marquee, _info); } // only one thread lock (calculateSHA1Mutex) MSDataFile.calculateSHA1Checksums(msd); if (LogUpdate != null) { LogUpdate("Processing...", _info); } if (StatusUpdate != null) { StatusUpdate("Processing...", ProgressBarStyle.Marquee, _info); } SpectrumListFactory.wrap(msd, config.Filters); if (StatusUpdate != null && msd.run.spectrumList != null) { StatusUpdate(String.Format("Processing ({0} of {1})", DataGridViewProgressCell.MessageSpecialValue.CurrentValue, DataGridViewProgressCell.MessageSpecialValue.Maximum), ProgressBarStyle.Continuous, _info); } // write out the new data file IterationListenerRegistry ilr = null; ilr = new IterationListenerRegistry(); ilr.addListener(this, 100); MSDataFile.write(msd, outputFilename, config.WriteConfig, ilr); } } }
void processFile(string filename, Config config, ReaderList readers) { // read in data file using (var msdList = new MSDataList()) { string msg = String.Format("Opening file \"{0}\" for read...",filename); if (LogUpdate != null) LogUpdate(msg, _info); if (StatusUpdate != null) StatusUpdate(msg, ProgressBarStyle.Marquee, _info); readers.read(filename, msdList); foreach (var msd in msdList) { var outputFilename = config.outputFilename(filename, msd); if (filename == outputFilename) throw new ArgumentException("Output filepath is the same as input filepath"); if (StatusUpdate != null) StatusUpdate("Waiting...", ProgressBarStyle.Marquee, _info); // only one thread lock (calculateSHA1Mutex) { if (LogUpdate != null) LogUpdate("Calculating SHA1 checksum...", _info); if (StatusUpdate != null) StatusUpdate("Calculating SHA1 checksum...", ProgressBarStyle.Marquee, _info); MSDataFile.calculateSHA1Checksums(msd); } if (LogUpdate != null) LogUpdate("Processing...", _info); if (StatusUpdate != null) StatusUpdate("Processing...", ProgressBarStyle.Marquee, _info); SpectrumListFactory.wrap(msd, config.Filters); if ((msd.run.spectrumList == null) || msd.run.spectrumList.empty()) { if ((msd.run.chromatogramList != null) && !msd.run.chromatogramList.empty()) { msg = "Note: input contains only chromatogram data."; switch (config.WriteConfig.format) { case MSDataFile.Format.Format_MZ5: case MSDataFile.Format.Format_mzML: break; default: msg += " The selected output format can only represent spectra. Consider using mzML instead."; break; } } else msg = "Note: input contains no spectra or chromatogram data."; if (LogUpdate != null) LogUpdate(msg, _info); if (StatusUpdate != null) StatusUpdate(msg, ProgressBarStyle.Marquee, _info); } if (StatusUpdate != null && msd.run.spectrumList != null) StatusUpdate(String.Format("Processing ({0} of {1})", DataGridViewProgressCell.MessageSpecialValue.CurrentValue, DataGridViewProgressCell.MessageSpecialValue.Maximum), ProgressBarStyle.Continuous, _info); // write out the new data file var ilr = new IterationListenerRegistry(); ilr.addListener(this, 100); msg = String.Format("Writing \"{0}\"...", outputFilename); if (LogUpdate != null) LogUpdate(msg, _info); if (StatusUpdate != null) StatusUpdate(msg, ProgressBarStyle.Marquee, _info); MSDataFile.write(msd, outputFilename, config.WriteConfig, ilr); ilr.removeListener(this); } } }
private void loadRefSeqGeneMetadata() { #region Check for updated gene2protein database and download it if (!File.Exists(Path.Combine(Application.StartupPath, "gene2protein.db3"))) throw new Exception("missing gene2protein.db3 mapping file"); /*string g2pTimestamp = null; string g2pPath = Path.Combine(Application.UserAppDataPath, "gene2protein.db3"); string g2pPathAlternate = Path.Combine(Application.StartupPath, "gene2protein.db3"); var copyUserToAlternate = new ProcessStartInfo("cmd.exe", String.Format("/C copy /Y \"{0}\" \"{1}\"", g2pPath, g2pPathAlternate)); copyUserToAlternate.CreateNoWindow = true; if (!File.Exists(g2pPath) && File.Exists(g2pPathAlternate)) File.Copy(g2pPathAlternate, g2pPath); else if (File.Exists(g2pPath) && !File.Exists(g2pPathAlternate)) { var p = Process.Start(copyUserToAlternate); p.WaitForExit(); if (p.ExitCode == 1) MessageBox.Show("Unable to copy gene2protein.db3 from user-specific path to application path:\r\n" + Path.GetDirectoryName(g2pPath) + "\r\nto\r\n" + Path.GetDirectoryName(g2pPathAlternate), "Unable to copy"); } if (File.Exists(g2pPath)) { // if the file exists, check its timestamp and compare it to the timestamp on the server using (var con = new SQLiteConnection(@"Data Source=" + g2pPath + ";Version=3")) { try { con.Open(); g2pTimestamp = con.ExecuteQuery("SELECT Timestamp FROM About").Single().GetString(0); } catch (Exception e) { throw new Exception("error getting timestamp of current gene2protein database (\"" + g2pPath + "\"): " + e.Message, e); } } string g2pURL = "http://fenchurch.mc.vanderbilt.edu/bin/g2p"; string g2pTimestampURL = String.Format("{0}/G2P_TIMESTAMP", g2pURL); string latestTimestamp; lock (Program.WebClient) { latestTimestamp = Program.WebClient.DownloadString(g2pTimestampURL).Trim(); } if (g2pTimestamp.CompareTo(latestTimestamp) < 0) { Invoke(new MethodInvoker(() => { var form = new NewVersionForm("RefSeq Gene to Protein Database", g2pTimestamp, latestTimestamp, String.Empty) { Owner = this, StartPosition = FormStartPosition.CenterParent }; if (form.ShowDialog() == DialogResult.Yes) { var oldG2Ptime = File.GetLastWriteTimeUtc(g2pPath); string backupG2Pname = String.Format("{0}.{1}.bak", g2pPath, oldG2Ptime.ToString("yyyyMMddHHmm")); try { if (!File.Exists(backupG2Pname)) File.Copy(g2pPath, backupG2Pname); File.Delete(g2pPath); string g2pDatabaseURL = String.Format("{0}/gene2protein.db3", g2pURL); lock (Program.WebClient) { Program.WebClient.DownloadFile(g2pDatabaseURL, g2pPath); var p = Process.Start(copyUserToAlternate); p.WaitForExit(); if (p.ExitCode == 1) MessageBox.Show("Unable to copy gene2protein.db3 from user-specific path to application path:\r\n" + Path.GetDirectoryName(g2pPath) + "\r\nto\r\n" + Path.GetDirectoryName(g2pPathAlternate), "Unable to copy"); } g2pTimestamp = latestTimestamp; } catch (Exception) { if (!File.Exists(g2pPath)) File.Move(backupG2Pname, g2pPath); } } else g2pTimestamp = null; // no update })); } else g2pTimestamp = null; // no update } else // downloading database for the first time (or it has been deleted) { string g2pURL = "http://fenchurch.mc.vanderbilt.edu/bin/g2p"; string g2pDatabaseURL = String.Format("{0}/gene2protein.db3", g2pURL); lock (Program.WebClient) { Program.WebClient.DownloadFile(g2pDatabaseURL, g2pPath); var p = Process.Start(copyUserToAlternate); p.WaitForExit(); if (p.ExitCode == 1) MessageBox.Show("Unable to copy gene2protein.db3 from user-specific path to application path:\r\n" + Path.GetDirectoryName(g2pPath) + "\r\nto\r\n" + Path.GetDirectoryName(g2pPathAlternate), "Unable to copy"); } }*/ #endregion if (session == null) return; try { clearSession(); var ilr = new IterationListenerRegistry(); ilr.addListener(progressMonitor.GetIterationListenerProxy(), 1); Embedder.EmbedGeneMetadata(Text, ilr); } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message, "embedding gene metadata failed"); } OpenFiles(new List<string> { Text }, null); }
void OpenFiles (IList<string> filepaths, TreeNode rootNode = null) { try { var xml_filepaths = filepaths.Where(filepath => !filepath.EndsWith(".idpDB")); var idpDB_filepaths = filepaths.Where(filepath => filepath.EndsWith(".idpDB")); bool openSingleFile = xml_filepaths.Count() + idpDB_filepaths.Count() == 1; if (xml_filepaths.Count() + idpDB_filepaths.Count() == 0) { if (Program.IsHeadless) { Console.Error.WriteLine("Headless mode must be passed some idpDB files to merge."); Close(); return; } else throw new Exception("no filepaths to open"); } if (Program.IsHeadless && xml_filepaths.Any()) Program.HandleUserError(new Exception("headless mode only supports merging and filtering idpDB files")); // warn if idpDBs already exist bool warnOnce = false, skipReconvert = false; var skipFiles = new List<string>(); foreach (string filepath in xml_filepaths) { string idpDB_filepath = Path.ChangeExtension(filepath.Replace(".pep.xml", ".pepXML"), ".idpDB"); if (File.Exists(idpDB_filepath)) { if (!warnOnce && MessageBox.Show("Some of these files have already been converted. Do you want to reconvert them?", "Result already converted", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) != DialogResult.Yes) skipReconvert = true; warnOnce = true; if (skipReconvert) skipFiles.Add(filepath); else File.Delete(idpDB_filepath); } } xml_filepaths = xml_filepaths.Where(o => !skipFiles.Contains(o)); idpDB_filepaths = idpDB_filepaths.Union(skipFiles.Select(o => Path.ChangeExtension(o.Replace(".pep.xml", ".pepXML"), ".idpDB"))); // determine if merged filepath exists and that it's a valid idpDB var potentialPaths = filepaths.Select(item => Path.Combine(Path.GetDirectoryName(item) ?? string.Empty, Path.GetFileNameWithoutExtension(item) ?? string.Empty) + ".idpDB").ToList(); // for Mascot files (*.dat), use parseSource() to get the real filename, else save time by just using filename without extension var sourceNames = filepaths.Select(o => Path.Combine(Path.GetDirectoryName(o), o.ToLower().EndsWith(".dat") ? Parser.ParseSource(o) : Path.GetFileNameWithoutExtension(o.Replace(".pep.xml", ".pepXML")) + Path.GetExtension(o))); string commonFilepath = Util.GetCommonFilename(sourceNames); if (!openSingleFile && potentialPaths.Contains(commonFilepath)) commonFilepath = commonFilepath.Replace(".idpDB", " (merged).idpDB"); string mergeTargetFilepath = defaultMergedOutputFilepath ?? commonFilepath; if (!openSingleFile && File.Exists(mergeTargetFilepath) && Program.IsHeadless) File.Delete(mergeTargetFilepath); else { // check that the single idpDB is writable; if not, it needs to be copied if (openSingleFile) { // sanity check that file exists after the path manipulation above if (idpDB_filepaths.Count() == 1 && !File.Exists(mergeTargetFilepath)) throw new Exception(String.Format("error in internal path manipulation for opening single idpDB: {0} transformed to {1} which does not exist", sourceNames.First(), mergeTargetFilepath)); string oldFilename = mergeTargetFilepath; while (true) { if (canReadWriteInDirectory(Path.GetDirectoryName(mergeTargetFilepath))) break; MessageBox.Show("IDPicker files cannot be opened from a read-only location, pick a writable path to copy it to."); if (!saveFileDialog(ref mergeTargetFilepath)) return; } // if location was changed, copy to the new location if (oldFilename != mergeTargetFilepath) { toolStripStatusLabel.Text = "Copying idpDB..."; File.Copy(oldFilename, mergeTargetFilepath, true); } } else { // if not headless and MergedOutputFilepath is unset, // then give the user a chance to override the merge target location if (!Program.IsHeadless && defaultMergedOutputFilepath == null && !saveFileDialog(ref mergeTargetFilepath, "Choose where to create the merged idpDB")) return; while (true) { if (!canReadWriteInDirectory(Path.GetDirectoryName(mergeTargetFilepath))) { MessageBox.Show("IDPicker files cannot be merged to a read-only location, pick a writable path."); if (Program.IsHeadless || !saveFileDialog(ref mergeTargetFilepath, "Pick a writable path in which to create the merged idpDB")) return; continue; } // the SaveFileDialog already asked the user to confirm overwriting an existing file if (File.Exists(mergeTargetFilepath)) File.Delete(mergeTargetFilepath); break; } } } // set main window title BeginInvoke(new MethodInvoker(() => Text = mergeTargetFilepath)); //set up delayed messages so non-fatal errors that occur at the end arent lost var delayedMessages = new List<string[]>(); if (xml_filepaths.Count() > 0) { importCancelled = false; // loop until the import settings don't result in any fatal errors, or user cancels while (!importCancelled) { Parser parser = new Parser(); Invoke(new MethodInvoker(() => parser.ImportSettings += importSettingsHandler)); var ilr = new IterationListenerRegistry(); var progressForm = new ProgressForm(xml_filepaths, ilr) { Text = "Import Progress", StartPosition = FormStartPosition.CenterParent, }; Invoke(new MethodInvoker(() => progressForm.Show(this))); try { parser.Parse(xml_filepaths, ilr); // read log for non-fatal errors //string log = Logger.Reader.ReadToEnd().Trim(); //if (log.Length > 0) // Invoke(new MethodInvoker(() => UserDialog.Show(this, "Log Messages", new TextBox {Multiline = true, Text = log.Replace("\n", "\r\n"), ReadOnly = true, Size = new Size(800, 600), ScrollBars = ScrollBars.Both}, MessageBoxButtons.OK))); break; // no fatal errors, break the loop } catch (Exception ex) { if (ex.Message.Contains("no peptides found mapping to a decoy protein") || ex.Message.Contains("peptides did not map to the database") || ex.Message.Contains("duplicate protein id")) Program.HandleUserError(ex); else throw; } finally { importCancelled |= progressForm.Cancelled; Invoke(new MethodInvoker(() => progressForm.Close())); } } if (importCancelled) return; idpDB_filepaths = idpDB_filepaths.Union(xml_filepaths.Select(o => Path.ChangeExtension(o.Replace(".pep.xml", ".pepXML"), ".idpDB"))); } if (idpDB_filepaths.Count() > 1) { var merger = new MergerWrapper(mergeTargetFilepath, idpDB_filepaths); toolStripStatusLabel.Text = "Merging results..."; merger.MergingProgress += progressMonitor.UpdateProgress; merger.Start(); idpDB_filepaths = new List<string>() {mergeTargetFilepath}; } // HACK: this needs to be handled more gracefully if (!IsHandleCreated) return; if (Properties.GUI.Settings.Default.WarnAboutNonFixedDrive && !Util.IsPathOnFixedDrive(mergeTargetFilepath)) { string oldFilename = mergeTargetFilepath; bool copyLocal = true; Invoke(new MethodInvoker(() => { var form = new NonFixedDriveWarningForm(); if (form.ShowDialog(this) == DialogResult.Ignore) copyLocal = false; })); if (copyLocal) { string newFilename = Path.GetFileName(mergeTargetFilepath); if (!saveFileDialog(ref newFilename, "Pick a local path to copy the idpDB to")) return; toolStripStatusLabel.Text = "Copying idpDB..."; File.Copy(oldFilename, newFilename, true); mergeTargetFilepath = newFilename; // set main window title BeginInvoke(new MethodInvoker(() => Text = mergeTargetFilepath)); } } if (!IsHandleCreated) return; Util.PrecacheFile(mergeTargetFilepath, progressMonitor.UpdateProgress); if (!IsHandleCreated) return; BeginInvoke(new MethodInvoker(() => { clearProgress(); toolStripStatusLabel.Text = "Upgrading schema and creating session factory..."; statusStrip.Refresh(); })); var sessionFactory = DataModel.SessionFactoryFactory.CreateSessionFactory(mergeTargetFilepath, new SessionFactoryConfig { WriteSqlToConsoleOut = true }); if (logForm != null) logForm.SetSessionFactory(sessionFactory); BeginInvoke(new MethodInvoker(() => { // reload qonverter settings because the ids may change after merging toolStripStatusLabel.Text = "Loading qonverter settings..."; statusStrip.Refresh(); session = sessionFactory.OpenSession(); session.DefaultReadOnly = true; session.CreateSQLQuery("PRAGMA temp_store=MEMORY; PRAGMA mmap_size=70368744177664; -- 2^46").ExecuteUpdate(); toolStripStatusLabel.Text = "Refreshing group structure..."; statusStrip.Refresh(); var usedGroups = GroupingControlForm.SetInitialStructure(rootNode, session, defaultApplySourceGroupHierarchy); if (usedGroups != null && usedGroups.Any()) { var allGroupsByName = session.Query<SpectrumSourceGroup>().ToDictionary(o => o.Name); var usedGroupsByName = usedGroups.ToDictionary(o => o.Name); // if usedGroupsByName does not contain a key from allGroupsByName, delete the group foreach (var unusedGroup in allGroupsByName.Where(o => !usedGroupsByName.ContainsKey(o.Key))) session.Delete(unusedGroup); } session.Flush(); // check for embedded gene metadata; // if it isn't there, ask the user if they want to embed it; // if not, disable gene-related features if (!Program.IsHeadless && !Embedder.HasGeneMetadata(mergeTargetFilepath) && Properties.GUI.Settings.Default.WarnAboutNoGeneMetadata) { bool embedGeneMetadata = true; Invoke(new MethodInvoker(() => { var form = new EmbedGeneMetadataWarningForm(); if (form.ShowDialog(this) == DialogResult.Ignore) embedGeneMetadata = false; })); if (embedGeneMetadata) { loadRefSeqGeneMetadata(); // will call OpenFiles() after embedding, so return immediately return; } } else { // disable gene-related features } qonverterSettingsByAnalysis = session.Query<QonverterSettings>().ToDictionary(o => session.Get<Analysis>(o.Id)); _layoutManager.SetSession(session); //set or save default layout dockPanel.Visible = true; _layoutManager.CurrentLayout = _layoutManager.GetCurrentDefault(); //breadCrumbControl.BreadCrumbs.Clear(); // pick a default RoundToNearest based on number of distinct modifications decimal roundToNearest = 1m; var distinctModificationFormat = new DistinctMatchFormat(); var modMasses = session.CreateQuery("SELECT DISTINCT mod.MonoMassDelta FROM Modification mod").List<double>(); for (int i = 4; i > 0; --i) { distinctModificationFormat.ModificationMassRoundToNearest = (decimal) (1.0 / Math.Pow(10, i)); if (modMasses.Select(o => distinctModificationFormat.Round(o)).Distinct().Count() < 30) { roundToNearest = distinctModificationFormat.ModificationMassRoundToNearest.Value; break; } } modificationTableForm.RoundToNearest = roundToNearest; basicFilter = DataFilter.LoadFilter(session); // if user has overridden filters from the command-line, make sure to reapply the filter if (!defaultDataFilter.PersistentDataFilter.Equals(defaultDataFilter.OriginalPersistentDataFilter)) basicFilter = null; if (basicFilter == null) { basicFilter = new DataFilter(defaultDataFilter); basicFilterControl.DataFilter = basicFilter; viewFilter = basicFilter; ApplyBasicFilter(); } else { basicFilterControl.DataFilter = basicFilter; viewFilter = basicFilter; try { // check that the unfiltered tables exist session.CreateSQLQuery("SELECT COUNT(*) FROM UnfilteredProtein").UniqueResult(); setData(); } catch { ApplyBasicFilter(); } } if (TestUILayout) { int i = 0; foreach(var form in dockPanel.Contents) { ++i; form.DockingHandler.DockAreas = (form.DockingHandler.DockAreas | DockAreas.Float); var rect = dockPanel.ClientRectangle; rect.Offset(i * 15, i * 15); rect.Size = new System.Drawing.Size(960, 600); form.DockingHandler.Show(dockPanel, rect); } } toolStripStatusLabel.Text = "Ready"; Activate(); })); //show list of delayed non-fatal errors if (delayedMessages.Any()) { var sb = new StringBuilder(); foreach (var message in delayedMessages) sb.AppendLine(string.Format("{0}:{1}{2}{1}", message[0], Environment.NewLine, message[1])); var messageString = sb.ToString(); ShowExpandedMessageBox(messageString); } } catch (Exception ex) { Program.HandleException(ex); } }
public ProgressForm(IEnumerable<string> taskNames, IterationListenerRegistry ilr) { InitializeComponent(); _progressCellByTaskName = new Dictionary<string, DataGridViewProgressCell>(); _textBoxLogByTaskName = new Dictionary<string, TextBox>(); _lastMessageByTaskName = new Dictionary<string, string>(); _rowByTaskName = new Dictionary<string, DataGridViewRow>(); _tasksDone = 0; _ilr = ilr; _ilProxy = new IterationListenerProxy() { form = this }; _ilr.addListener(_ilProxy, 1000); var boxShown = false; foreach (var task in taskNames) { var textBox = _textBoxLogByTaskName[task] = new TextBox { Text = String.Format("{0}{1}{0}Starting...{0}", Environment.NewLine, new string('-', 30)), Dock = DockStyle.Fill, Multiline = true, ScrollBars = ScrollBars.Vertical }; if (boxShown) textBox.Visible = false; else { textBox.Visible = true; boxShown = true; } ProgressSplit.Panel2.Controls.Add(textBox); JobDataView.Rows.Add(task, 0); var row = JobDataView.Rows[JobDataView.Rows.Count - 1]; row.Tag = textBox; _rowByTaskName[task] = row; _progressCellByTaskName[task] = row.Cells[1] as DataGridViewProgressCell; _progressCellByTaskName[task].Text = "waiting"; } }