// second instance method is for ITMS data public static QuantData QuantifyOneScan(SegmentedScanData segmentedScan, string labelingReagent) { (string[] Labels, double[] Masses)reporters = new LabelingReagents().Reagents[labelingReagent]; QuantData quantData = new QuantData(); int index; for (int i = 0; i < reporters.Masses.Length; i++) { double mass = reporters.Masses[i]; int[] indices = segmentedScan.Positions.FindAllIndex1((x) => { if (Math.Abs(x - mass) / mass * 1e6 < 10) { return(true); } else { return(false); } }); if (indices.Length > 1) { double[] massDiff = new double[indices.Length]; for (int ix = 0; ix < indices.Length; ix++) { massDiff[ix] = Math.Abs(segmentedScan.Positions[indices[ix]] - mass); } index = Array.Find(indices, (x) => { return(massDiff[x] == massDiff.Min()); }); quantData.Add(reporters.Labels[i], new ReporterIon(segmentedScan.Positions[index], segmentedScan.Intensities[index], massDiff[index] / mass * 1e6)); } else { if (indices.Length == 1) { index = indices[0]; var diff = Math.Abs(segmentedScan.Positions[index] - mass); quantData.Add(reporters.Labels[i], new ReporterIon(segmentedScan.Positions[index], segmentedScan.Intensities[index], diff / mass * 1e6)); } else { quantData.Add(reporters.Labels[i], new ReporterIon(0, 0, 0)); } } } return(quantData); }
public static (CentroidStreamCollection centroids, SegmentScanCollection segments) MsData(IRawDataPlus rawFile, ScanIndex index) { rawFile.SelectInstrument(Device.MS, 1); CentroidStreamCollection centroids = new CentroidStreamCollection(); SegmentScanCollection segments = new SegmentScanCollection(); CentroidStream centroid; SegmentedScan segment; var scans = index.allScans; //var lockTarget = new object(); // this is so we can keep track of progress in the parallel loop ProgressIndicator P = new ProgressIndicator(scans.Count(), "Extracting scan data"); P.Start(); foreach (int scan in scans.Keys) { // first get out the mass spectrum if (index.allScans[scan].MassAnalyzer == MassAnalyzerType.MassAnalyzerFTMS) { centroid = rawFile.GetCentroidStream(scan, false); centroids[scan] = new CentroidStreamData(centroid); } else { segment = rawFile.GetSegmentedScanFromScanNumber(scan, null); segments[scan] = new SegmentedScanData(segment); } //lock (lockTarget) //{ // P.Update(); //} P.Update(); } P.Done(); return(centroids, segments); }
public static void WriteMGF(RawDataCollection rawData, IRawDataPlus rawFile, string outputDirectory, double cutoff = 0, int[] scans = null, double intensityCutoff = 0.01) { double intCutoff = 0; string fileName = ReadWrite.GetPathToFile(outputDirectory, rawData.rawFileName, ".mgf"); MassAnalyzerType ms2MassAnalyzer = rawData.methodData.MassAnalyzers[MSOrderType.Ms2]; List <Operations> operations = new List <Operations> { Operations.ScanIndex, Operations.MethodData, Operations.TrailerExtras, Operations.RetentionTimes }; if (ms2MassAnalyzer == MassAnalyzerType.MassAnalyzerFTMS) { operations.Add(Operations.Ms2CentroidStreams); } else { operations.Add(Operations.Ms2SegmentedScans); } CheckIfDone.Check(rawData, rawFile, operations); const int BufferSize = 65536; // 64 Kilobytes using (StreamWriter f = new StreamWriter(fileName, false, Encoding.UTF8, BufferSize)) //Open a new file, the MGF file { // if the scans argument is null, use all scans if (scans == null) { scans = rawData.scanIndex.ScanEnumerators[MSOrderType.Ms2]; } ProgressIndicator progress = new ProgressIndicator(scans.Count(), String.Format("Writing MGF file")); foreach (int i in scans) { f.WriteLine("\nBEGIN IONS"); f.WriteLine("RAWFILE={0}", rawData.rawFileName); f.WriteLine("TITLE=Spectrum_{0}", i); f.WriteLine("SCAN={0}", i); f.WriteLine("RTINSECONDS={0}", rawData.retentionTimes[i]); f.WriteLine("PEPMASS={0}", rawData.trailerExtras[i].MonoisotopicMZ); f.WriteLine("CHARGE={0}", rawData.trailerExtras[i].ChargeState); if (ms2MassAnalyzer == MassAnalyzerType.MassAnalyzerFTMS) { CentroidStreamData centroid = rawData.centroidStreams[i]; if (centroid.Intensities.Length > 0) { intCutoff = centroid.Intensities.Max() * intensityCutoff; } else { intCutoff = 0; } for (int j = 0; j < centroid.Masses.Length; j++) { //f.WriteLine(Math.Round(centroid.Masses[j], 4).ToString() + " " + Math.Round(centroid.Intensities[j], 4).ToString()); if (centroid.Masses[j] > cutoff & centroid.Intensities[j] > intCutoff) { f.WriteLine("{0} {1}", Math.Round(centroid.Masses[j], 5), Math.Round(centroid.Intensities[j], 4)); } } } else { SegmentedScanData segments = rawData.segmentedScans[i]; if (segments.Intensities.Length > 0) { intCutoff = segments.Intensities.Max() * intensityCutoff; } else { intCutoff = 0; } for (int j = 0; j < segments.Positions.Length; j++) { if (segments.Positions[j] > cutoff & segments.Intensities[j] > intCutoff) { f.WriteLine("{0} {1}", Math.Round(segments.Positions[j], 5), Math.Round(segments.Intensities[j], 4)); } } } f.WriteLine("END IONS"); progress.Update(); } progress.Done(); } Utilities.ConsoleUtils.ClearLastLine(); }