public void Init(string path) { using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) { using (StreamReader sr = new StreamReader(fileStream)) { string line; List <IPeak> peaks = new List <IPeak>(); int scan_num = 0; double rention_time = 0; double precursor_mz = 0; int precursor_charge = 0; // Read lines from the file until end of file (EOD) is reached. while ((line = sr.ReadLine()) != null) { if (line.StartsWith("BEGIN")) { peaks = new List <IPeak>(); } else if (line.StartsWith("END")) { MS2Spectrum spectrum = new MS2Spectrum(scan_num, rention_time, precursor_mz, precursor_charge); spectrum.SetPeaks(peaks); spectrumTable[scan_num] = spectrum; } else if (scan.IsMatch(line)) { MatchCollection matches = scan.Matches(line); foreach (Match match in matches) { GroupCollection groups = match.Groups; scan_num = int.Parse(groups[1].Value); break; } } else if (rt_second.IsMatch(line)) { MatchCollection matches = rt_second.Matches(line); foreach (Match match in matches) { GroupCollection groups = match.Groups; rention_time = double.Parse(groups[1].Value); break; } } else if (pepmass.IsMatch(line)) { MatchCollection matches = pepmass.Matches(line); foreach (Match match in matches) { GroupCollection groups = match.Groups; precursor_mz = double.Parse(groups[1].Value); break; } } else if (charge.IsMatch(line)) { MatchCollection matches = charge.Matches(line); foreach (Match match in matches) { GroupCollection groups = match.Groups; precursor_charge = int.Parse(groups[1].Value); break; } } else if (mz_intensity.IsMatch(line)) { MatchCollection matches = mz_intensity.Matches(line); foreach (Match match in matches) { GroupCollection groups = match.Groups; peaks.Add(new GeneralPeak(double.Parse(groups[1].Value), double.Parse(groups[2].Value))); break; } } } } } }
void GenerateTasks() { if (Path.GetExtension(msPath) == ".mgf") { MGFSpectrumReader reader = new MGFSpectrumReader(); reader.Init(msPath); Dictionary <int, MS2Spectrum> spectraData = reader.GetSpectrum(); foreach (int scan in spectraData.Keys) { MS2Spectrum spectrum = spectraData[scan]; SearchTask searchTask = new SearchTask(spectrum, spectrum.PrecursorMZ(), spectrum.PrecursorCharge()); tasks.Enqueue(searchTask); readingCounter.Add(spectraData.Count); } } else { ISpectrumReader reader = new ThermoRawSpectrumReader(); LocalMaximaPicking picking = new LocalMaximaPicking(); IProcess process = new WeightedAveraging(new LocalNeighborPicking()); reader.Init(msPath); int start = reader.GetFirstScan(); int end = reader.GetLastScan(); Dictionary <int, List <int> > scanGroup = new Dictionary <int, List <int> >(); int current = -1; for (int i = start; i < end; i++) { if (reader.GetMSnOrder(i) == 1) { current = i; scanGroup[i] = new List <int>(); } else if (reader.GetMSnOrder(i) == 2) { scanGroup[current].Add(i); } } Parallel.ForEach(scanGroup, new ParallelOptions { MaxDegreeOfParallelism = SearchingParameters.Access.ThreadNums }, (scanPair) => { if (scanPair.Value.Count > 0) { ISpectrum ms1 = reader.GetSpectrum(scanPair.Key); foreach (int i in scanPair.Value) { double mz = reader.GetPrecursorMass(i, reader.GetMSnOrder(i)); List <IPeak> ms1Peaks = FilterPeaks(ms1.GetPeaks(), mz, searchRange); if (ms1Peaks.Count() == 0) { continue; } ICharger charger = new Patterson(); int charge = charger.Charge(ms1Peaks, mz - searchRange, mz + searchRange); // insert pseudo peaks for large gap List <IPeak> peaks = new List <IPeak>(); double precision = 0.02; double last = ms1Peaks.First().GetMZ(); foreach (IPeak peak in ms1Peaks) { if (peak.GetMZ() - last > precision) { peaks.Add(new GeneralPeak(last + precision / 2, 0)); peaks.Add(new GeneralPeak(peak.GetMZ() - precision / 2, 0)); } peaks.Add(peak); last = peak.GetMZ(); } List <IPeak> majorPeaks = picking.Process(peaks); // find evelope cluster EnvelopeProcess envelope = new EnvelopeProcess(); var cluster = envelope.Cluster(majorPeaks, mz, charge); if (cluster.Count == 0) { continue; } // find monopeak Averagine averagine = new Averagine(AveragineType.GlycoPeptide); BrainCSharp braincs = new BrainCSharp(); MonoisotopicSearcher searcher = new MonoisotopicSearcher(averagine, braincs); MonoisotopicScore result = searcher.Search(mz, charge, cluster); double precursorMZ = result.GetMZ(); // search ISpectrum ms2 = reader.GetSpectrum(i); ms2 = process.Process(ms2); SearchTask searchTask = new SearchTask(ms2, precursorMZ, charge); tasks.Enqueue(searchTask); } } readingCounter.Add(scanGroup.Count); }); } }