/// <summary> /// Get and set data from the mass spectrum /// </summary> /// <param name="inputRawFile"></param> private void GetSpectrumData(IRawDataPlus inputRawFile) { // Get the first and last scan from the RAW file int firstScanNumber = inputRawFile.RunHeaderEx.FirstSpectrum; int lastScanNumber = inputRawFile.RunHeaderEx.LastSpectrum; string itHeaderParam = "Ion Injection Time (ms)"; // Set up empty variables to populate with mass spectrum data TICList = new double[lastScanNumber]; ITList = new double[lastScanNumber]; RetentionTimeList = new double[lastScanNumber]; try { //get out information from mass spectra for each scan for (int scan = 0; scan <= (ScanNumList.Length - 1); scan++) { int thisScan = ScanNumList[scan]; // get the scan statistics for this scan number ScanStatistics scanStatistic = inputRawFile.GetScanStatsForScanNumber(thisScan); //get the TIC TICList[scan] = scanStatistic.TIC; //get retention time RetentionTimeList[scan] = inputRawFile.RetentionTimeFromScanNumber(thisScan); ITList[scan] = GetScanExtraDouble(inputRawFile, thisScan, itHeaderParam); //TODO: get out noise for peaks } } catch (Exception ex) { Console.Write("Error in accessing spectrum data: " + ex); } }
private static void WritePScans(string fileName, IRawDataPlus raw, List <PScan> scans) { var enumerator = raw.GetFilteredScanEnumerator(" "); foreach (var scanNumber in enumerator) // note in my tests serial is faster than Parallel.Foreach() (this involves disk access, so it makes sense) { //trailer iinformation is extracted via index var trailers = raw.GetTrailerExtraValues(scanNumber); var trailerLabels = raw.GetTrailerExtraInformation(scanNumber); object chargeState = 0; for (int i = 0; i < trailerLabels.Labels.Length; i++) { if (trailerLabels.Labels[i] == "Charge State:") { chargeState = raw.GetTrailerExtraValue(scanNumber, i); break; } } var scanFilter = raw.GetFilterForScanNumber(scanNumber); var scanStats = raw.GetScanStatsForScanNumber(scanNumber); CentroidStream centroidStream = new CentroidStream(); //check for FT mass analyzer data if (scanFilter.MassAnalyzer == MassAnalyzerType.MassAnalyzerFTMS) { centroidStream = raw.GetCentroidStream(scanNumber, false); } //check for IT mass analyzer data if (scanFilter.MassAnalyzer == MassAnalyzerType.MassAnalyzerITMS) { var scanData = raw.GetSimplifiedScan(scanNumber); centroidStream.Masses = scanData.Masses; centroidStream.Intensities = scanData.Intensities; } var msOrder = raw.GetScanEventForScanNumber(scanNumber).MSOrder; if (msOrder == MSOrderType.Ms) { var pscan = GetPScan(scanStats, centroidStream, 1, fileName, Convert.ToInt32(chargeState)); scans.Add(pscan); } if (msOrder == MSOrderType.Ms2) { var precursorMz = raw.GetScanEventForScanNumber(scanNumber).GetReaction(0).PrecursorMass; var pscan = GetPScan(scanStats, centroidStream, 2, fileName, precursorMz, Convert.ToInt32(chargeState)); scans.Add(pscan); } var t = raw.GetTrailerExtraValues(scanNumber); } WriteScans(scans, fileName); }
public static void GetIndex(this IRawDataPlus rawFile) { int firstScanNumber = rawFile.RunHeaderEx.FirstSpectrum; int lastScanNumber = rawFile.RunHeaderEx.LastSpectrum; int idxCharge = rawFile.GetIndexOfPattern(); int idxMasterScan = rawFile.GetIndexOfPattern("Master Scan Number:"); int idxDependencyType = rawFile.GetIndexOfPattern("Dependency Type:"); double charge, precursorMass; int masterScan, dependencyType; Console.WriteLine("scan;scanType;rtinseconds;precursorMass;MSOrder;charge;masterScan;dependencyType"); for (int scanNumber = firstScanNumber; scanNumber < lastScanNumber; scanNumber++) { var scanTrailer = rawFile.GetTrailerExtraInformation(scanNumber); var scanStatistics = rawFile.GetScanStatsForScanNumber(scanNumber); var scanEvent = rawFile.GetScanEventForScanNumber(scanNumber); var scanFilter = rawFile.GetFilterForScanNumber(scanNumber); try{ var reaction0 = scanEvent.GetReaction(0); precursorMass = reaction0.PrecursorMass; } catch { precursorMass = -1; } try{ charge = int.Parse(scanTrailer.Values.ToArray()[idxCharge]); } catch { charge = -1; } try{ masterScan = int.Parse(scanTrailer.Values.ToArray()[idxMasterScan]); } catch { masterScan = -1; } try{ dependencyType = int.Parse(scanTrailer.Values.ToArray()[idxDependencyType]); } catch { dependencyType = -1; } Console.WriteLine("{0};{1};{2};{3};{4};{5};{6};{7}", scanNumber, scanStatistics.ScanType.ToString(), Math.Round(scanStatistics.StartTime * 60 * 1000) / 1000, precursorMass, scanFilter.MSOrder.ToString(), charge, masterScan, dependencyType); } }
/// <summary> /// implements /// https://github.com/fgcz/rawrr/issues/43 /// </summary> /// <param name="rawFile"></param> /// <param name="filename"></param> /// <param name="L"></param> public static void WriteCentroidSpectrumAsRcode(this IRawDataPlus rawFile, string filename, List <int> L) { int count = 1; var trailerFields = rawFile.GetTrailerExtraHeaderInformation(); int indexCharge = rawFile.GetIndexOfPattern("Charge State"); using (System.IO.StreamWriter file = new System.IO.StreamWriter(filename)) { foreach (int scanNumber in L) { var scan = Scan.FromFile(rawFile, scanNumber); var scanStatistics = rawFile.GetScanStatsForScanNumber(scanNumber); var centroidStream = rawFile.GetCentroidStream(scanNumber, false); var scanEvent = rawFile.GetScanEventForScanNumber(scanNumber); var scanTrailer = rawFile.GetTrailerExtraInformation(scanNumber); file.WriteLine("e$Spectrum[[{0}]] <- list(", count++); file.WriteLine("\tscan = {0},", scanNumber); file.WriteLine("\trtinseconds = {0},", Math.Round(scanStatistics.StartTime * 60 * 1000) / 1000); if (indexCharge > 0) { file.WriteLine("\tcharge = {0},", int.Parse(scanTrailer.Values.ToArray()[indexCharge])); } else { file.WriteLine("\tcharge = NA,"); } try{ var reaction0 = scanEvent.GetReaction(0); file.WriteLine("\tpepmass = {0},", reaction0.PrecursorMass); }catch { file.WriteLine("\tpepmass = NA,"); } if (scanStatistics.IsCentroidScan && centroidStream.Length > 0) { file.WriteLine("\tmZ = c(" + string.Join(", ", centroidStream.Masses) + "),"); file.WriteLine("\tintensity = c(" + string.Join(", ", centroidStream.Intensities) + ")"); } else { file.WriteLine("\tmZ = NULL,\n\tintensity = NULL"); } file.WriteLine("\t)"); } } }
public static void WriteSpectrumAsRcode0(this IRawDataPlus rawFile, string filename) { int idxCharge = rawFile.GetIndexOfPattern(); int firstScanNumber = rawFile.RunHeaderEx.FirstSpectrum; int lastScanNumber = rawFile.RunHeaderEx.LastSpectrum; int charge = -1; double pc = -1; using (System.IO.StreamWriter file = new System.IO.StreamWriter(filename)) { for (int scanNumber = firstScanNumber; scanNumber < lastScanNumber; scanNumber++) { var scanTrailer = rawFile.GetTrailerExtraInformation(scanNumber); var scanStatistics = rawFile.GetScanStatsForScanNumber(scanNumber); var scanEvent = rawFile.GetScanEventForScanNumber(scanNumber); var scanFilter = rawFile.GetFilterForScanNumber(scanNumber); try{ var reaction0 = scanEvent.GetReaction(0); pc = reaction0.PrecursorMass; } catch { pc = -1; } try{ charge = int.Parse(scanTrailer.Values.ToArray()[idxCharge]); } catch { charge = -1; } file.WriteLine("e$Spectrum[[{0}]] <- list(", scanNumber); file.WriteLine("\tscan = {0};", scanNumber); file.WriteLine("\tscanType = \"{0}\";", scanStatistics.ScanType.ToString()); file.WriteLine("\trtinseconds = {0};", Math.Round(scanStatistics.StartTime * 60 * 1000) / 1000); file.WriteLine("\tprecursorMass = {0};", pc); file.WriteLine("\tMSOrder = '{0}';", scanFilter.MSOrder.ToString()); file.WriteLine("\tcharge = {0}", charge); file.WriteLine(")"); } } }
private static MzSpectrum GetSpectrum(IRawDataPlus rawFile, IFilteringParams filterParams, int scanNumber, string scanFilter, int scanOrder) { MzSpectrum spectrum; double[] xArray; double[] yArray; if (string.IsNullOrEmpty(scanFilter)) { return(new MzSpectrum(new double[0], new double[0], false)); } var centroidStream = rawFile.GetCentroidStream(scanNumber, false); // PreferredMasses should be used if centroidStream data is null; it's probably ITMS data if (centroidStream.Masses == null || centroidStream.Intensities == null) { var scan = Scan.FromFile(rawFile, scanNumber); var mzs = scan.PreferredMasses; xArray = scan.PreferredMasses; yArray = scan.PreferredIntensities; if (xArray == null || yArray == null) { throw new MzLibException("Could not centroid data from scan " + scanNumber); } } else { xArray = centroidStream.Masses; yArray = centroidStream.Intensities; } if (filterParams != null && xArray.Length > 0 && (filterParams.MinimumAllowedIntensityRatioToBasePeakM.HasValue || filterParams.NumberOfPeaksToKeepPerWindow.HasValue) && ((filterParams.ApplyTrimmingToMs1 && scanOrder == 1) || (filterParams.ApplyTrimmingToMsMs && scanOrder > 1))) { var count = xArray.Length; var mzArray = new double[count]; var intensityArray = new double[count]; Array.Copy(xArray, mzArray, count); Array.Copy(yArray, intensityArray, count); var scanStats = rawFile.GetScanStatsForScanNumber(scanNumber); double scanRangeHigh = scanStats.HighMass; double scanRangeLow = scanStats.LowMass; WindowModeHelper(ref intensityArray, ref mzArray, filterParams, scanRangeLow, scanRangeHigh); Array.Sort(mzArray, intensityArray); spectrum = new MzSpectrum(mzArray, intensityArray, false); } else { spectrum = new MzSpectrum(xArray, yArray, false); } return(spectrum); }
public static MsDataScan GetOneBasedScan(IRawDataPlus rawFile, IFilteringParams filteringParams, int scanNumber) { var filter = rawFile.GetFilterForScanNumber(scanNumber); string scanFilterString = filter.ToString(); int msOrder = (int)filter.MSOrder; if (msOrder < 1 || msOrder > 10) { throw new MzLibException("Unknown MS Order (" + msOrder + ") for scan number " + scanNumber); } string nativeId = "controllerType=0 controllerNumber=1 scan=" + scanNumber; MzSpectrum spectrum = GetSpectrum(rawFile, filteringParams, scanNumber, scanFilterString, msOrder); var scanStats = rawFile.GetScanStatsForScanNumber(scanNumber); double scanRangeHigh = scanStats.HighMass; double scanRangeLow = scanStats.LowMass; MzRange scanWindowRange = new MzRange(scanRangeLow, scanRangeHigh); double? ionInjectionTime = null; double? precursorSelectedMonoisotopicIonMz = null; int? selectedIonChargeState = null; double? ms2IsolationWidth = null; int? precursorScanNumber = null; double? isolationMz = null; string HcdEnergy = null; ActivationType activationType = ActivationType.Any; // thermo enum DissociationType dissociationType = DissociationType.Unknown; // mzLib enum var trailer = rawFile.GetTrailerExtraInformation(scanNumber); string[] labels = trailer.Labels; string[] values = trailer.Values; for (int i = 0; i < trailer.Labels.Length; i++) { if (labels[i].StartsWith("Ion Injection Time (ms)", StringComparison.Ordinal)) { ionInjectionTime = double.Parse(values[i], CultureInfo.InvariantCulture) == 0 ? (double?)null : double.Parse(values[i], CultureInfo.InvariantCulture); } if (msOrder < 2) { continue; } if (labels[i].StartsWith("MS" + msOrder + " Isolation Width", StringComparison.Ordinal)) { ms2IsolationWidth = double.Parse(values[i], CultureInfo.InvariantCulture) == 0 ? (double?)null : double.Parse(values[i], CultureInfo.InvariantCulture); } if (labels[i].StartsWith("Monoisotopic M/Z", StringComparison.Ordinal)) { precursorSelectedMonoisotopicIonMz = double.Parse(values[i], CultureInfo.InvariantCulture) == 0 ? (double?)null : double.Parse(values[i], CultureInfo.InvariantCulture); } if (labels[i].StartsWith("Charge State", StringComparison.Ordinal)) { selectedIonChargeState = int.Parse(values[i], CultureInfo.InvariantCulture) == 0 ? (int?)null : int.Parse(values[i], CultureInfo.InvariantCulture); } if (labels[i].StartsWith("Master Scan Number", StringComparison.Ordinal) || labels[i].StartsWith("Master Index", StringComparison.Ordinal)) { precursorScanNumber = int.Parse(values[i], CultureInfo.InvariantCulture) <= 1 ? (int?)null : int.Parse(values[i], CultureInfo.InvariantCulture); } if (labels[i].StartsWith("HCD Energy:", StringComparison.Ordinal)) { HcdEnergy = values[i]; } } if (msOrder > 1) { var scanEvent = rawFile.GetScanEventForScanNumber(scanNumber); var reaction = scanEvent.GetReaction(0); isolationMz = reaction.PrecursorMass; activationType = reaction.ActivationType; dissociationType = GetDissociationType(activationType); // thermo does not have an enum value for ETHcD, so this needs to be detected from the scan filter if (scanFilterString.Contains("@etd", StringComparison.OrdinalIgnoreCase) && scanFilterString.Contains("@hcd", StringComparison.OrdinalIgnoreCase)) { dissociationType = DissociationType.EThcD; } if (ms2IsolationWidth == null) { ms2IsolationWidth = reaction.IsolationWidth; } if (precursorScanNumber == null) { // we weren't able to get the precursor scan number, so we'll have to guess; // loop back to find precursor scan // (assumed to be the first scan before this scan with an MS order of this scan's MS order - 1) // e.g., if this is an MS2 scan, find the first MS1 scan before this and assume that's the precursor scan for (int i = scanNumber; i >= 1; i--) { var possiblePrecursorScanFilter = rawFile.GetFilterForScanNumber(i); int order = (int)possiblePrecursorScanFilter.MSOrder; if (order == msOrder - 1) { precursorScanNumber = i; break; } } if (precursorScanNumber == null) { throw new MzLibException("Could not get precursor for scan #" + scanNumber); } } } // at this point, we have the m/z value of the species that got fragmented, from the scan header // this section of the code finds that peak in the spectrum (it's actual intensity and centroided m/z values) // the intention is to remove any rounding issues caused by what is in the scan header and what is observable in the spectrum double?selectedIonIntensity = null; if (isolationMz.HasValue) { if (spectrum.Size != 0) { int closest = spectrum.GetClosestPeakIndex(isolationMz.Value); double mz = spectrum.XArray[closest]; double intensity = spectrum.YArray[closest]; if (Math.Abs(mz - isolationMz.Value) < 0.1) { selectedIonIntensity = intensity; isolationMz = mz; } } } return(new MsDataScan( massSpectrum: spectrum, oneBasedScanNumber: scanNumber, msnOrder: msOrder, isCentroid: true, polarity: GetPolarity(filter.Polarity), retentionTime: rawFile.RetentionTimeFromScanNumber(scanNumber), scanWindowRange: scanWindowRange, scanFilter: scanFilterString, mzAnalyzer: GetMassAnalyzerType(filter.MassAnalyzer), totalIonCurrent: spectrum.SumOfAllY, injectionTime: ionInjectionTime, noiseData: null, //TODO: implement reading noise data. it's unused right now, so it's just left as null nativeId: nativeId, selectedIonMz: isolationMz, selectedIonChargeStateGuess: selectedIonChargeState, selectedIonIntensity: selectedIonIntensity, isolationMZ: isolationMz, isolationWidth: ms2IsolationWidth, dissociationType: dissociationType, oneBasedPrecursorScanNumber: precursorScanNumber, selectedIonMonoisotopicGuessMz: precursorSelectedMonoisotopicIonMz, hcdEnergy: HcdEnergy)); }
/// <inheritdoc /> public override void Write(IRawDataPlus rawFile, int firstScanNumber, int lastScanNumber) { ConfigureWriter(".mgf"); using (Writer) { Log.Info("Processing " + (lastScanNumber - firstScanNumber + 1) + " scans"); var lastScanProgress = 0; for (var scanNumber = firstScanNumber; scanNumber <= lastScanNumber; scanNumber++) { if (!ParseInput.Verbose) { var scanProgress = (int)((double)scanNumber / (lastScanNumber - firstScanNumber + 1) * 100); if (scanProgress % ProgressPercentageStep == 0) { if (scanProgress != lastScanProgress) { Console.Write("" + scanProgress + "% "); lastScanProgress = scanProgress; } } } // Get each scan from the RAW file var scan = Scan.FromFile(rawFile, scanNumber); // Check to see if the RAW file contains label (high-res) data and if it is present // then look for any data that is out of order var time = rawFile.RetentionTimeFromScanNumber(scanNumber); // Get the scan filter for this scan number var scanFilter = rawFile.GetFilterForScanNumber(scanNumber); // Get the scan event for this scan number var scanEvent = rawFile.GetScanEventForScanNumber(scanNumber); IReaction reaction = null; switch (scanFilter.MSOrder) { case MSOrderType.Ms: // Keep track of scan number for precursor reference _precursorScanNumber = scanNumber; break; case MSOrderType.Ms2: try { reaction = scanEvent.GetReaction(0); } catch (ArgumentOutOfRangeException exception) { Log.Warn("No reaction found for scan " + scanNumber); } goto default; case MSOrderType.Ms3: { try { reaction = scanEvent.GetReaction(1); } catch (ArgumentOutOfRangeException) { Log.Warn("No reaction found for scan " + scanNumber); } goto default; } default: Writer.WriteLine("BEGIN IONS"); Writer.WriteLine($"TITLE={ConstructSpectrumTitle(scanNumber)}"); Writer.WriteLine($"SCANS={scanNumber}"); Writer.WriteLine( $"RTINSECONDS={(time * 60).ToString(CultureInfo.InvariantCulture)}"); // trailer extra data list var trailerData = rawFile.GetTrailerExtraInformation(scanNumber); int? charge = null; double?monoisotopicMz = null; double?isolationWidth = null; for (var i = 0; i < trailerData.Length; i++) { if (trailerData.Labels[i] == "Charge State:") { if (Convert.ToInt32(trailerData.Values[i]) > 0) { charge = Convert.ToInt32(trailerData.Values[i]); } } if (trailerData.Labels[i] == "Monoisotopic M/Z:") { monoisotopicMz = double.Parse(trailerData.Values[i], NumberStyles.Any, CultureInfo.CurrentCulture); } if (trailerData.Labels[i] == "MS" + (int)scanFilter.MSOrder + " Isolation Width:") { isolationWidth = double.Parse(trailerData.Values[i], NumberStyles.Any, CultureInfo.CurrentCulture); } } if (reaction != null) { var selectedIonMz = CalculateSelectedIonMz(reaction, monoisotopicMz, isolationWidth); Writer.WriteLine("PEPMASS=" + selectedIonMz.ToString(CultureInfo.InvariantCulture)); } // charge if (charge != null) { // Scan polarity var polarity = PositivePolarity; if (scanFilter.Polarity == PolarityType.Negative) { polarity = NegativePolarity; } Writer.WriteLine($"CHARGE={charge}{polarity}"); } // write the filter string //Writer.WriteLine($"SCANEVENT={scanEvent.ToString()}"); // Check if the scan has a centroid stream if (scan.HasCentroidStream && (scanEvent.ScanData == ScanDataType.Centroid || (scanEvent.ScanData == ScanDataType.Profile && !ParseInput.NoPeakPicking))) { var centroidStream = rawFile.GetCentroidStream(scanNumber, false); if (scan.CentroidScan.Length > 0) { for (var i = 0; i < centroidStream.Length; i++) { Writer.WriteLine( centroidStream.Masses[i].ToString("0.0000000", CultureInfo.InvariantCulture) + " " + centroidStream.Intensities[i].ToString("0.0000000000", CultureInfo.InvariantCulture)); } } } // Otherwise take the profile data else { // Get the scan statistics from the RAW file for this scan number var scanStatistics = rawFile.GetScanStatsForScanNumber(scanNumber); // Get the segmented (low res and profile) scan data var segmentedScan = rawFile.GetSegmentedScanFromScanNumber(scanNumber, scanStatistics); for (var i = 0; i < segmentedScan.Positions.Length; i++) { Writer.WriteLine( segmentedScan.Positions[i].ToString("0.0000000", CultureInfo.InvariantCulture) + " " + segmentedScan.Intensities[i].ToString("0.0000000000", CultureInfo.InvariantCulture)); } } Writer.WriteLine("END IONS"); Log.Debug("Spectrum written to file -- SCAN " + scanNumber); break; } } if (!ParseInput.Verbose) { Console.WriteLine(); } } }
/// <summary> /// Construct a spectrum element for the given scan /// </summary> /// <param name="scanNumber">the scan number</param> /// <returns>The SpectrumType object</returns> private SpectrumType ConstructSpectrum(int scanNumber) { // Get each scan from the RAW file var scan = Scan.FromFile(_rawFile, scanNumber); // Get the scan filter for this scan number var scanFilter = _rawFile.GetFilterForScanNumber(scanNumber); // Get the scan event for this scan number var scanEvent = _rawFile.GetScanEventForScanNumber(scanNumber); var spectrum = new SpectrumType { id = ConstructSpectrumTitle(scanNumber), defaultArrayLength = 0 }; // Add the ionization type if necessary if (!_ionizationTypes.ContainsKey(scanFilter.IonizationMode)) { _ionizationTypes.Add(scanFilter.IonizationMode, OntologyMapping.IonizationTypes[scanFilter.IonizationMode]); } // Add the mass analyzer if necessary if (!_massAnalyzers.ContainsKey(scanFilter.MassAnalyzer) && OntologyMapping.MassAnalyzerTypes.ContainsKey(scanFilter.MassAnalyzer)) { _massAnalyzers.Add(scanFilter.MassAnalyzer, "IC" + (_massAnalyzers.Count + 1)); } // Keep the CV params in a list and convert to array afterwards var spectrumCvParams = new List <CVParamType> { new CVParamType { name = "ms level", accession = "MS:1000511", value = ((int)scanFilter.MSOrder).ToString(CultureInfo.InvariantCulture), cvRef = "MS" } }; // Trailer extra data list var trailerData = _rawFile.GetTrailerExtraInformation(scanNumber); int? charge = null; double?monoisotopicMass = null; for (var i = 0; i < trailerData.Length; i++) { if (trailerData.Labels[i] == "Charge State:") { if (Convert.ToInt32(trailerData.Values[i]) > 0) { charge = Convert.ToInt32(trailerData.Values[i]); } } if (trailerData.Labels[i] == "Monoisotopic M/Z:") { monoisotopicMass = double.Parse(trailerData.Values[i]); } } // Construct and set the scan list element of the spectrum var scanListType = ConstructScanList(scanNumber, scan, scanFilter, scanEvent, monoisotopicMass); spectrum.scanList = scanListType; switch (scanFilter.MSOrder) { case MSOrderType.Ms: spectrumCvParams.Add(new CVParamType { accession = "MS:1000579", cvRef = "MS", name = "MS1 spectrum", value = "" }); // Keep track of scan number for precursor reference _precursorScanNumber = scanNumber; break; case MSOrderType.Ms2: spectrumCvParams.Add(new CVParamType { accession = "MS:1000580", cvRef = "MS", name = "MSn spectrum", value = "" }); // Construct and set the precursor list element of the spectrum var precursorListType = ConstructPrecursorList(scanEvent, charge); spectrum.precursorList = precursorListType; break; case MSOrderType.Ng: break; case MSOrderType.Nl: break; case MSOrderType.Par: break; case MSOrderType.Any: break; case MSOrderType.Ms3: break; case MSOrderType.Ms4: break; case MSOrderType.Ms5: break; case MSOrderType.Ms6: break; case MSOrderType.Ms7: break; case MSOrderType.Ms8: break; case MSOrderType.Ms9: break; case MSOrderType.Ms10: break; default: throw new ArgumentOutOfRangeException(); } // Scan polarity var polarityType = scanFilter.Polarity; switch (polarityType) { case PolarityType.Positive: spectrumCvParams.Add(new CVParamType { accession = "MS:1000130", cvRef = "MS", name = "positive scan", value = "" }); break; case PolarityType.Negative: spectrumCvParams.Add(new CVParamType { accession = "MS:1000129", cvRef = "MS", name = "negative scan", value = "" }); break; case PolarityType.Any: break; default: throw new ArgumentOutOfRangeException(); } // Total ion current spectrumCvParams.Add(new CVParamType { name = "total ion current", accession = "MS:1000285", value = scan.ScanStatistics.TIC.ToString(CultureInfo.InvariantCulture), cvRef = "MS" }); double?basePeakMass = null; double?basePeakIntensity = null; double?lowestObservedMz = null; double?highestObservedMz = null; double[] masses = null; double[] intensities = null; if (scan.HasCentroidStream) { var centroidStream = _rawFile.GetCentroidStream(scanNumber, false); if (scan.CentroidScan.Length > 0) { basePeakMass = centroidStream.BasePeakMass; basePeakIntensity = centroidStream.BasePeakIntensity; lowestObservedMz = centroidStream.Masses[0]; highestObservedMz = centroidStream.Masses[centroidStream.Masses.Length - 1]; masses = centroidStream.Masses; intensities = centroidStream.Intensities; // Note that although the scan data type is profile, // centroid data might be available spectrumCvParams.Add(new CVParamType { accession = "MS:1000127", cvRef = "MS", name = "centroid spectrum", value = "" }); } } else { // Get the scan statistics from the RAW file for this scan number var scanStatistics = _rawFile.GetScanStatsForScanNumber(scanNumber); basePeakMass = scanStatistics.BasePeakMass; basePeakIntensity = scanStatistics.BasePeakIntensity; // Get the segmented (low res and profile) scan data var segmentedScan = _rawFile.GetSegmentedScanFromScanNumber(scanNumber, scanStatistics); if (segmentedScan.Positions.Length > 0) { lowestObservedMz = segmentedScan.Positions[0]; highestObservedMz = segmentedScan.Positions[segmentedScan.Positions.Length - 1]; masses = segmentedScan.Positions; intensities = segmentedScan.Intensities; spectrumCvParams.Add(new CVParamType { accession = "MS:1000128", cvRef = "MS", name = "profile spectrum", value = "" }); } } // Base peak m/z if (basePeakMass != null) { spectrumCvParams.Add(new CVParamType { name = "base peak m/z", accession = "MS:1000504", value = basePeakMass.ToString(), unitCvRef = "MS", unitName = "m/z", unitAccession = "MS:1000040", cvRef = "MS" }); } // Base peak intensity if (basePeakMass != null) { spectrumCvParams.Add(new CVParamType { name = "base peak intensity", accession = "MS:1000505", value = basePeakIntensity.ToString(), unitCvRef = "MS", unitName = "number of detector counts", unitAccession = "MS:1000131", cvRef = "MS" }); } // Lowest observed mz if (lowestObservedMz != null) { spectrumCvParams.Add(new CVParamType { name = "lowest observed m/z", accession = "MS:1000528", value = lowestObservedMz.ToString(), unitCvRef = "MS", unitAccession = "MS:1000040", unitName = "m/z", cvRef = "MS" }); } // Highest observed mz if (highestObservedMz != null) { spectrumCvParams.Add(new CVParamType { name = "highest observed m/z", accession = "MS:1000527", value = highestObservedMz.ToString(), unitAccession = "MS:1000040", unitName = "m/z", unitCvRef = "MS", cvRef = "MS" }); } // Add the CV params to the spectrum spectrum.cvParam = spectrumCvParams.ToArray(); // Binary data array list var binaryData = new List <BinaryDataArrayType>(); // M/Z Data if (!masses.IsNullOrEmpty()) { // Set the spectrum default array length spectrum.defaultArrayLength = masses.Length; var massesBinaryData = new BinaryDataArrayType { binary = GetZLib64BitArray(masses) }; massesBinaryData.encodedLength = (4 * Math.Ceiling((double)massesBinaryData .binary.Length / 3)).ToString(CultureInfo.InvariantCulture); massesBinaryData.cvParam = new CVParamType[3]; massesBinaryData.cvParam[0] = new CVParamType { accession = "MS:1000514", name = "m/z array", cvRef = "MS", unitName = "m/z", value = "", unitCvRef = "MS", unitAccession = "MS:1000040" }; massesBinaryData.cvParam[1] = new CVParamType { accession = "MS:1000523", name = "64-bit float", cvRef = "MS", value = "" }; massesBinaryData.cvParam[2] = new CVParamType { accession = "MS:1000574", name = "zlib compression", cvRef = "MS", value = "" }; binaryData.Add(massesBinaryData); } // Intensity Data if (!intensities.IsNullOrEmpty()) { // Set the spectrum default array length if necessary if (spectrum.defaultArrayLength == 0) { spectrum.defaultArrayLength = masses.Length; } var intensitiesBinaryData = new BinaryDataArrayType { binary = GetZLib64BitArray(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", unitCvRef = "MS", unitAccession = "MS:1000131", unitName = "number of counts", value = "" }; 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()) { spectrum.binaryDataArrayList = new BinaryDataArrayListType { count = binaryData.Count.ToString(), binaryDataArray = binaryData.ToArray() }; } return(spectrum); }
/// <inheritdoc /> public override void Write(IRawDataPlus rawFile, int firstScanNumber, int lastScanNumber) { ConfigureWriter(".mgf"); using (Writer) { for (var scanNumber = firstScanNumber; scanNumber <= lastScanNumber; scanNumber++) { // Get each scan from the RAW file var scan = Scan.FromFile(rawFile, scanNumber); // Check to see if the RAW file contains label (high-res) data and if it is present // then look for any data that is out of order var time = rawFile.RetentionTimeFromScanNumber(scanNumber); // Get the scan filter for this scan number var scanFilter = rawFile.GetFilterForScanNumber(scanNumber); // Get the scan event for this scan number var scanEvent = rawFile.GetScanEventForScanNumber(scanNumber); // Only consider MS2 spectra if (scanFilter.MSOrder == MSOrderType.Ms2) { if (scanEvent.ScanData == ScanDataType.Centroid || (scanEvent.ScanData == ScanDataType.Profile && !ParseInput.ExcludeProfileData)) { Writer.WriteLine("BEGIN IONS"); Writer.WriteLine($"TITLE={ConstructSpectrumTitle(scanNumber)}"); Writer.WriteLine($"SCAN={scanNumber}"); Writer.WriteLine($"RTINSECONDS={time * 60}"); // Get the reaction information for the first precursor try { var reaction = scanEvent.GetReaction(0); var precursorMass = reaction.PrecursorMass; Writer.WriteLine($"PEPMASS={precursorMass:F7}"); } catch (ArgumentOutOfRangeException exception) { Log.Warn("No reaction found for scan " + scanNumber); } // trailer extra data list var trailerData = rawFile.GetTrailerExtraInformation(scanNumber); for (var i = 0; i < trailerData.Length; i++) { if (trailerData.Labels[i] == "Charge State:") { if (Convert.ToInt32(trailerData.Values[i]) > 0) { Writer.WriteLine($"CHARGE={trailerData.Values[i]}+"); } } } // Check if the scan has a centroid stream if (scan.HasCentroidStream) { var centroidStream = rawFile.GetCentroidStream(scanNumber, false); if (scan.CentroidScan.Length > 0) { for (var i = 0; i < centroidStream.Length; i++) { Writer.WriteLine( $"{centroidStream.Masses[i]:F7} {centroidStream.Intensities[i]:F10}"); } } } // Otherwise take the profile data else { // Get the scan statistics from the RAW file for this scan number var scanStatistics = rawFile.GetScanStatsForScanNumber(scanNumber); // Get the segmented (low res and profile) scan data var segmentedScan = rawFile.GetSegmentedScanFromScanNumber(scanNumber, scanStatistics); for (var i = 0; i < segmentedScan.Positions.Length; i++) { Writer.WriteLine( $"{segmentedScan.Positions[i]:F7} {segmentedScan.Intensities[i]:F10}"); } } Writer.WriteLine("END IONS"); } } } } }
/// <inheritdoc /> public override void Write(IRawDataPlus rawFile, int firstScanNumber, int lastScanNumber) { ConfigureWriter(".mgf"); using (Writer) { for (var scanNumber = firstScanNumber; scanNumber <= lastScanNumber; scanNumber++) { // Get each scan from the RAW file var scan = Scan.FromFile(rawFile, scanNumber); // Check to see if the RAW file contains label (high-res) data and if it is present // then look for any data that is out of order var time = rawFile.RetentionTimeFromScanNumber(scanNumber); // Get the scan filter for this scan number var scanFilter = rawFile.GetFilterForScanNumber(scanNumber); // Get the scan event for this scan number var scanEvent = rawFile.GetScanEventForScanNumber(scanNumber); switch (scanFilter.MSOrder) { case MSOrderType.Ms: // Keep track of scan number for precursor reference _precursorScanNumber = scanNumber; break; case MSOrderType.Ms2: { if (scanEvent.ScanData == ScanDataType.Centroid || (scanEvent.ScanData == ScanDataType.Profile && (scan.HasCentroidStream || ParseInput.OutputFormat != OutputFormat.MGFNoProfileData))) { Writer.WriteLine("BEGIN IONS"); Writer.WriteLine($"TITLE={ConstructSpectrumTitle(scanNumber)}"); Writer.WriteLine($"SCANS={scanNumber}"); Writer.WriteLine($"RTINSECONDS={(time * 60).ToString(CultureInfo.InvariantCulture)}"); // Get the reaction information for the first precursor try { var reaction = scanEvent.GetReaction(0); var precursorMass = reaction.PrecursorMass; Writer.WriteLine("PEPMASS=" + precursorMass.ToString("0.0000000", CultureInfo.InvariantCulture)); //var precursorIntensity = 0.0; //GetPrecursorIntensity(rawFile, _precursorScanNumber, precursorMass); //Writer.WriteLine(precursorIntensity != null // ? $"PEPMASS={precursorMass:F7} {precursorIntensity}" // : $"PEPMASS={precursorMass:F7}"); } catch (ArgumentOutOfRangeException exception) { Log.Warn("No reaction found for scan " + scanNumber); } // trailer extra data list var trailerData = rawFile.GetTrailerExtraInformation(scanNumber); for (var i = 0; i < trailerData.Length; i++) { if (trailerData.Labels[i] == "Charge State:") { if (Convert.ToInt32(trailerData.Values[i]) > 0) { Writer.WriteLine($"CHARGE={trailerData.Values[i]}+"); } } } // write the filter string //Writer.WriteLine($"SCANEVENT={scanEvent.ToString()}"); // Check if the scan has a centroid stream if (scan.HasCentroidStream) { var centroidStream = rawFile.GetCentroidStream(scanNumber, false); if (scan.CentroidScan.Length > 0) { for (var i = 0; i < centroidStream.Length; i++) { Writer.WriteLine( centroidStream.Masses[i].ToString("0.0000000", CultureInfo.InvariantCulture) + " " + centroidStream.Intensities[i].ToString("0.0000000", CultureInfo.InvariantCulture)); } } } // Otherwise take the profile data else { // Get the scan statistics from the RAW file for this scan number var scanStatistics = rawFile.GetScanStatsForScanNumber(scanNumber); // Get the segmented (low res and profile) scan data var segmentedScan = rawFile.GetSegmentedScanFromScanNumber(scanNumber, scanStatistics); for (var i = 0; i < segmentedScan.Positions.Length; i++) { Writer.WriteLine( segmentedScan.Positions[i].ToString("0.0000000", CultureInfo.InvariantCulture) + " " + segmentedScan.Intensities[i].ToString("0.0000000000", CultureInfo.InvariantCulture)); } } Writer.WriteLine("END IONS"); } break; } } } } }
/// <summary> /// </summary> /// <param name="rawFile"></param> /// <param name="filename"></param> /// <param name="L"></param> public static void WriteSpectrumAsRcode(this IRawDataPlus rawFile, string filename, List <int> L) { int count = 1; var trailerFields = rawFile.GetTrailerExtraHeaderInformation(); int indexCharge = rawFile.GetIndexOfPattern("Charge State"); int indexMonoisotopicmZ = rawFile.GetIndexOfPattern("MonoisotopicmZ"); using (System.IO.StreamWriter file = new System.IO.StreamWriter(filename)) { foreach (int scanNumber in L) { var basepeakMass = -1.0; var basepeakIntensity = -1.0; var scanStatistics = rawFile.GetScanStatsForScanNumber(scanNumber); var centroidStream = rawFile.GetCentroidStream(scanNumber, false); var scanTrailer = rawFile.GetTrailerExtraInformation(scanNumber); var scanEvent = rawFile.GetScanEventForScanNumber(scanNumber); var scan = Scan.FromFile(rawFile, scanNumber); file.WriteLine("e$Spectrum[[{0}]] <- list(", count++); file.WriteLine("\tscan = {0},", scanNumber); try { basepeakMass = (scanStatistics.BasePeakMass); basepeakIntensity = Math.Round(scanStatistics.BasePeakIntensity); file.WriteLine("\tbasePeak = c({0}, {1}),", basepeakMass, basepeakIntensity); } catch { file.WriteLine("\tbasePeak = c(NA, NA),"); } file.WriteLine("\tTIC = {0},", scanStatistics.TIC.ToString()); file.WriteLine("\tmassRange = c({0}, {1}),", scanStatistics.LowMass.ToString(), scanStatistics.HighMass.ToString()); file.WriteLine("\tscanType = \"{0}\",", scanStatistics.ScanType.ToString()); file.WriteLine("\trtinseconds = {0},", Math.Round(scanStatistics.StartTime * 60 * 1000) / 1000); try { var reaction0 = scanEvent.GetReaction(0); file.WriteLine("\tpepmass = {0},", reaction0.PrecursorMass); } catch { file.WriteLine("\tpepmass = NA,"); } if (scanStatistics.IsCentroidScan && centroidStream.Length > 0) { // Get the centroid (label) data from the RAW file for this scan file.WriteLine("\tcentroidStream = TRUE,"); file.WriteLine("\tHasCentroidStream = '{0}, Length={1}',", scan.HasCentroidStream, scan.CentroidScan.Length); if (scan.HasCentroidStream) { file.WriteLine("\tcentroid.mZ = c(" + string.Join(", ", scan.CentroidScan.Masses.ToArray()) + "),"); file.WriteLine("\tcentroid.intensity = c(" + string.Join(", ", scan.CentroidScan.Intensities.ToArray()) + "),"); } file.WriteLine("\ttitle = \"File: {0}; SpectrumID: {1}; scans: {2}\",", Path.GetFileName(rawFile.FileName), null, scanNumber); if (indexMonoisotopicmZ > 0) { file.WriteLine("\tmonoisotopicMz = {0},", Convert.ToDouble(scanTrailer.Values.ToArray()[indexMonoisotopicmZ])); } else { file.WriteLine("\tmonoisotopicMz = NA,"); } if (indexCharge > 0) { file.WriteLine("\tcharge = {0},", int.Parse(scanTrailer.Values.ToArray()[indexCharge])); } else { file.WriteLine("\tcharge = NA,"); } file.WriteLine("\tmZ = c(" + string.Join(", ", centroidStream.Masses) + "),"); file.WriteLine("\tintensity = c(" + string.Join(", ", centroidStream.Intensities) + "),"); file.WriteLine("\tnoises = c(" + string.Join(", ", centroidStream.Noises) + "),"); file.WriteLine("\tresolutions = c(" + string.Join(", ", centroidStream.Resolutions.ToArray()) + "),"); file.WriteLine("\tcharges = c(" + string.Join(", ", centroidStream.Charges) + "),"); file.WriteLine("\tbaselines = c(" + string.Join(", ", centroidStream.Baselines) + "),"); } else { file.WriteLine("\tcentroidStream = FALSE,"); file.WriteLine("\tHasCentroidStream = '{0}, Length={1}',", scan.HasCentroidStream, scan.CentroidScan.Length); if (scan.HasCentroidStream) { file.WriteLine("\tcentroid.mZ = c(" + string.Join(",", scan.CentroidScan.Masses.ToArray()) + "),"); file.WriteLine("\tcentroid.intensity = c(" + string.Join(",", scan.CentroidScan.Intensities.ToArray()) + "),"); } file.WriteLine("\ttitle = \"File: {0}; SpectrumID: {1}; scans: {2}\",", Path.GetFileName(rawFile.FileName), null, scanNumber); if (indexCharge > 0) { file.WriteLine("\tcharge = {0},", int.Parse(scanTrailer.Values.ToArray()[indexCharge])); } else { file.WriteLine("\tcharge = NA,"); } if (indexMonoisotopicmZ > 0) { file.WriteLine("\tmonoisotopicMz = {0},", Convert.ToDouble(scanTrailer.Values.ToArray()[indexMonoisotopicmZ])); } else { file.WriteLine("\tmonoisotopicMz = NA,"); } file.WriteLine("\tmZ = c(" + string.Join(",", scan.SegmentedScan.Positions) + "),"); file.WriteLine("\tintensity = c(" + string.Join(",", scan.SegmentedScan.Intensities) + "),"); // file.WriteLine("\tnoises = c(" + string.Join(",", scan.SegmentedScan.Noises) + "),"); } // ============= Instrument Data ============= // write scan Trailer var trailerValues = scanTrailer.Values; var trailerLabels = scanTrailer.Labels; var zipTrailer = trailerLabels.ToArray().Zip(trailerValues, (a, b) => string.Format("\t\"{0}\" = \"{1}\"", a, b)); file.WriteLine(string.Join(", \n", zipTrailer)); file.WriteLine(")"); } } return; }
} } writer.Flush(); startNum += 1; } writer.Close(); } public static void getMSdataFromRT(double startRT, int endRT, string filePath, double lowMS = 0.00, double highMS = 0.00) { IRawDataPlus plus = RawFileReaderAdapter.FileFactory(filePath); plus.SelectInstrument(Device.MS, 1); if (highMS - 0.00 <= 0.01) { highMS = plus.RunHeaderEx.HighMass; } int startNum = plus.ScanNumberFromRetentionTime(startRT); int endNum = plus.ScanNumberFromRetentionTime(endRT); int maxNum = plus.RunHeaderEx.LastSpectrum > endNum ? endNum : plus.RunHeaderEx.LastSpectrum; string fileName = DateTime.Now.ToLocalTime().ToString().Replace("/", "").Replace(":", "").Replace(" ", "_") + ".csv"; FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write); StreamWriter writer = new StreamWriter(stream, Encoding.UTF8); writer.WriteLine("ScanNumber, RT, Mass, Resolution, Intensity, Noise, Filter"); while (startNum <= endNum) { Scan scan = Scan.FromFile(plus, startNum); string filter = plus.GetFilterForScanNumber(startNum).ToString(); int cnt = 0; while (cnt < scan.PreferredMasses.Length) { if (lowMS < scan.PreferredMasses[cnt] && scan.PreferredMasses[cnt] < highMS) { double rt = plus.RetentionTimeFromScanNumber(startNum); double msval = scan.PreferredMasses[cnt]; double resolution = (scan.PreferredResolutions.Length == 0) ? 0.0 : scan.PreferredResolutions[cnt]; double intensity = (scan.PreferredIntensities.Length == 0) ? 0.0 : scan.PreferredIntensities[cnt]; double noise = (scan.PreferredNoises.Length == 0) ? 0.0 : scan.PreferredNoises[cnt]; //writer.WriteLine("{0},{1},{2},{3},{4},{5},{6}", startNum.ToString(), rt.ToString(), msval.ToString(), resolution.ToString(), intensity.ToString(), noise.ToString(), filter.ToString()); writer.WriteLine("{0},{1},{2},{3}", startNum.ToString(), rt.ToString(), msval.ToString(), intensity.ToString()); } cnt += 1; } startNum += 1; } writer.Close(); } public static void getSRMIacdMZ(string filePath, double valMS,int recVal) { IRawDataPlus plus = RawFileReaderAdapter.FileFactory(filePath); ////////////////////////////////// plus.SelectInstrument(Device.MS, 1); ///////////////////////////////// var startNum = plus.RunHeaderEx.FirstSpectrum; var endNum = plus.RunHeaderEx.LastSpectrum; string fileName = DateTime.Now.ToLocalTime().ToString().Replace("/", "").Replace(":", "").Replace(" ", "_") + ".csv"; FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write); StreamWriter writer = new StreamWriter(stream, Encoding.UTF8); double[] masses = null; double[] intensities = null; writer.WriteLine("ScanNumber, RT, Mass, Intensity"); while (startNum <= endNum) { double rt = plus.RetentionTimeFromScanNumber(startNum); IScanFilter scanFilter = plus.GetFilterForScanNumber(startNum); if (scanFilter.MSOrder == MSOrderType.Ms) { Scan scan = Scan.FromFile(plus, startNum); IScanEvent scanEvent = plus.GetScanEventForScanNumber(startNum); if (scan.HasCentroidStream && (scanEvent.ScanData == ScanDataType.Centroid || scanEvent.ScanData == ScanDataType.Profile)) { var centroidStream = plus.GetCentroidStream(startNum, false); if (scan.CentroidScan.Length > 0) { masses = centroidStream.Masses; intensities = centroidStream.Intensities; } } else { // Get the scan statistics from the RAW file for this scan number var scanStatistics = plus.GetScanStatsForScanNumber(startNum); // Get the segmented (low res and profile) scan data var segmentedScan = plus.GetSegmentedScanFromScanNumber(startNum, scanStatistics); if (segmentedScan.Positions.Length > 0) { masses = segmentedScan.Positions; intensities = segmentedScan.Intensities; } } for(int i = 0; i < masses.Length; ++ i) { masses[i] = Double.Parse(masses[i].ToString("n4")); } int front = 0; int rear = masses.Length - 1; int mid = front + ((rear - front) >> 1); bool findVal = false; while(front <= rear) { if (Double.Equals(masses[mid],valMS)) { findVal = true; break; } else if(masses[mid] < valMS) { front = mid + 1; } else { rear = mid - 1; } mid = front + ((rear - front) >> 1); } if(findVal && intensities[mid] >= recVal) { writer.WriteLine("{0},{1},{2},{3}",startNum.ToString(), rt.ToString(), masses[mid].ToString(), intensities[mid].ToString()); } } writer.Flush(); startNum += 1; } writer.Close(); } } }
public bool IsCentroidScan(int scanNumber) { var scanStatistics = rawFile.GetScanStatsForScanNumber(scanNumber); return(scanStatistics.IsCentroidScan); }