public double[][] Data() { double[][] data = new double[2][]; // next make a request for the filtered chromatogram. // Define settings for XIC ChromatogramTraceSettings traceSettings = new ChromatogramTraceSettings(TraceType.MassRange) { Filter = filterMS, MassRanges = new[] { new Range(mass, mass) } }; // create the array of chromatogram settings IChromatogramSettings[] allSettings = { traceSettings }; // set tolerance of +/- whatever ppm MassOptions tolerance = new MassOptions() { Tolerance = ppm, ToleranceUnits = ToleranceUnits.ppm }; // read the chromatogram var chroData = rawFile.GetChromatogramData(allSettings, -1, -1, tolerance); data[0] = chroData.PositionsArray.ToArray()[0]; data[1] = chroData.IntensitiesArray.ToArray()[0]; return(data); }
public double[] GetXIC(double[] massList, double ppmError, string filter = "ms") { List <double> L = new List <double>(); List <ChromatogramTraceSettings> settingList = new List <ChromatogramTraceSettings>(); foreach (var mass in massList) { double massError = (0.5 * ppmError * mass) / 1000000; ChromatogramTraceSettings settings = new ChromatogramTraceSettings(TraceType.MassRange) { Filter = filter, MassRanges = new[] { ThermoFisher.CommonCore.Data.Business.Range.Create(mass - massError, mass + massError) } }; settingList.Add(settings); } IChromatogramSettings[] allSettings = settingList.ToArray(); var data = rawFile.GetChromatogramData(allSettings, this.GetFirstScanNumber(), this.GetLastScanNumber()); var traces = ChromatogramSignal.FromChromatogramData(data); foreach (var t in traces) { foreach (int j in Enumerable.Range(0, t.Times.Count)) { L.Add(t.Times[j]); L.Add(t.Intensities[j]); } } return(L.ToArray()); }
/// <summary> /// Reads the base peak chromatogram for the RAW file /// </summary> /// <param name="rawFile"> /// The RAW file being read /// </param> /// <param name="startScan"> /// Start scan for the chromatogram /// </param> /// <param name="endScan"> /// End scan for the chromatogram /// </param> /// <param name="outputData"> /// The output data flag. /// </param> /// <param name="filter"> /// The chromatic filter flag. /// </param> private static void GetChromatogram(IRawDataPlus rawFile, int startScan, int endScan, string filename, string filter = "ms") { if (IsValidFilter(rawFile, filter) == false) { Console.WriteLine("# '{0}' is not a valid filter string.", filter); return; } using (System.IO.StreamWriter file = new System.IO.StreamWriter(filename)) { // TODO([email protected]): check mass interval for chromatograms and its dep for diff MS detector types // TODO([email protected]): return mass intervals to the R enviroment // Define the settings for getting the Base Peak chromatogram ChromatogramTraceSettings settingsTIC = new ChromatogramTraceSettings(TraceType.TIC) { Filter = filter }; ChromatogramTraceSettings settingsBasePeak = new ChromatogramTraceSettings(TraceType.BasePeak) { Filter = filter, MassRanges = new[] { ThermoFisher.CommonCore.Data.Business.Range.Create(100, 1805) } }; ChromatogramTraceSettings settingsMassRange = new ChromatogramTraceSettings(TraceType.MassRange) { Filter = filter, MassRanges = new[] { ThermoFisher.CommonCore.Data.Business.Range.Create(50, 2000000) } }; // Get the chromatogram from the RAW file. var dataTIC = rawFile.GetChromatogramData(new IChromatogramSettings[] { settingsTIC }, startScan, endScan); var dataMassRange = rawFile.GetChromatogramData(new IChromatogramSettings[] { settingsMassRange }, startScan, endScan); var dataBasePeak = rawFile.GetChromatogramData(new IChromatogramSettings[] { settingsBasePeak }, startScan, endScan); // Split the data into the chromatograms var traceTIC = ChromatogramSignal.FromChromatogramData(dataTIC); var traceMassRange = ChromatogramSignal.FromChromatogramData(dataMassRange); var traceBasePeak = ChromatogramSignal.FromChromatogramData(dataBasePeak); if (traceBasePeak[0].Length > 0) { // Print the chromatogram data (time, intensity values) file.WriteLine("# TIC chromatogram ({0} points)", traceTIC[0].Length); file.WriteLine("# Base Peak chromatogram ({0} points)", traceBasePeak[0].Length); file.WriteLine("# MassRange chromatogram ({0} points)", traceMassRange[0].Length); file.WriteLine("rt;intensity.BasePeak;intensity.TIC;intensity.MassRange"); for (int i = 0; i < traceBasePeak[0].Length; i++) { file.WriteLine("{1:F3};{2:F0};{3:F0};{4:F0}", i, traceBasePeak[0].Times[i], traceBasePeak[0].Intensities[i], traceTIC[0].Intensities[i], traceMassRange[0].Intensities[i]); } } file.WriteLine(); } }
private static void GetXIC(IRawDataPlus rawFile, int startScan, int endScan, List <double> massList, double ppmError, string filename) { List <ChromatogramTraceSettings> settingList = new List <ChromatogramTraceSettings>(); foreach (var mass in massList) { double massError = (0.5 * ppmError * mass) / 1000000; ChromatogramTraceSettings settings = new ChromatogramTraceSettings(TraceType.MassRange) { Filter = "ms", MassRanges = new[] { Range.Create(mass - massError, mass + massError) } }; settingList.Add(settings); } IChromatogramSettings[] allSettings = settingList.ToArray(); var data = rawFile.GetChromatogramData(allSettings, startScan, endScan); /// compose JSON string string json = ""; List <string> L = new List <string>(); // Split the data into the chromatograms var trace = ChromatogramSignal.FromChromatogramData(data); for (int i = 0; i < trace.Length; i++) { List <double> tTime = new List <double>(); List <double> tIntensities = new List <double>(); for (int j = 0; j < trace[i].Times.Count; j++) { if (trace[i].Intensities[j] > 0) { tTime.Add(trace[i].Times[j]); tIntensities.Add(trace[i].Intensities[j]); } } // file.WriteLine("\t{\n"); json = string.Format("\t\"mass\": {0},\n", massList[i]) + string.Format("\t\"rt\": [\n\t\t\t" + string.Join(",\n\t\t\t", tTime) + "\n\t\t],") + string.Format("\n\t\"intensities\": [\n\t\t\t" + string.Join(",\n\t\t\t", tIntensities) + "\n\t\t]"); L.Add("\t{\n" + json + "\n\t}"); } using (System.IO.StreamWriter file = new System.IO.StreamWriter(filename)) { file.WriteLine("[\n" + string.Join(",\n", L) + "\n]\n"); } }
/// <summary> /// Get the spectrum intensity. /// </summary> /// <param name="rawFile">the RAW file object</param> /// <param name="precursorScanNumber">the precursor scan number</param> protected static double GetPrecursorIntensity(IRawDataPlus rawFile, int precursorScanNumber) { // Define the settings for getting the Base Peak chromatogram var settings = new ChromatogramTraceSettings(TraceType.BasePeak); // Get the chromatogram from the RAW file. var data = rawFile.GetChromatogramData(new IChromatogramSettings[] { settings }, precursorScanNumber, precursorScanNumber); // Split the data into the chromatograms var trace = ChromatogramSignal.FromChromatogramData(data); return(trace[0].Intensities[0]); }
/// <summary> /// Get and set chromatogram data from the raw file /// </summary> /// <param name="inputRawFile"></param> private void GetChromatogramData(IRawDataPlus inputRawFile) { try { //Get mass resolution for the run from the header MassResolution = inputRawFile.RunHeaderEx.MassResolution; // Find startScan and endScan int startScan = inputRawFile.RunHeader.FirstSpectrum; int endScan = inputRawFile.RunHeader.LastSpectrum; //Set up settings to extract the data ChromatogramTraceSettings traceSettings = new ChromatogramTraceSettings(TraceType.MassRange) { Filter = FILTER_MS, MassRanges = new[] { new Range(LowMass, HighMass) } }; IChromatogramSettings[] allSettings = { traceSettings }; MassOptions massOptions = new MassOptions() { Tolerance = Tolerance, ToleranceUnits = ToleranceUnits }; var chromatogramData = inputRawFile.GetChromatogramData(allSettings, startScan, endScan, massOptions); //get all chromatogram data // Get data from the chromatogram ScanNumList = chromatogramData.ScanNumbersArray[0]; ExactMassList = chromatogramData.PositionsArray[0]; //get positions of each scan MassIntensityList = chromatogramData.IntensitiesArray[0]; //get list of intensities for scan numbers } catch (Exception ex) { Console.Write("Error in accessing chromatogram data: " + ex); } }
/// <summary> /// Construct the chromatogram element(s) /// </summary> /// <param name="firstScanNumber">the first scan number</param> /// <param name="lastScanNumber">the last scan number</param> /// <returns>a list of chromatograms</returns> private List <ChromatogramType> ConstructChromatograms(int firstScanNumber, int lastScanNumber) { var chromatograms = new List <ChromatogramType>(); // Define the settings for getting the Base Peak chromatogram var settings = new ChromatogramTraceSettings(TraceType.BasePeak); // Get the chromatogram from the RAW file. var data = _rawFile.GetChromatogramData(new IChromatogramSettings[] { settings }, firstScanNumber, lastScanNumber); // Split the data into the chromatograms var trace = ChromatogramSignal.FromChromatogramData(data); for (var i = 0; i < trace.Length; i++) { if (trace[i].Length > 0) { // Binary data array list var binaryData = new List <BinaryDataArrayType>(); var chromatogram = new ChromatogramType { index = i.ToString(), id = "base_peak_" + i, defaultArrayLength = 0, binaryDataArrayList = new BinaryDataArrayListType { count = "2", binaryDataArray = new BinaryDataArrayType[2] }, cvParam = new CVParamType[1] }; chromatogram.cvParam[0] = new CVParamType { accession = "MS:1000235", name = "total ion current chromatogram", cvRef = "MS", value = "" }; // Chromatogram times if (!trace[i].Times.IsNullOrEmpty()) { // Set the chromatogram default array length chromatogram.defaultArrayLength = trace[i].Times.Count; var timesBinaryData = new BinaryDataArrayType { binary = GetZLib64BitArray(trace[i].Times) }; timesBinaryData.encodedLength = (4 * Math.Ceiling((double)timesBinaryData .binary.Length / 3)).ToString(CultureInfo.InvariantCulture); timesBinaryData.cvParam = new CVParamType[3]; timesBinaryData.cvParam[0] = new CVParamType { accession = "MS:1000595", name = "time array", cvRef = "MS", unitName = "minute", value = "", unitCvRef = "UO", unitAccession = "UO:0000031" }; timesBinaryData.cvParam[1] = new CVParamType { accession = "MS:1000523", name = "64-bit float", cvRef = "MS", value = "" }; timesBinaryData.cvParam[2] = new CVParamType { accession = "MS:1000574", name = "zlib compression", cvRef = "MS", value = "" }; binaryData.Add(timesBinaryData); } // Chromatogram intensities if (!trace[i].Times.IsNullOrEmpty()) { // Set the spectrum default array length if necessary if (chromatogram.defaultArrayLength == 0) { chromatogram.defaultArrayLength = trace[i].Intensities.Count; } var intensitiesBinaryData = new BinaryDataArrayType { binary = GetZLib64BitArray(trace[i].Intensities) }; intensitiesBinaryData.encodedLength = (4 * Math.Ceiling((double)intensitiesBinaryData .binary.Length / 3)).ToString(CultureInfo.InvariantCulture); intensitiesBinaryData.cvParam = new CVParamType[3]; intensitiesBinaryData.cvParam[0] = new CVParamType { accession = "MS:1000515", name = "intensity array", cvRef = "MS", unitName = "number of counts", value = "", unitCvRef = "MS", unitAccession = "MS:1000131" }; intensitiesBinaryData.cvParam[1] = new CVParamType { accession = "MS:1000523", name = "64-bit float", cvRef = "MS", value = "" }; intensitiesBinaryData.cvParam[2] = new CVParamType { accession = "MS:1000574", name = "zlib compression", cvRef = "MS", value = "" }; binaryData.Add(intensitiesBinaryData); } if (!binaryData.IsNullOrEmpty()) { chromatogram.binaryDataArrayList = new BinaryDataArrayListType { count = binaryData.Count.ToString(), binaryDataArray = binaryData.ToArray() }; } chromatograms.Add(chromatogram); } } return(chromatograms); }
private void UpdateChromatogramData() { ChromatogramTraceSettings traceSettings; MassOptions tolerance = null; string msFilter; if (ChroMsLevelComboBox.Text == "MS1" | ChroMsLevelComboBox.SelectedIndex == -1) { msFilter = "ms"; } else if (ChroMsLevelComboBox.Text == "MS2") { msFilter = "ms2"; } else if (ChroMsLevelComboBox.Text == "MS3") { msFilter = "ms3"; } else { msFilter = String.Empty; } if (ChroTICRadioButton.Checked) { traceSettings = new ChromatogramTraceSettings(TraceType.TIC); } else if (ChroBPRadioButton.Checked) { traceSettings = new ChromatogramTraceSettings(TraceType.BasePeak); } else { if (ChroXICmzTextBox.Text.IsNullOrEmpty() || ChroXICmzTextBox.BackColor == Color.Red || ChroXICmzTextBox.Text == "") { traceSettings = new ChromatogramTraceSettings(TraceType.TIC); } else { double da = Convert.ToDouble(ChroXICmzTextBox.Text); traceSettings = new ChromatogramTraceSettings(TraceType.MassRange) { MassRanges = new[] { new Range(da, da) }, }; if (!chroXICToleranceTextBox.Text.IsNullOrEmpty() && !(chroXICToleranceTextBox.BackColor == Color.Red) && !(chroXICToleranceTextBox.Text == "")) { tolerance = new MassOptions() { Tolerance = Convert.ToDouble(chroXICToleranceTextBox.Text) }; if (chroMassTolPPM.Checked) { tolerance.ToleranceUnits = ToleranceUnits.ppm; } else if (chroMassTolDa.Checked) { tolerance.ToleranceUnits = ToleranceUnits.amu; } else { tolerance.ToleranceUnits = ToleranceUnits.mmu; } } } } traceSettings.Filter = msFilter; IChromatogramSettingsEx[] allSettings = { traceSettings }; ChromatogramData = RawData.GetChromatogramDataEx(allSettings, -1, -1, tolerance); }
public static void ReadXic(string rawFilePath, bool base64, XicData xicData) { IRawDataPlus rawFile; using (rawFile = RawFileReaderFactory.ReadFile(rawFilePath)) { if (!rawFile.IsOpen) { throw new RawFileParserException("Unable to access the RAW file using the native Thermo library."); } // Check for any errors in the RAW file if (rawFile.IsError) { throw new RawFileParserException( $"Error opening ({rawFile.FileError}) - {rawFilePath}"); } // Check if the RAW file is being acquired if (rawFile.InAcquisition) { throw new RawFileParserException("RAW file still being acquired - " + rawFilePath); } // Get the number of instruments (controllers) present in the RAW file and set the // selected instrument to the MS instrument, first instance of it rawFile.SelectInstrument(Device.MS, 1); // Get the first and last scan from the RAW file var firstScanNumber = rawFile.RunHeaderEx.FirstSpectrum; var lastScanNumber = rawFile.RunHeaderEx.LastSpectrum; // Get the start and end time from the RAW file var startTime = rawFile.RunHeaderEx.StartTime; var endTime = rawFile.RunHeaderEx.EndTime; // Get the mass range from the RAW file var minMass = rawFile.RunHeaderEx.LowMass; var maxMass = rawFile.RunHeaderEx.HighMass; // Update global metadata xicData.OutputMeta.base64 = base64; xicData.OutputMeta.timeunit = "minutes"; foreach (var xicUnit in xicData.Content) { IChromatogramSettings settings = null; if (!xicUnit.Meta.MzStart.HasValue && !xicUnit.Meta.MzEnd.HasValue) { settings = new ChromatogramTraceSettings() { Filter = xicUnit.Meta.Filter ?? "ms" }; } if (!xicUnit.Meta.MzStart.HasValue) { xicUnit.Meta.MzStart = minMass; } if (!xicUnit.Meta.MzEnd.HasValue) { xicUnit.Meta.MzEnd = maxMass; } if (settings == null) { settings = new ChromatogramTraceSettings(TraceType.MassRange) { Filter = xicUnit.Meta.Filter ?? "ms", MassRanges = new[] { new Range(xicUnit.Meta.MzStart.Value, xicUnit.Meta.MzEnd.Value) } }; } List <int> rtFilteredScans = null; if (!xicUnit.Meta.RtStart.HasValue && !xicUnit.Meta.RtEnd.HasValue) { rtFilteredScans = new List <int>(); } if (!xicUnit.Meta.RtStart.HasValue) { xicUnit.Meta.RtStart = startTime; } if (!xicUnit.Meta.RtEnd.HasValue) { xicUnit.Meta.RtEnd = endTime; } IChromatogramData data = null; if (rtFilteredScans == null) { rtFilteredScans = rawFile.GetFilteredScansListByTimeRange(MsFilter, xicUnit.Meta.RtStart.Value, xicUnit.Meta.RtEnd.Value); if (rtFilteredScans.Count != 0) { data = GetChromatogramData(rawFile, settings, rtFilteredScans[0], rtFilteredScans[rtFilteredScans.Count - 1]); if (data != null && data.PositionsArray.Length == 1 && data.PositionsArray[0].Length == 1 && (Math.Abs(data.PositionsArray[0][0] - startTime) < 0.001 || Math.Abs(data.PositionsArray[0][0] - endTime) < 0.001)) { Log.Warn( $"Only the minimum or maximum retention time was returned. This is an indication that the provided retention time range [{xicUnit.Meta.RtStart}-{xicUnit.Meta.RtEnd}] lies outside the max. window [{startTime}-{endTime}]"); } } else { Log.Warn( $"No scans found in retention time range [{xicUnit.Meta.RtStart}-{xicUnit.Meta.RtEnd}]. This is an indication that the provided retention time window lies outside the max. window [{startTime}-{endTime}]"); } } else { data = GetChromatogramData(rawFile, settings, firstScanNumber, lastScanNumber); } if (data != null) { var chromatogramTrace = ChromatogramSignal.FromChromatogramData(data); if (chromatogramTrace[0].Scans.Count != 0) { if (!base64) { xicUnit.RetentionTimes = chromatogramTrace[0].Times; xicUnit.Intensities = chromatogramTrace[0].Intensities; } else { xicUnit.RetentionTimes = GetBase64String(chromatogramTrace[0].Times); xicUnit.Intensities = GetBase64String(chromatogramTrace[0].Intensities); } } } } } }
private static void ExtractIonChromatogramAsRcode(IRawDataPlus rawFile, int startScan, int endScan, List <double> massList, double ppmError, string filename, string filter = "ms") { if (IsValidFilter(rawFile, filter) == false) { using (System.IO.StreamWriter file = new System.IO.StreamWriter(filename)) { file.WriteLine("e$error <- \"'{0}' is not a valid filter string.\";", filter); } return; } List <ChromatogramTraceSettings> settingList = new List <ChromatogramTraceSettings>(); foreach (var mass in massList) { double massError = (0.5 * ppmError * mass) / 1000000; ChromatogramTraceSettings settings = new ChromatogramTraceSettings(TraceType.MassRange) { Filter = filter, MassRanges = new[] { ThermoFisher.CommonCore.Data.Business.Range.Create(mass - massError, mass + massError) } }; settingList.Add(settings); } IChromatogramSettings[] allSettings = settingList.ToArray(); var data = rawFile.GetChromatogramData(allSettings, startScan, endScan); // Split the data into the chromatograms var trace = ChromatogramSignal.FromChromatogramData(data); using (System.IO.StreamWriter file = new System.IO.StreamWriter(filename)) { file.WriteLine("#R\n"); for (int i = 0; i < trace.Length; i++) { List <double> tTime = new List <double>(); List <double> tIntensities = new List <double>(); for (int j = 0; j < trace[i].Times.Count; j++) { // if (trace[i].Intensities[j] > 0) { tTime.Add(trace[i].Times[j]); tIntensities.Add(trace[i].Intensities[j]); } } file.WriteLine("e$chromatogram[[{0}]] <- list(", i + 1); file.WriteLine("\tfilter = '{0}',", filter); file.WriteLine("\tppm = {0},", ppmError); file.WriteLine("\tmass = {0},", massList[i]); file.WriteLine("\ttimes = c(" + string.Join(",", tTime) + "),"); file.WriteLine("\tintensities = c(" + string.Join(",", tIntensities) + ")"); file.WriteLine(");"); } } }