private static void TestAddingSmallMolecule() { RunUI(() => SkylineWindow.SelectedPath = new IdentityPath(SkylineWindow.Document.MoleculeGroups.ElementAt(0).Id)); var doc = SkylineWindow.Document; var moleculeDlg = ShowDialog <EditCustomMoleculeDlg>(SkylineWindow.AddSmallMolecule); const int charge = 1; RunUI(() => { moleculeDlg.NameText = COOO13H; moleculeDlg.FormulaBox.Formula = COOO13H; moleculeDlg.Charge = charge; }); OkDialog(moleculeDlg, moleculeDlg.OkDialog); var compareIon = new DocNodeCustomIon(COOO13H, COOO13H); var newDoc = WaitForDocumentChange(doc); Assert.AreEqual(compareIon, newDoc.Molecules.ElementAt(0).CustomIon); Assert.AreEqual(compareIon, newDoc.MoleculeTransitionGroups.ElementAt(0).CustomIon); Assert.AreEqual(charge, newDoc.MoleculeTransitionGroups.ElementAt(0).PrecursorCharge); var predictedMz = BioMassCalc.MONOISOTOPIC.CalculateIonMz(COOO13H, charge); var actualMz = newDoc.MoleculeTransitionGroups.ElementAt(0).PrecursorMz; Assert.AreEqual(predictedMz, actualMz, Math.Pow(10, -SequenceMassCalc.MassPrecision)); }
private static void TestAddingTransition() { RunUI(() => { SkylineWindow.ExpandPrecursors(); var node = SkylineWindow.SequenceTree.Nodes[0].FirstNode.FirstNode; SkylineWindow.SequenceTree.SelectedNode = node; }); var moleculeDlg = ShowDialog <EditCustomMoleculeDlg>(SkylineWindow.AddSmallMolecule); RunUI(() => { moleculeDlg.FormulaBox.Formula = C12H12; moleculeDlg.NameText = testNametextA; moleculeDlg.Charge = 1; }); OkDialog(moleculeDlg, moleculeDlg.OkDialog); var newDoc = SkylineWindow.Document; var compareIon = new DocNodeCustomIon(C12H12, testNametextA); Assert.AreEqual(compareIon, newDoc.MoleculeTransitions.ElementAt(0).Transition.CustomIon); Assert.AreEqual(1, newDoc.MoleculeTransitions.ElementAt(0).Transition.Charge); // Verify that tree selection doesn't change just because we changed an ID object // (formerly the tree node would collapse and focus would jump up a level) RunUI(() => { Assert.AreEqual(SkylineWindow.SequenceTree.SelectedNode, SkylineWindow.SequenceTree.Nodes[0].FirstNode.FirstNode); }); }
public void OkDialog() { var helper = new MessageBoxHelper(this); var charge = 0; if (textCharge.Visible && !helper.ValidateSignedNumberTextBox(textCharge, _minCharge, _maxCharge, out charge)) { return; } if (RetentionTimeWindow.HasValue && !RetentionTime.HasValue) { helper.ShowTextBoxError(textRetentionTimeWindow, Resources.Peptide_ExplicitRetentionTimeWindow_Explicit_retention_time_window_requires_an_explicit_retention_time_value_); return; } Charge = charge; // Note: order matters here, this settor indirectly updates _formulaBox.MonoMass when formula is empty if (string.IsNullOrEmpty(_formulaBox.Formula)) { // Can the text fields be understood as mz? if (!_formulaBox.ValidateAverageText(helper)) { return; } if (!_formulaBox.ValidateMonoText(helper)) { return; } } var formula = _formulaBox.Formula; var monoMass = _formulaBox.MonoMass ?? 0; var averageMass = _formulaBox.AverageMass ?? 0; if (monoMass < CustomIon.MIN_MASS || averageMass < CustomIon.MIN_MASS) { _formulaBox.ShowTextBoxErrorFormula(helper, string.Format(Resources.EditCustomMoleculeDlg_OkDialog_Custom_molecules_must_have_a_mass_greater_than_or_equal_to__0__, CustomIon.MIN_MASS)); return; } if (monoMass > CustomIon.MAX_MASS || averageMass > CustomIon.MAX_MASS) { _formulaBox.ShowTextBoxErrorFormula(helper, string.Format(Resources.EditCustomMoleculeDlg_OkDialog_Custom_molecules_must_have_a_mass_less_than_or_equal_to__0__, CustomIon.MAX_MASS)); return; } if ((_transitionSettings != null) && (!_transitionSettings.IsMeasurablePrecursor(BioMassCalc.CalculateIonMz(monoMass, charge)) || !_transitionSettings.IsMeasurablePrecursor(BioMassCalc.CalculateIonMz(averageMass, charge)))) { _formulaBox.ShowTextBoxErrorFormula(helper, Resources.SkylineWindow_AddMolecule_The_precursor_m_z_for_this_molecule_is_out_of_range_for_your_instrument_settings_); return; } if (!string.IsNullOrEmpty(_formulaBox.Formula)) { try { ResultCustomIon = new DocNodeCustomIon(formula, textName.Text); } catch (InvalidDataException x) { _formulaBox.ShowTextBoxErrorFormula(helper, x.Message); return; } } else { ResultCustomIon = new DocNodeCustomIon(monoMass, averageMass, textName.Text); } // Did user change the list of heavy labels? if (_driverLabelType != null) { PeptideModifications modifications = new PeptideModifications( _peptideSettings.Modifications.StaticModifications, _peptideSettings.Modifications.MaxVariableMods, _peptideSettings.Modifications.MaxNeutralLosses, _driverLabelType.GetHeavyModifications(), // This is the only thing the user may have altered _peptideSettings.Modifications.InternalStandardTypes); var settings = _peptideSettings.ChangeModifications(modifications); // Only update if anything changed if (!Equals(settings, _peptideSettings)) { SrmSettings newSettings = _parent.DocumentUI.Settings.ChangePeptideSettings(settings); if (!_parent.ChangeSettings(newSettings, true)) { return; } _peptideSettings = newSettings.PeptideSettings; } } // See if this combination of charge and label would conflict with any existing transition groups if (_existingIds != null && _existingIds.Any(t => { var transitionGroup = t as TransitionGroup; return(transitionGroup != null && Equals(transitionGroup.LabelType, IsotopeLabelType) && Equals(transitionGroup.PrecursorCharge, Charge) && !ReferenceEquals(t, _initialId)); })) { helper.ShowTextBoxError(textName, Resources.EditCustomMoleculeDlg_OkDialog_A_precursor_with_that_charge_and_label_type_already_exists_, textName.Text); return; } // See if this would conflict with any existing transitions if (_existingIds != null && (_existingIds.Any(t => { var transition = t as Transition; return(transition != null && ((transition.Charge == Charge) && Equals(transition.CustomIon, ResultCustomIon)) && !ReferenceEquals(t, _initialId)); }))) { helper.ShowTextBoxError(textName, Resources.EditCustomMoleculeDlg_OkDialog_A_similar_transition_already_exists_, textName.Text); return; } DialogResult = DialogResult.OK; }
private void TestAddingSmallMoleculePrecursor() { // Position ourselves on the first molecule var newDoc = SkylineWindow.Document; SelectNode(SrmDocument.Level.Molecules, 0); var moleculeDlg = ShowDialog <EditCustomMoleculeDlg>(SkylineWindow.AddSmallMolecule); const int charge = 1; var heavyFormula = COOO13H.Replace("O13", "O12O'"); RunUI(() => { moleculeDlg.NameText = heavyFormula; moleculeDlg.FormulaBox.Formula = heavyFormula; moleculeDlg.IsotopeLabelType = IsotopeLabelType.light; // This should provoke a failure - can't have two of the same label and charge }); RunDlg <MessageDlg>(moleculeDlg.OkDialog, dlg => { // Trying to exit the dialog should cause a warning about charge Assert.AreEqual( Resources.EditCustomMoleculeDlg_OkDialog_A_precursor_with_that_charge_and_label_type_already_exists_, dlg.Message); dlg.OkDialog(); // Dismiss the warning }); RunUI(() => { moleculeDlg.IsotopeLabelType = IsotopeLabelType.heavy; }); OkDialog(moleculeDlg, moleculeDlg.OkDialog); var compareIonHeavy = new DocNodeCustomIon(heavyFormula, heavyFormula); newDoc = WaitForDocumentChange(newDoc); Assert.AreEqual(heavyFormula, newDoc.MoleculeTransitionGroups.ElementAt(1).CustomIon.Name); Assert.AreEqual(compareIonHeavy, newDoc.MoleculeTransitionGroups.ElementAt(1).CustomIon); Assert.AreEqual(charge, newDoc.MoleculeTransitionGroups.ElementAt(1).TransitionGroup.PrecursorCharge); var predictedMz = BioMassCalc.MONOISOTOPIC.CalculateIonMz(heavyFormula, charge); var actualMz = newDoc.MoleculeTransitionGroups.ElementAt(1).PrecursorMz; Assert.AreEqual(predictedMz, actualMz, Math.Pow(10, -SequenceMassCalc.MassPrecision)); // Now verify that we are OK with different charge same label SelectNode(SrmDocument.Level.Molecules, 0); var moleculeDlg2 = ShowDialog <EditCustomMoleculeDlg>(SkylineWindow.AddSmallMolecule); RunUI(() => { moleculeDlg2.FormulaBox.Formula = COOO13H + "H"; moleculeDlg2.Charge = charge + 1; moleculeDlg2.IsotopeLabelType = IsotopeLabelType.light; // This should not provoke a failure }); OkDialog(moleculeDlg2, moleculeDlg2.OkDialog); // Verify that the transition group sort order is enforced in the document // Select the last precursor, bump its charge state to drop its mz - should result in doc node reordering CheckTransitionGroupSortOrder(newDoc); RunUI(() => { SkylineWindow.SequenceTree.SelectedNode = SkylineWindow.SequenceTree.Nodes[0].FirstNode.LastNode; }); var editMoleculeDlgB = ShowDialog <EditCustomMoleculeDlg>(SkylineWindow.ModifySmallMoleculeTransitionGroup); RunUI(() => { editMoleculeDlgB.Charge = 5; }); OkDialog(editMoleculeDlgB, editMoleculeDlgB.OkDialog); newDoc = WaitForDocumentChange(newDoc); CheckTransitionGroupSortOrder(newDoc); RunUI(SkylineWindow.Undo); newDoc = WaitForDocumentChange(newDoc); CheckTransitionGroupSortOrder(newDoc); }
protected override void DoTest() { const int molCount = 1; var doc = SkylineWindow.Document; for (var loop = 0; loop < 3; loop++) { // Should be able to synchronize of both sibs have formula, or neither, but not one of each string testname; switch (loop) { case 0: testname = "ions_testing_mixed.sky"; break; case 1: testname = "ions_testing.sky"; break; default: testname = "ions_testing_masses.sky"; break; } string testPath = TestFilesDir.GetTestPath(testname); RunUI(() => SkylineWindow.OpenFile(testPath)); doc = WaitForDocumentChange(doc); SelectNode(SrmDocument.Level.Molecules, 0); Assert.AreEqual(molCount, SkylineWindow.Document.MoleculeCount); RunUI(SkylineWindow.ExpandPrecursors); Settings.Default.SynchronizeIsotopeTypes = true; // Select the first transition group SelectNode(SrmDocument.Level.TransitionGroups, 0); // Add precursor transition to it var pickList = ShowDialog <PopupPickList>(SkylineWindow.ShowPickChildrenInTest); RunUI(() => { pickList.ApplyFilter(false); pickList.SetItemChecked(0, true); pickList.AutoManageChildren = false; pickList.IsSynchSiblings = true; // Cause a precursor transition to be added to heavy group }); OkDialog(pickList, pickList.OnOk); WaitForClosedForm(pickList); doc = WaitForDocumentChange(doc); if (loop == 0) { // No synch is possible - one ion is formula based, the other mass only Assert.AreEqual(1, doc.MoleculeTransitions.Count()); } else { // There should now be a precursor transition for the second, heavy labeled transition group, and it // should match the mz of the transition group Assert.AreNotEqual(doc.MoleculeTransitionGroups.ToArray()[0].PrecursorMz, doc.MoleculeTransitions.ToArray()[1].Mz); Assert.AreEqual(doc.MoleculeTransitionGroups.ToArray()[1].PrecursorMz, doc.MoleculeTransitions.ToArray()[1].Mz); } } // // Now with isotope distributions // var documentPath = TestFilesDir.GetTestPath("ions_testing_isotopes.sky"); RunUI(() => SkylineWindow.OpenFile(documentPath)); WaitForDocumentLoaded(); SelectNode(SrmDocument.Level.Molecules, 0); Assert.AreEqual(molCount, SkylineWindow.Document.MoleculeCount); RunUI(SkylineWindow.ExpandPrecursors); Settings.Default.SynchronizeIsotopeTypes = true; // Select the first transition group SelectNode(SrmDocument.Level.TransitionGroups, 0); // Add isotope labeled precursor transitions to it var pickList0 = ShowDialog <PopupPickList>(SkylineWindow.ShowPickChildrenInTest); RunUI(() => { pickList0.ApplyFilter(false); pickList0.SetItemChecked(0, true); pickList0.SetItemChecked(1, true); pickList0.SetItemChecked(2, true); pickList0.AutoManageChildren = false; Assert.IsTrue(pickList0.CanSynchSiblings); pickList0.IsSynchSiblings = true; // Cause precursor transitions to be added to heavy group }); OkDialog(pickList0, pickList0.OnOk); WaitForClosedForm(pickList0); Assert.AreEqual(SkylineWindow.Document.MoleculeTransitionGroups.ToArray()[1].PrecursorMz, SkylineWindow.Document.MoleculeTransitions.ToArray()[4].Mz); Assert.AreEqual(SkylineWindow.Document.MoleculeTransitionGroups.ToArray()[1].PrecursorMz + 1.00349556477, SkylineWindow.Document.MoleculeTransitions.ToArray()[5].Mz, 1e-6); // Verify that adding a custom transition prevents the synch siblings checkbox from appearing RunUI(() => { SkylineWindow.ExpandPrecursors(); var node = SkylineWindow.SequenceTree.Nodes[0].FirstNode.FirstNode; SkylineWindow.SequenceTree.SelectedNode = node; }); var moleculeDlg = ShowDialog <EditCustomMoleculeDlg>(SkylineWindow.AddSmallMolecule); var C12H12 = "C12H12"; var testNametextA = "y1"; RunUI(() => { moleculeDlg.FormulaBox.Formula = C12H12; moleculeDlg.NameText = testNametextA; moleculeDlg.Charge = 1; }); OkDialog(moleculeDlg, moleculeDlg.OkDialog); var newDoc = SkylineWindow.Document; var compareIon = new DocNodeCustomIon(C12H12, testNametextA); const int transY1Index = 3; Assert.AreEqual(compareIon, newDoc.MoleculeTransitions.ElementAt(transY1Index).Transition.CustomIon); Assert.AreEqual(1, newDoc.MoleculeTransitions.ElementAt(transY1Index).Transition.Charge); var pickList1 = ShowDialog <PopupPickList>(SkylineWindow.ShowPickChildrenInTest); RunUI(() => { pickList1.AutoManageChildren = true; Assert.IsFalse(pickList1.CanSynchSiblings); }); OkDialog(pickList1, pickList1.OnOk); Assert.AreEqual(7, newDoc.MoleculeTransitions.Count()); // Long as we're here, check mz filtering var transitionSettings = ShowDialog <TransitionSettingsUI>(SkylineWindow.ShowTransitionSettingsUI); RunUI(() => { transitionSettings.SelectedTab = TransitionSettingsUI.TABS.Instrument; transitionSettings.MinMz = 160; // Should drop that custom ion }); OkDialog(transitionSettings, transitionSettings.OkDialog); newDoc = WaitForDocumentChange(newDoc); Assert.AreEqual(6, newDoc.MoleculeTransitions.Count()); RunUI(() => { SkylineWindow.Undo(); }); newDoc = WaitForDocumentChange(newDoc); Assert.AreEqual(7, newDoc.MoleculeTransitions.Count()); RunUI(() => { SkylineWindow.ExpandPrecursors(); var node = SkylineWindow.SequenceTree.Nodes[0].FirstNode.Nodes[1]; SkylineWindow.SequenceTree.SelectedNode = node; }); var pickList2 = ShowDialog <PopupPickList>(SkylineWindow.ShowPickChildrenInTest); RunUI(() => { Assert.IsFalse(pickList2.CanSynchSiblings); // The light set has a non-precursor transition }); OkDialog(pickList2, pickList2.OnOk); var transitionSettings2 = ShowDialog <TransitionSettingsUI>(SkylineWindow.ShowTransitionSettingsUI); RunUI(() => { transitionSettings2.SelectedTab = TransitionSettingsUI.TABS.Instrument; transitionSettings2.MinMz = 300; // Should drop that custom ion }); OkDialog(transitionSettings2, transitionSettings2.OkDialog); newDoc = WaitForDocumentChange(newDoc); Assert.AreEqual(6, newDoc.MoleculeTransitions.Count()); var pickList3 = ShowDialog <PopupPickList>(SkylineWindow.ShowPickChildrenInTest); RunUI(() => { Assert.IsTrue(pickList3.CanSynchSiblings); }); OkDialog(pickList3, pickList3.OnOk); }