public QuantificationChromotograph Build(IIdentifiedSpectrum mphit, IRawFile reader)
        {
            QuantificationChromotograph result = new QuantificationChromotograph();

            var envelopes = builder.Build(mphit);

            int startScan = mphit.Query.FileScan.FirstScan;

            double mzTolerance = PrecursorUtils.ppm2mz(envelopes[0][0], ppmTolerance);

            bool bFirst = true;

            int firstScanNumber = reader.GetFirstSpectrumNumber();
            int lastScanNumber  = reader.GetLastSpectrumNumber();

            //backward
            for (int scan = startScan; scan >= firstScanNumber; scan--)
            {
                if (1 == reader.GetMsLevel(scan))
                {
                    QuantificationScan qscan = reader.GetPeakList(scan).GetQuantificationScan(envelopes, mzTolerance);

                    if (!validate(qscan))
                    {
                        break;
                    }

                    if (bFirst)
                    {
                        qscan.IsIdentified = true;
                        bFirst             = false;
                    }
                    result.Insert(0, qscan);
                }
            }

            //forward
            for (int scan = startScan + 1; scan <= lastScanNumber; scan++)
            {
                if (1 == reader.GetMsLevel(scan))
                {
                    QuantificationScan qscan = reader.GetPeakList(scan).GetQuantificationScan(envelopes, mzTolerance);

                    if (!validate(qscan))
                    {
                        break;
                    }

                    result.Add(qscan);
                }
            }

            if (result.Count > 0)
            {
                result.IdentifiedSpectra.Add(mphit);
            }

            return(result);
        }
Esempio n. 2
0
        private List <Tuple <double, PointPairList> > GetMS3Spectra(int scan)
        {
            var result = new List <Tuple <double, PointPairList> >();

            for (int i = scan + 1; i <= lastScan; i++)
            {
                var mslevel = reader.GetMsLevel(i);
                if (mslevel != 3)
                {
                    break;
                }

                var pplms3       = new PointPairList();
                var ms3spectra   = GetPeakList(i);
                var ms3precursor = reader.GetPrecursorPeak(i);
                foreach (var m in ms3spectra)
                {
                    pplms3.Add(new PointPair(m.Mz, m.Intensity));
                }
                result.Add(new Tuple <double, PointPairList>(ms3precursor.Mz, pplms3));
            }

            result.Sort((m1, m2) => m1.Item1.CompareTo(m2.Item1));
            return(result);
        }
        public int Find(IRawFile reader, int scan)
        {
            int level       = reader.GetMsLevel(scan);
            var masterLevel = level - 1;

            scan--;
            int firstScan = reader.GetFirstSpectrumNumber();

            while (scan >= firstScan)
            {
                var curlevel = reader.GetMsLevel(scan);
                if (curlevel == masterLevel)
                {
                    return(scan);
                }
                scan--;
            }

            return(0);
        }
        public static int FindNextFullScan(this IRawFile rawFile, int fromScan, int lastScan)
        {
            for (int scan = fromScan; scan <= lastScan; scan++)
            {
                if (1 == rawFile.GetMsLevel(scan))
                {
                    return(scan);
                }
            }

            return(-1);
        }
        public static int FindParentScan(this IRawFile rawFile, int fromScan, int firstScan, int msParentLevel)
        {
            for (int scan = fromScan; scan >= firstScan; scan--)
            {
                if (msParentLevel == rawFile.GetMsLevel(scan))
                {
                    return(scan);
                }
            }

            return(-1);
        }
        public static void FillScanLevels(List <ScanLevel> levels, IRawFile rawFile)
        {
            var firstScan = rawFile.GetFirstSpectrumNumber();
            var lastScan  = rawFile.GetLastSpectrumNumber();

            for (var scan = firstScan; scan <= lastScan; scan++)
            {
                var mslevel = rawFile.GetMsLevel(scan);
                levels.Add(new ScanLevel()
                {
                    Scan  = scan,
                    Level = mslevel
                });
            }
        }
Esempio n. 7
0
        protected List <ScanLevel> GetRawScanLevels(IRawFile rawFile)
        {
            var result    = new List <ScanLevel>();
            var firstScan = rawFile.GetFirstSpectrumNumber();
            var lastScan  = rawFile.GetLastSpectrumNumber();

            for (var scan = firstScan; scan <= lastScan; scan++)
            {
                var mslevel = rawFile.GetMsLevel(scan);
                result.Add(new ScanLevel()
                {
                    Scan  = scan,
                    Level = mslevel
                });
            }
            return(result);
        }
