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 double[] GetScanFrequency(string filterString = "", int n = 100) { List <double> rv = new List <double>(); var filter = rawFile.GetFilterFromString(filterString); if (filter == null) { return(null); } var filteredScanNumbers = rawFile.GetFilteredScanEnumerator(filter).ToArray(); if (n > filteredScanNumbers.Length) { n = filteredScanNumbers.Length; } int stepsize = filteredScanNumbers.Length / n; double ortime = 0.0; for (int scanNumber = filteredScanNumbers[0]; scanNumber < filteredScanNumbers[filteredScanNumbers.Length - 1]; scanNumber += stepsize) { var scanStatistics = rawFile.GetScanStatsForScanNumber(scanNumber); var rtime = Math.Round(scanStatistics.StartTime * 60 * 1000) / 1000; rv.Add(rtime); rv.Add(stepsize / (rtime - ortime)); ortime = rtime; } return(rv.ToArray()); }
public static ScanIndex ScanIndices(IRawDataPlus rawFile) { rawFile.SelectInstrument(Device.MS, 1); Log.Information("Extracting scan indices"); Dictionary <int, ScanData> allScans; allScans = new Dictionary <int, ScanData>(); MSOrderType AnalysisOrder; List <int> ms1 = new List <int>(); List <int> ms2 = new List <int>(); List <int> ms3 = new List <int>(); List <int> msAny = new List <int>(); // populate the scan indices IEnumerable <int> scans = rawFile.GetFilteredScanEnumerator(rawFile.GetFilterFromString("")); // get all scans ProgressIndicator P = new ProgressIndicator(scans.Count(), "Extracting scan indices"); foreach (int scan in scans) { IScanEvent scanEvent = rawFile.GetScanEventForScanNumber(scan); ScanData scanData = new ScanData(); scanData.MassAnalyzer = scanEvent.MassAnalyzer; scanData.MSOrder = scanEvent.MSOrder; allScans.Add(scan, scanData); msAny.Add(scan); if (allScans[scan].MSOrder == MSOrderType.Ms) { ms1.Add(scan); } if (allScans[scan].MSOrder == MSOrderType.Ms2) { ms2.Add(scan); } if (allScans[scan].MSOrder == MSOrderType.Ms3) { ms3.Add(scan); } P.Update(); } P.Done(); // determine the msorder of the experiment if ((ms1.Count > 0) & (ms2.Count == 0) & (ms3.Count == 0)) { AnalysisOrder = MSOrderType.Ms; } else { if ((ms1.Count > 0) & (ms2.Count > 0) & (ms3.Count == 0)) { AnalysisOrder = MSOrderType.Ms2; } else { AnalysisOrder = MSOrderType.Ms3; } } ScanIndex scanIndex = new ScanIndex(); scanIndex.allScans = allScans; scanIndex.AnalysisOrder = AnalysisOrder; scanIndex.ScanEnumerators.Add(MSOrderType.Any, msAny.ToArray()); scanIndex.ScanEnumerators.Add(MSOrderType.Ms, ms1.ToArray()); scanIndex.ScanEnumerators.Add(MSOrderType.Ms2, ms2.ToArray()); scanIndex.ScanEnumerators.Add(MSOrderType.Ms3, ms3.ToArray()); return(scanIndex); }
public static void ExtractScanIndex(this RawDataCollection rawData, IRawDataPlus rawFile) { Log.Information("Extracting scan indices"); Dictionary <int, (MSOrderType MSOrder, MassAnalyzerType MassAnalyzer)> allScans; allScans = new Dictionary <int, (MSOrderType MSOrder, MassAnalyzerType MassAnalyzer)>(); MSOrderType AnalysisOrder; List <int> ms1 = new List <int>(); List <int> ms2 = new List <int>(); List <int> ms3 = new List <int>(); List <int> msAny = new List <int>(); // populate the scan indices IEnumerable <int> scans = rawFile.GetFilteredScanEnumerator(rawFile.GetFilterFromString("")); // get all scans foreach (int scan in scans) { IScanEvent scanEvent = rawFile.GetScanEventForScanNumber(scan); allScans.Add(scan, (scanEvent.MSOrder, scanEvent.MassAnalyzer)); msAny.Add(scan); if (allScans[scan].MSOrder == MSOrderType.Ms) { ms1.Add(scan); } if (allScans[scan].MSOrder == MSOrderType.Ms2) { ms2.Add(scan); } if (allScans[scan].MSOrder == MSOrderType.Ms3) { ms3.Add(scan); } } // determine the msorder of the experiment if ((ms1.Count > 0) & (ms2.Count == 0) & (ms3.Count == 0)) { AnalysisOrder = MSOrderType.Ms; } else { if ((ms1.Count > 0) & (ms2.Count > 0) & (ms3.Count == 0)) { AnalysisOrder = MSOrderType.Ms2; } else { AnalysisOrder = MSOrderType.Ms3; } } rawData.scanIndex = new ScanIndex(); rawData.scanIndex.allScans = allScans; rawData.scanIndex.AnalysisOrder = AnalysisOrder; rawData.scanIndex.ScanEnumerators.Add(MSOrderType.Any, msAny.ToArray()); rawData.scanIndex.ScanEnumerators.Add(MSOrderType.Ms, ms1.ToArray()); rawData.scanIndex.ScanEnumerators.Add(MSOrderType.Ms2, ms2.ToArray()); rawData.scanIndex.ScanEnumerators.Add(MSOrderType.Ms3, ms3.ToArray()); // we need to check if it is a boxcar file because those have some scan index issues bool isBoxCar = rawFile.GetScanEventForScanNumber(1).MassRangeCount > 1; rawData.Performed.Add(Operations.ScanIndex); if (isBoxCar) { Log.Information("Raw file looks like a boxcar run. Scan indices being adjusted to account for missing scan dependents."); rawData.ExtractPrecursorScans(rawFile); rawData.scanIndex.ScanEnumerators[rawData.scanIndex.AnalysisOrder] = rawData.precursorScans.Keys.ToArray(); } }