protected override void DoTest() { // This test is quite specific to the input data set - needs results for all nodes to export the list. Shut off the special non-proteomic test mode, otherwise you get: // To export a scheduled method, you must first choose a retention time predictor in Peptide Settings / Prediction, or import results for all peptides in the document. TestSmallMolecules = false; // For now, CSV files are produced with invariant culture because some manufacturers do not handle internationalized CSVs. _cultureInfo = CultureInfo.InvariantCulture; _fieldSeparator = TextUtil.GetCsvSeparator(_cultureInfo); string isolationWidth = string.Format(_cultureInfo, "Narrow (~{0:0.0} m/z)", 1.3); const double slens = 1.234; // Load document which is already configured for DDA, and contains data for scheduling string standardDocumentFile = TestFilesDir.GetTestPath("BSA_Protea_label_free_meth3.sky"); RunUI(() => { SkylineWindow.OpenFile(standardDocumentFile); }); WaitForDocumentLoaded(); if (SmallMoleculeTestMode != RefinementSettings.ConvertToSmallMoleculesMode.none) { ConvertDocumentToSmallMolecules(SmallMoleculeTestMode, AsSmallMoleculesNegativeMode); WaitForDocumentLoaded(); } var t46 = 46.790; var t39 = 39.900; var halfWin = 1.0; if (AsExplicitRetentionTimes) { const double timeOffset = 10; // To verify that explicit retention times are in use const double winOffset = .4; RunUI(() => SkylineWindow.ModifyDocument("Convert to explicit retention times", document => { var refine = new RefinementSettings(); return(refine.ConvertToExplicitRetentionTimes(document, timeOffset, winOffset)); })); t46 += timeOffset; t39 += timeOffset; halfWin += winOffset * 0.5; } // Conversion to negative charge states shifts the masses var mzFirst = AsSmallMoleculesNegative ? 580.304419 : 582.318971; var mzLast = AsSmallMoleculesNegative ? 442.535468 : 444.55002; var zFirst = AsSmallMoleculesNegative ? -2 : 2; var zLast = AsSmallMoleculesNegative ? -3 : 3; var ceFirst = AsSmallMoleculesNegative ? 20.3 : 20.4; var ceLast = AsSmallMoleculesNegative ? 19.1 : 19.2; double?slensA = null; double?slensB = null; if (WithSLens) { slensA = slens; slensB = ThermoMassListExporter.DEFAULT_SLENS; } // Export Agilent unscheduled DDA list. ExportIsolationList( "AgilentUnscheduledDda.csv", ExportInstrumentType.AGILENT_TOF, FullScanAcquisitionMethod.None, ExportMethodType.Standard, AgilentIsolationListExporter.GetDdaHeader(_fieldSeparator), FieldSeparate("True", mzFirst, 20, zFirst, "Preferred", 0, string.Empty, isolationWidth, ceFirst), FieldSeparate("True", mzLast, 20, zLast, "Preferred", 0, string.Empty, isolationWidth, ceLast)); // Export Agilent scheduled DDA list. if (!AsSmallMoleculesNegative) // .skyd file chromatograms are not useful in this conversion due to mass shift { ExportIsolationList( "AgilentScheduledDda.csv", ExportInstrumentType.AGILENT_TOF, FullScanAcquisitionMethod.None, ExportMethodType.Scheduled, AgilentIsolationListExporter.GetDdaHeader(_fieldSeparator), FieldSeparate("True", mzFirst, 20, zFirst, "Preferred", t46, 2 * halfWin, isolationWidth, ceFirst), FieldSeparate("True", mzLast, 20, zLast, "Preferred", t39, 2 * halfWin, isolationWidth, ceLast)); } // Export Thermo unscheduled DDA list. const double nce = ThermoQExactiveIsolationListExporter.NARROW_NCE; var conversionDecorator = SmallMoleculeTestMode == RefinementSettings.ConvertToSmallMoleculesMode.none ? string.Empty : RefinementSettings.TestingConvertedFromProteomicPeptideNameDecorator; bool AsSmallMoleculeMasses = (SmallMoleculeTestMode == RefinementSettings.ConvertToSmallMoleculesMode.masses_only); var peptideA = AsSmallMoleculeMasses ? CustomMolecule.INVARIANT_NAME_DETAIL + " [1162.623390/1163.328090] (light)" : conversionDecorator + "LVNELTEFAK (light)"; var peptideB = AsSmallMoleculeMasses ? CustomMolecule.INVARIANT_NAME_DETAIL + " [1330.628231/1331.376801] (light)" : SmallMoleculeTestMode == RefinementSettings.ConvertToSmallMoleculesMode.none ? conversionDecorator + "IKNLQS[+79.966331]LDPSH (light)" : conversionDecorator + "IKNLQS[+80.0]LDPSH (light)"; var polarity = AsSmallMoleculesNegative ? "Negative" : "Positive"; var thermoQExactiveIsolationListExporter = new ThermoQExactiveIsolationListExporter(SkylineWindow.Document) { UseSlens = WithSLens }; ExportIsolationList( "ThermoUnscheduledDda.csv", ExportInstrumentType.THERMO_Q_EXACTIVE, FullScanAcquisitionMethod.None, ExportMethodType.Standard, thermoQExactiveIsolationListExporter.GetHeader(_fieldSeparator), FieldSeparate(mzFirst, string.Empty, string.Empty, Math.Abs(zFirst), polarity, string.Empty, string.Empty, nce, slensA, peptideA), FieldSeparate(mzLast, string.Empty, string.Empty, Math.Abs(zLast), polarity, string.Empty, string.Empty, nce, slensB, peptideB)); // Export Thermo scheduled DDA list. if (!AsSmallMoleculesNegative) // .skyd file chromatograms are not useful in this conversion due to mass shift { ExportIsolationList( "ThermoScheduledDda.csv", ExportInstrumentType.THERMO_Q_EXACTIVE, FullScanAcquisitionMethod.None, ExportMethodType.Scheduled, thermoQExactiveIsolationListExporter.GetHeader(_fieldSeparator), FieldSeparate(mzFirst, string.Empty, string.Empty, Math.Abs(zFirst), polarity, t46 - halfWin, t46 + halfWin, nce, slensA, peptideA), FieldSeparate(mzLast, string.Empty, string.Empty, Math.Abs(zLast), polarity, t39 - halfWin, t39 + halfWin, nce, slensB, peptideB)); } // Export Agilent unscheduled Targeted list. ExportIsolationList( "AgilentUnscheduledTargeted.csv", ExportInstrumentType.AGILENT_TOF, FullScanAcquisitionMethod.Targeted, ExportMethodType.Standard, AgilentIsolationListExporter.GetTargetedHeader(_fieldSeparator), FieldSeparate("True", mzFirst, zFirst, 0, string.Empty, isolationWidth, ceFirst, string.Empty), FieldSeparate("True", mzLast, zLast, 0, string.Empty, isolationWidth, ceLast, string.Empty)); // Export Agilent scheduled Targeted list. if (!AsSmallMoleculesNegative) // .skyd file chromatograms are not useful in this conversion due to mass shift { ExportIsolationList( "AgilentScheduledTargeted.csv", ExportInstrumentType.AGILENT_TOF, FullScanAcquisitionMethod.Targeted, ExportMethodType.Scheduled, AgilentIsolationListExporter.GetTargetedHeader(_fieldSeparator), FieldSeparate("True", mzFirst, zFirst, t46, 2 * halfWin, isolationWidth, ceFirst, string.Empty), FieldSeparate("True", mzLast, zLast, t39, 2 * halfWin, isolationWidth, ceLast, string.Empty)); } // Export Thermo unscheduled Targeted list. ExportIsolationList( "ThermoUnscheduledTargeted.csv", ExportInstrumentType.THERMO_Q_EXACTIVE, FullScanAcquisitionMethod.Targeted, ExportMethodType.Standard, thermoQExactiveIsolationListExporter.GetHeader(_fieldSeparator), FieldSeparate(mzFirst, string.Empty, string.Empty, Math.Abs(zFirst), polarity, string.Empty, string.Empty, nce, slensA, peptideA), FieldSeparate(mzLast, string.Empty, string.Empty, Math.Abs(zLast), polarity, string.Empty, string.Empty, nce, slensB, peptideB)); // Export Thermo scheduled Targeted list. if (!AsSmallMoleculesNegative) // .skyd file chromatograms are not useful in this conversion due to mass shift { ExportIsolationList( "ThermoScheduledTargeted.csv", ExportInstrumentType.THERMO_Q_EXACTIVE, FullScanAcquisitionMethod.Targeted, ExportMethodType.Scheduled, thermoQExactiveIsolationListExporter.GetHeader(_fieldSeparator), FieldSeparate(mzFirst, string.Empty, string.Empty, Math.Abs(zFirst), polarity, t46 - halfWin, t46 + halfWin, nce, slensA, peptideA), FieldSeparate(mzLast, string.Empty, string.Empty, Math.Abs(zLast), polarity, t39 - halfWin, t39 + halfWin, nce, slensB, peptideB)); } // Export Thermo Fusion unscheduled Targeted list. var thermoFusionMassListExporter = new ThermoFusionMassListExporter(SkylineWindow.Document) { UseSlens = WithSLens }; ExportIsolationList( "FusionUnscheduledTargeted.csv", ExportInstrumentType.THERMO_FUSION, FullScanAcquisitionMethod.Targeted, ExportMethodType.Standard, thermoFusionMassListExporter.GetHeader(_fieldSeparator), FieldSeparate(mzFirst, zFirst, string.Empty, string.Empty, nce), FieldSeparate(mzLast, zLast, string.Empty, string.Empty, nce)); // Export Thermo Fusion scheduled Targeted list. if (!AsSmallMoleculesNegative) // .skyd file chromatograms are not useful in this conversion due to mass shift { ExportIsolationList( "FusionScheduledTargeted.csv", ExportInstrumentType.THERMO_FUSION, FullScanAcquisitionMethod.Targeted, ExportMethodType.Scheduled, thermoFusionMassListExporter.GetHeader(_fieldSeparator), FieldSeparate(mzFirst, zFirst, t46 - halfWin, t46 + halfWin, nce, slensA), FieldSeparate(mzLast, zLast, t39 - halfWin, t39 + halfWin, nce, slensB)); } string fragmentsFirst; if (!AsSmallMoleculesNegative) { fragmentsFirst = FieldSeparate("582.3190", "951.4782", "595.3086", "708.3927", "837.4353", "1017.5251"); } else { fragmentsFirst = FieldSeparate("580.3044", "595.3097", "708.3938", "837.4364", "951.4793", "1017.5262"); } string fragmentsLast; if (!AsSmallMoleculesNegative) { fragmentsLast = FieldSeparate("444.5500", "496.7443", "340.1615", "406.8553", "609.7794", "545.7319"); } else { fragmentsLast = FieldSeparate("340.1626", "406.8564", "442.5355", "455.1896", "488.7115", "496.7454"); } var rtFirst = !AsExplicitRetentionTimes ? FieldSeparate("45.8", "47.8") : FieldSeparate("55.6", "58.0"); var rtLast = !AsExplicitRetentionTimes ? FieldSeparate("38.9", "40.9") : FieldSeparate("48.7", "51.1"); var trapCeFirstTrap = !AsSmallMoleculesNegative ? FieldSeparate("21.2", "27.9") : FieldSeparate("21.2", "27.8"); var trapCeLastTrap = !AsSmallMoleculesNegative ? FieldSeparate("17.3", "23.0") : FieldSeparate("17.2", "23.0"); var trapCeFirstTransfer = !AsSmallMoleculesNegative ? FieldSeparate("26.2", "32.9") : FieldSeparate("26.2", "32.8"); var trapCeLastTransfer = !AsSmallMoleculesNegative ? FieldSeparate("22.3", "28.0") : FieldSeparate("22.2", "28.0"); // Export Waters Synapt (trap region) unscheduled Targeted list ExportIsolationList( "WatersTrapUnscheduledTargeted.mrm", ExportInstrumentType.WATERS_SYNAPT_TRAP, FullScanAcquisitionMethod.Targeted, ExportMethodType.Standard, WatersIsolationListExporter.GetHeader(_fieldSeparator), FieldSeparate(0, "0.0", "30.0", mzFirst.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsFirst, trapCeFirstTrap, "2.0", "2.0", 30, "0.0000", 0, 199), FieldSeparate(0, "0.0", "30.0", mzLast.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsLast, trapCeLastTrap, "2.0", "2.0", 30, "0.0000", 0, 199)); // Export Waters Synapt (trap region) scheduled Targeted list if (!AsSmallMoleculesNegative || AsExplicitRetentionTimes) // Negative ions do not match results, so need explicit RTs for scheduling { ExportIsolationList( "WatersTrapScheduledTargeted.mrm", ExportInstrumentType.WATERS_SYNAPT_TRAP, FullScanAcquisitionMethod.Targeted, ExportMethodType.Scheduled, WatersIsolationListExporter.GetHeader(_fieldSeparator), FieldSeparate(0, rtFirst, mzFirst.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsFirst, trapCeFirstTrap, "2.0", "2.0", 30, "0.0000", 0, 199), FieldSeparate(0, rtLast, mzLast.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsLast, trapCeLastTrap, "2.0", "2.0", 30, "0.0000", 0, 199)); } // Export Waters Synapt (transfer region) unscheduled Targeted list ExportIsolationList( "WatersTransferUnscheduledTargeted.mrm", ExportInstrumentType.WATERS_SYNAPT_TRANSFER, FullScanAcquisitionMethod.Targeted, ExportMethodType.Standard, WatersIsolationListExporter.GetHeader(_fieldSeparator), FieldSeparate(0, "0.0", "30.0", mzFirst.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsFirst, "4.0", "4.0", trapCeFirstTransfer, 30, "0.0000", 0, 199), FieldSeparate(0, "0.0", "30.0", mzLast.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsLast, "4.0", "4.0", trapCeLastTransfer, 30, "0.0000", 0, 199)); // Export Waters Synapt (transfer region) scheduled Targeted list if (!AsSmallMoleculesNegative || AsExplicitRetentionTimes) // Negative ions do not match results, so need explicit RTs for scheduling { ExportIsolationList( "WatersTransferScheduledTargeted.mrm", ExportInstrumentType.WATERS_SYNAPT_TRANSFER, FullScanAcquisitionMethod.Targeted, ExportMethodType.Scheduled, WatersIsolationListExporter.GetHeader(_fieldSeparator), FieldSeparate(0, rtFirst, mzFirst.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsFirst, "4.0", "4.0", trapCeFirstTransfer, 30, "0.0000", 0, 199), FieldSeparate(0, rtLast, mzLast.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsLast, "4.0", "4.0", trapCeLastTransfer, 30, "0.0000", 0, 199)); } // Export Waters Xevo unscheduled Targeted list ExportIsolationList( "WatersXevoUnscheduledTargeted.mrm", ExportInstrumentType.WATERS_XEVO_QTOF, FullScanAcquisitionMethod.Targeted, ExportMethodType.Standard, WatersIsolationListExporter.GetHeader(_fieldSeparator), FieldSeparate(0, "0.0", "30.0", mzFirst.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsFirst, trapCeFirstTrap, 30, "0.0000", 0, 199), FieldSeparate(0, "0.0", "30.0", mzLast.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsLast, trapCeLastTrap, 30, "0.0000", 0, 199)); // Export Waters Xevo scheduled Targeted list if (!AsSmallMoleculesNegative || AsExplicitRetentionTimes) // Negative ions do not match results, so need explicit RTs for scheduling { ExportIsolationList( "WatersXevoScheduledTargeted.mrm", ExportInstrumentType.WATERS_XEVO_QTOF, FullScanAcquisitionMethod.Targeted, ExportMethodType.Scheduled, WatersIsolationListExporter.GetHeader(_fieldSeparator), FieldSeparate(0, rtFirst, mzFirst.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsFirst, trapCeFirstTrap, 30, "0.0000", 0, 199), FieldSeparate(0, rtLast, mzLast.ToString("0.0000", CultureInfo.InvariantCulture), fragmentsLast, trapCeLastTrap, 30, "0.0000", 0, 199)); } // Check error if analyzer is not set correctly. CheckMassAnalyzer(ExportInstrumentType.AGILENT_TOF, FullScanMassAnalyzerType.tof); CheckMassAnalyzer(ExportInstrumentType.THERMO_Q_EXACTIVE, FullScanMassAnalyzerType.orbitrap); }