Пример #1
0
        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);
                });
            }
        }