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); }
private static TrailerExtraData ExtractOneTrailerExtra(IRawDataPlus rawFile, int scan, TrailerExtraIndices indices) { TrailerExtraData trailerExtra = new TrailerExtraData(); Double[] spsMasses; if (indices.InjectionTime != -1) { trailerExtra.InjectionTime = Convert.ToDouble(rawFile.GetTrailerExtraValue(scan, indices.InjectionTime)); } if (indices.ChargeState != -1) { trailerExtra.ChargeState = Convert.ToInt32(rawFile.GetTrailerExtraValue(scan, indices.ChargeState)); } if (indices.MonoisotopicMZ != -1) { trailerExtra.MonoisotopicMZ = Convert.ToDouble(rawFile.GetTrailerExtraValue(scan, indices.MonoisotopicMZ)); } if (indices.MasterScan != -1) { try { trailerExtra.MasterScan = Convert.ToInt32(rawFile.GetTrailerExtraValue(scan, indices.MasterScan)); } // if that doesn't work the master scan is (hopefully) not applicable, we can leave it at the defaule value of -1 catch (FormatException) { } } if (indices.HCDEnergy != -1) { var hcd = rawFile.GetTrailerExtraValue(scan, indices.HCDEnergy).ToString(); if (hcd != "N/A" & hcd != "" & !hcd.All(x => x == ' ')) { try { trailerExtra.HCDEnergy = Convert.ToDouble(rawFile.GetTrailerExtraValue(scan, indices.HCDEnergy)); } catch (FormatException) { } } } if (indices.SPSMasses.Count > 2) // if so, this means with have all SPS masses listed individually { spsMasses = new double[indices.SPSMasses.Count]; for (int i = 0; i < indices.SPSMasses.Count; i++) { spsMasses[i] = Convert.ToDouble(rawFile.GetTrailerExtraValue(scan, indices.SPSMasses[i])); } } if (indices.SPSMasses.Count == 0) // there are no SPS masses { spsMasses = new double[0]; } else // they are broken into two lists of strings, comma delimited { char[] delimiter = { ' ', ',' }; string[] stringsps1 = rawFile.GetTrailerExtraValue(scan, indices.SPSMasses[0]).ToString().Split(delimiter, StringSplitOptions.RemoveEmptyEntries); string[] stringsps2 = rawFile.GetTrailerExtraValue(scan, indices.SPSMasses[1]).ToString().Split(delimiter, StringSplitOptions.RemoveEmptyEntries); double[] sps1 = Array.ConvertAll(stringsps1, Convert.ToDouble); double[] sps2 = Array.ConvertAll(stringsps2, Convert.ToDouble); spsMasses = new double[sps1.Length + sps2.Length]; sps1.CopyTo(spsMasses, 0); sps2.CopyTo(spsMasses, sps1.Length); } trailerExtra.SPSMasses = spsMasses; return(trailerExtra); }