Esempio n. 8
0
        public static List <PeakList <Peak> > GetMS1List(this IRawFile reader)
        {
            var result = new List <PeakList <Peak> >();
            var first  = reader.GetFirstSpectrumNumber();
            var last   = reader.GetLastSpectrumNumber();

            for (int i = first; i <= last; i++)
            {
                var mslevel = reader.GetMsLevel(i);
                if (mslevel == 1)
                {
                    var pkl = reader.GetPeakList(i);
                    result.Add(pkl);
                }
            }
            return(result);
        }
Esempio n. 9
0
        protected void DoGetOffsets(List <OffsetEntry> result, IRawFile reader, string msg)
        {
            var firstScan = reader.GetFirstSpectrumNumber();
            var lastScan  = reader.GetLastSpectrumNumber();

            SetMessage(msg);
            SetRange(firstScan, lastScan);

            for (int scan = firstScan; scan <= lastScan; scan++)
            {
                if (reader.GetMsLevel(scan) == 1)
                {
                    SetPosition(scan);

                    if (IsLoopStopped)
                    {
                        return;
                    }

                    if (Progress.IsCancellationPending())
                    {
                        throw new UserTerminatedException();
                    }

                    var pkl = reader.GetPeakList(scan);
                    var rt  = reader.ScanToRetentionTime(scan);

                    var offsetValues = GetOffsetsFromPeakList(pkl);

                    if (offsetValues.Count > 0)
                    {
                        var weightedPPM = GetWeightedPPM(offsetValues);
                        result.Add(new OffsetEntry(scan, rt, weightedPPM, offsetValues.Count));
                    }
                    else
                    {
                        result.Add(new OffsetEntry(scan, rt, 0, 0));
                    }
                }
            }
            CalculateOffset(result, m => m.InitValue);
        }
Esempio n. 10
0
        private List <SrmScan> GetMRMScans(string directory)
        {
            var fileName = GetPeakFileName(directory);

            if (File.Exists(fileName))
            {
                SetProgressMessage("Reading scan from " + fileName + " ...");
                return(new SrmScanFileFormat().ReadFromFile(fileName));
            }
            else
            {
                List <PeakList <Peak> > pkls = new List <PeakList <Peak> >();

                SetProgressMessage("Reading scan from " + directory + " ...");
                IRawFile reader = RawFileFactory.GetRawFileReader(directory);
                try
                {
                    var firstCount = reader.GetFirstSpectrumNumber();
                    var lastCount  = reader.GetLastSpectrumNumber();

                    Progress.SetRange(firstCount, lastCount);
                    Progress.SetPosition(firstCount);
                    for (int i = firstCount; i <= lastCount; i++)
                    {
                        if (reader.GetMsLevel(i) != 2)
                        {
                            continue;
                        }

                        if (Progress.IsCancellationPending())
                        {
                            throw new UserTerminatedException();
                        }

                        Progress.Increment(1);

                        var pkl       = reader.GetPeakList(i);
                        var precursor = reader.GetPrecursorPeak(i);
                        if (precursor != null)
                        {
                            pkl.PrecursorMZ     = precursor.Mz;
                            pkl.PrecursorCharge = precursor.Charge;
                        }
                        pkl.ScanTimes.Add(new ScanTime(i, reader.ScanToRetentionTime(i)));

                        pkls.Add(pkl);
                    }

                    List <SrmScan> result = new List <SrmScan>();

                    pkls.ForEach(m => m.ForEach(n => result.Add(new SrmScan(m.PrecursorMZ, n.Mz, m.ScanTimes[0].RetentionTime, n.Intensity, true))));

                    new SrmScanFileFormat().WriteToFile(fileName, result);

                    SetProgressMessage("finished.");

                    return(result);
                }
                finally
                {
                    reader.Close();
                }
            }
        }
        public override IEnumerable <string> Process(string fileName)
        {
            var result = new List <string>();

            QueryItemListFormat format = new QueryItemListFormat();

            FileInfo rawFile = new FileInfo(rawFileName);

            Progress.SetMessage("Reading query product ion from " + fileName);
            var queryItems = format.ReadFromFile(fileName);

            using (IRawFile reader = RawFileFactory.GetRawFileReader(rawFileName))
            {
                reader.Open(rawFileName);

                int firstSpectrumNumber = reader.GetFirstSpectrumNumber();

                LipidPrecursorQuery queryFunc = new LipidPrecursorQuery(reader);
                queryFunc.Progress = this.Progress;

                char[] chars = new char[] { '\t' };

                int curIndex = 0;
                foreach (var query in queryItems)
                {
                    Progress.SetMessage(MyConvert.Format("{0}/{1} - Querying precursor ions for product ion {2} ...", ++curIndex, queryItems.Count, query.ProductIonMz));

                    string savedQueryFile = GetQueryFileName(rawFileName, query.ProductIonMz, productIonPPM, precursorPPM);

                    PrecursorItemListXmlFormat pilFormat = new PrecursorItemListXmlFormat();
                    List <PrecursorItem>       precursors;
                    if (!File.Exists(savedQueryFile))
                    {
                        precursors = queryFunc.QueryPrecursorFromProductIon(query, productIonPPM, precursorPPM);
                        pilFormat.WriteToFile(savedQueryFile, precursors);
                    }
                    else
                    {
                        precursors = pilFormat.ReadFromFile(savedQueryFile);
                    }

                    result.Add(savedQueryFile);


                    var precursorMzs = (from item in precursors
                                        group item by item.PrecursorMZ into mzGroup
                                        let count = mzGroup.Where(m => m.PrecursorIntensity > 0).Count()
                                                    orderby count descending
                                                    select new PrecursorArea {
                        PrecursorMz = mzGroup.Key, ScanCount = count, Area = 0.0
                    }).ToList();

                    //去掉冗余的precursor
                    for (int i = precursorMzs.Count - 1; i >= 0; i--)
                    {
                        if (precursorMzs[i].ScanCount >= 5)
                        {
                            break;
                        }

                        for (int j = 0; j < i; j++)
                        {
                            if (precursorMzs[j].ScanCount < 5)
                            {
                                break;
                            }

                            double ppm = PrecursorUtils.mz2ppm(precursorMzs[i].PrecursorMz, Math.Abs(precursorMzs[i].PrecursorMz - precursorMzs[j].PrecursorMz));
                            if (ppm < precursorPPM)
                            {
                                precursorMzs.RemoveAt(i);
                                break;
                            }
                        }
                    }

                    string savedDetailDir = FileUtils.ChangeExtension(savedQueryFile, "");
                    if (!Directory.Exists(savedDetailDir))
                    {
                        Directory.CreateDirectory(savedDetailDir);
                    }

                    for (int i = 0; i < precursorMzs.Count; i++)
                    {
                        Progress.SetMessage(MyConvert.Format("{0}/{1} {2} - {3}/{4} Get chromotograph for precursor {5} ...", curIndex, queryItems.Count, query.ProductIonMz, i + 1, precursorMzs.Count, precursorMzs[i].PrecursorMz));

                        string targetFile = savedDetailDir + "\\" + GetDetailFileName(rawFileName, precursorMzs[i].PrecursorMz);

                        var itemFormat = new LabelFreeSummaryItemXmlFormat();

                        LabelFreeSummaryItem item;
                        if (File.Exists(targetFile))
                        {
                            item = itemFormat.ReadFromFile(targetFile);
                        }
                        else
                        {
                            var ions = queryFunc.QueryChromotograph(precursorMzs[i].PrecursorMz, precursorPPM);

                            int continueCount = 0;
                            int firstIndex    = -1;
                            for (int j = 0; j < ions.Count; j++)
                            {
                                if (ions[j].Intensity > 0)
                                {
                                    if (firstIndex == -1)
                                    {
                                        firstIndex    = j;
                                        continueCount = 1;
                                    }
                                    else
                                    {
                                        continueCount++;
                                        if (continueCount >= 5)
                                        {
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    firstIndex    = -1;
                                    continueCount = 0;
                                }
                            }

                            if (continueCount >= 5)
                            {
                                ions.RemoveRange(0, firstIndex);
                            }

                            continueCount = 0;
                            int lastIndex = -1;
                            for (int j = ions.Count - 1; j >= 0; j--)
                            {
                                if (ions[j].Intensity > 0)
                                {
                                    if (lastIndex == -1)
                                    {
                                        lastIndex     = j;
                                        continueCount = 1;
                                    }
                                    else
                                    {
                                        continueCount++;
                                        if (continueCount >= 5)
                                        {
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    lastIndex     = -1;
                                    continueCount = 0;
                                }
                            }

                            if (continueCount >= 5)
                            {
                                ions.RemoveRange(lastIndex + 1, ions.Count - lastIndex - 1);
                            }

                            //get full ms corresponding to identified ms/ms
                            var identified = new HashSet <int>();
                            foreach (var p in precursors)
                            {
                                if (p.PrecursorMZ == precursorMzs[i].PrecursorMz)
                                {
                                    for (int j = p.Scan - 1; j >= firstSpectrumNumber; j--)
                                    {
                                        if (reader.GetMsLevel(j) == 1)
                                        {
                                            identified.Add(j);
                                            break;
                                        }
                                    }
                                }
                            }

                            ions.ForEach(m =>
                            {
                                m.Identified = identified.Contains(m.Scan);
                                m.Enabled    = true;
                            });

                            Debug.Assert(ions.FindAll(m => m.Identified == true).Count == identified.Count);

                            item = new LabelFreeSummaryItem()
                            {
                                RawFilename = rawFileName,
                                Sequence    = MyConvert.Format("{0:0.0000}; {1:0.00}", query.ProductIonMz, query.MinRelativeIntensity)
                            };
                            item.AddRange(ions);
                            item.CalculatePPM(precursorMzs[i].PrecursorMz);

                            new LabelFreeSummaryItemXmlFormat().WriteToFile(targetFile, item);
                        }

                        precursorMzs[i].Area = item.GetArea();
                        string savedAreaFile = GetAreaFileName(rawFileName, query.ProductIonMz, productIonPPM, precursorPPM);
                        new PrecursorAreaListTextFormat().WriteToFile(savedAreaFile, precursorMzs);
                    }
                }

                return(result);
            }
        }
Esempio n. 12
0
        public override IEnumerable <string> Process(string targetDir)
        {
            foreach (var raw in rawFiles)
            {
                List <SimplePeakChro> waitingPeaks = new List <SimplePeakChro>();
                foreach (var peak in targetPeaks)
                {
                    string file = GetTargetFile(targetDir, raw, peak);
                    if (force || !File.Exists(file))
                    {
                        waitingPeaks.Add(peak);
                    }
                    else
                    {
                        var p = new SimplePeakChroXmlFormat().ReadFromFile(file);
                        peak.MaxRetentionTime = p.MaxRetentionTime;
                        peak.Peaks            = p.Peaks;
                    }
                }

                if (waitingPeaks.Count == 0)
                {
                    continue;
                }

                rawReader.Open(raw);
                try
                {
                    int firstScan = rawReader.GetFirstSpectrumNumber();
                    int lastScan  = rawReader.GetLastSpectrumNumber();

                    var lastRt = rawReader.ScanToRetentionTime(lastScan);

                    waitingPeaks.ForEach(m =>
                    {
                        m.Peaks.Clear();
                        m.MaxRetentionTime = lastRt;
                    });

                    Progress.SetMessage("Processing chromotograph extracting...");
                    Progress.SetRange(firstScan, lastScan);
                    for (int scan = firstScan; scan <= lastScan; scan++)
                    {
                        if (rawReader.GetMsLevel(scan) != 1)
                        {
                            continue;
                        }
                        Progress.SetPosition(scan);

                        if (Progress.IsCancellationPending())
                        {
                            throw new UserTerminatedException();
                        }

                        PeakList <Peak> pkl = rawReader.GetPeakList(scan);
                        double          rt  = rawReader.ScanToRetentionTime(scan);

                        foreach (var peak in waitingPeaks)
                        {
                            var env = pkl.FindPeak(peak.Mz, peak.MzTolerance);

                            Peak findPeak = new Peak(peak.Mz, 0.0, 0);
                            if (env.Count > 0)
                            {
                                if (env.Count == 1)
                                {
                                    findPeak = env[0];
                                }
                                else
                                {
                                    var charge = env.FindCharge(peak.Charge);
                                    if (charge.Count > 0)
                                    {
                                        if (charge.Count == 1)
                                        {
                                            findPeak = charge[0];
                                        }
                                        else
                                        {
                                            findPeak = charge.FindMaxIntensityPeak();
                                        }
                                    }
                                    else
                                    {
                                        findPeak = env.FindMaxIntensityPeak();
                                    }
                                }
                            }

                            peak.Peaks.Add(new ScanPeak()
                            {
                                Mz            = findPeak.Mz,
                                Intensity     = findPeak.Intensity,
                                Scan          = scan,
                                RetentionTime = rt,
                                Charge        = findPeak.Charge,
                                PPMDistance   = PrecursorUtils.mz2ppm(peak.Mz, findPeak.Mz - peak.Mz)
                            });
                        }
                    }

                    waitingPeaks.ForEach(m => m.TrimPeaks(minRetentionTime));
                }
                finally
                {
                    rawReader.Close();
                }

                Progress.SetMessage("Saving ... ");
                foreach (var peak in waitingPeaks)
                {
                    string file = GetTargetFile(targetDir, raw, peak);
                    new SimplePeakChroXmlFormat().WriteToFile(file, peak);
                }
                Progress.SetMessage("Finished.");
                Progress.End();
            }

            return(new string[] { targetDir });
        }
Esempio n. 13
0
        public override IEnumerable <string> Process(string rawFilename)
        {
            string ms1Filename      = GetResultFilename(rawFilename);
            string ms1IndexFilename = ms1Filename + ".index";

            rawFile.Open(rawFilename);
            try
            {
                int firstScan = rawFile.GetFirstSpectrumNumber();
                int lastScan  = rawFile.GetLastSpectrumNumber();

                int firstFullScan = 0;
                for (firstFullScan = firstScan; firstFullScan < lastScan; firstFullScan++)
                {
                    if (rawFile.GetMsLevel(firstFullScan) == 1)
                    {
                        break;
                    }
                }

                if (firstFullScan >= lastScan)
                {
                    return(new List <string>());
                }

                Progress.SetRange(firstScan, lastScan);

                using (var sw = new StreamWriter(ms1Filename))
                {
                    //write header
                    sw.Write("H\tCreationDate\t{0:m/dd/yyyy HH:mm:ss}\n", DateTime.Now);
                    sw.Write("H\tExtractor\t{0}\n", GetProgramName());
                    sw.Write("H\tExtractorVersion\t{0}\n", GetProgramVersion());
                    sw.Write("H\tComments\t{0} written by Quanhu Sheng, 2008-2009\n", GetProgramName());
                    sw.Write("H\tExtractorOptions\tMS1\n");
                    sw.Write("H\tAcquisitionMethod\tData-Dependent\n");
                    sw.Write("H\tDataType\tCentriod\n");
                    sw.Write("H\tScanType\tMS1\n");
                    sw.Write("H\tFirstScan\t{0}\n", firstScan);
                    sw.Write("H\tLastScan\t{0}\n", lastScan);

                    using (var swIndex = new StreamWriter(ms1IndexFilename))
                    {
                        for (int scan = firstScan; scan <= lastScan; scan++)
                        {
                            if (Progress.IsCancellationPending())
                            {
                                throw new UserTerminatedException();
                            }

                            Progress.SetPosition(scan);

                            if (rawFile.GetMsLevel(scan) == 1)
                            {
                                sw.Flush();

                                swIndex.Write("{0}\t{1}\n", scan, sw.BaseStream.Position);

                                sw.Write("S\t{0}\t{0}\n", scan);
                                sw.Write("I\tRetTime\t{0:0.####}\n", rawFile.ScanToRetentionTime(scan));

                                PeakList <Peak> pkl = rawFile.GetPeakList(scan);
                                foreach (Peak p in pkl)
                                {
                                    sw.Write("{0:0.0000} {1:0.0} {2}\n", p.Mz, p.Intensity, p.Charge);
                                }
                            }
                        }
                    }
                }
            }
            finally
            {
                rawFile.Close();
            }

            Progress.End();

            return(new[] { ms1Filename });
        }
 public void TestGetMsLevel()
 {
     Assert.AreEqual(1, reader.GetMsLevel(1));
     Assert.AreEqual(2, reader.GetMsLevel(3));
 }
Esempio n. 15
0
        public List <PrecursorItem> QueryPrecursorFromProductIon(QueryItem productIon, double ppmProductTolerance, double ppmPrecursorTolerance)
        {
            List <PrecursorItem> result = new List <PrecursorItem>();

            int firstScan = reader.GetFirstSpectrumNumber();
            int lastScan  = reader.GetLastSpectrumNumber();

            double mzTolerance = PrecursorUtils.ppm2mz(productIon.ProductIonMz, ppmProductTolerance);

            PeakList <Peak> lastFullScan = new PeakList <Peak>();

            Progress.SetRange(firstScan, lastScan);
            for (int scan = firstScan; scan <= lastScan; scan++)
            {
                Progress.SetPosition(scan);

                if (Progress.IsCancellationPending())
                {
                    throw new UserTerminatedException();
                }

                //ignore ms 1
                if (reader.GetMsLevel(scan) == 1)
                {
                    lastFullScan = ReadScan(scan);
                    continue;
                }

                //read all peaks
                PeakList <Peak> pkl = ReadScan(scan);

                //find product ions
                PeakList <Peak> productIons = pkl.FindPeak(productIon.ProductIonMz, mzTolerance);

                if (productIons.Count == 0)
                {
                    continue;
                }

                //get minimum product ion intensity
                double maxIntensity      = pkl.FindMaxIntensityPeak().Intensity;
                double relativeIntensity = productIons.FindMaxIntensityPeak().Intensity / maxIntensity;
                if (relativeIntensity < productIon.MinRelativeIntensity)
                {
                    continue;
                }

                Peak peak = reader.GetPrecursorPeak(scan);

                double precursorMzTolerance = PrecursorUtils.ppm2mz(peak.Mz, ppmPrecursorTolerance);

                var precursorPkl = lastFullScan.FindPeak(peak.Mz, precursorMzTolerance);

                bool isotopic = false;
                if (precursorPkl.Count == 0)
                {
                    isotopic     = true;
                    precursorPkl = lastFullScan.FindPeak(peak.Mz - 1.0, precursorMzTolerance);
                }

                if (precursorPkl.Count == 0)
                {
                    precursorPkl = lastFullScan.FindPeak(peak.Mz + 1.0, precursorMzTolerance);
                }

                var precursorInFullMs = precursorPkl.FindMaxIntensityPeak();

                var precursor = new PrecursorItem()
                {
                    Scan = scan,
                    ProductIonRelativeIntensity = relativeIntensity
                };

                if (isotopic && precursorInFullMs != null)
                {
                    precursor.PrecursorMZ = precursorInFullMs.Mz;
                    precursor.IsIsotopic  = true;
                }
                else
                {
                    precursor.PrecursorMZ = peak.Mz;
                    precursor.IsIsotopic  = false;
                }

                if (precursorInFullMs != null)
                {
                    precursor.PrecursorIntensity = precursorInFullMs.Intensity;
                }

                result.Add(precursor);
            }

            var precursorMzs = from item in result
                               group item by item.PrecursorMZ into mzGroup
                               let mzcount = mzGroup.Where(m => m.PrecursorIntensity > 0).Count()
                                             orderby mzcount descending
                                             select mzGroup.Key;

            foreach (var mz in precursorMzs)
            {
                double mzPrecursorTolerance = PrecursorUtils.ppm2mz(mz, ppmPrecursorTolerance);
                foreach (var item in result)
                {
                    if (!item.IsIsotopic)
                    {
                        continue;
                    }

                    if (Math.Abs(item.PrecursorMZ - mz) <= mzPrecursorTolerance)
                    {
                        item.PrecursorMZ = mz;
                    }
                }
            }

            return(result);
        }
        public override IEnumerable <string> Process(string targetDir)
        {
            foreach (var raw in rawFiles)
            {
                List <RetentionTimePeak> waitingPeaks = new List <RetentionTimePeak>();
                foreach (var peak in targetPeaks)
                {
                    string file = GetTargetFile(targetDir, raw, peak);
                    if (force || !File.Exists(file))
                    {
                        waitingPeaks.Add(peak);
                    }
                }

                if (waitingPeaks.Count == 0)
                {
                    continue;
                }

                rawReader.Open(raw);
                try
                {
                    int firstScan = rawReader.GetFirstSpectrumNumber();
                    int lastScan  = rawReader.GetLastSpectrumNumber();

                    waitingPeaks.ForEach(m => m.Chromotographs.Clear());

                    for (int scan = firstScan; scan <= lastScan; scan++)
                    {
                        if (rawReader.GetMsLevel(scan) != 1)
                        {
                            continue;
                        }

                        if (Progress.IsCancellationPending())
                        {
                            throw new UserTerminatedException();
                        }

                        PeakList <Peak> pkl = rawReader.GetPeakList(scan);

                        double rt = rawReader.ScanToRetentionTime(scan);
                        var    st = new ScanTime(scan, rt);

                        foreach (var peak in waitingPeaks)
                        {
                            var env = pkl.FindEnvelopeDirectly(peak.PeakEnvelope, peak.MzTolerance, () => new Peak());
                            env.ScanTimes.Add(st);
                            peak.Chromotographs.Add(env);
                        }
                    }

                    waitingPeaks.ForEach(m => m.TrimPeaks());
                }
                finally
                {
                    rawReader.Close();
                }

                foreach (var peak in waitingPeaks)
                {
                    string file = GetTargetFile(targetDir, raw, peak);
                    new RetentionTimePeakXmlFormat().WriteToFile(file, peak);
                }
            }

            return(new string[] { targetDir });
        }