예제 #1
0
        private bool AcceptScan(SilacPeakListPair pair, SilacCompoundInfo sci, int lightMaxIndex, double lightMinPPM, double lightMaxPPM, int heavyMaxIndex, double heavyMinPPM, double heavyMaxPPM)
        {
            //如果轻重标中任意一个最高峰不存在,循环结束。
            if (pair.Light[lightMaxIndex].Intensity == 0 || pair.Heavy[heavyMaxIndex].Intensity == 0)
            {
                return(false);
            }

            //轻标最高峰的ppm
            double lightPPM = PrecursorUtils.mz2ppm(pair.Light[lightMaxIndex].Mz, sci.Light.Profile[lightMaxIndex].Mz - pair.Light[lightMaxIndex].Mz);

            if (lightPPM < lightMinPPM || lightPPM > lightMaxPPM)
            {
                return(false);
            }

            //重标最高峰的ppm
            double heavyPPM = PrecursorUtils.mz2ppm(pair.Heavy[heavyMaxIndex].Mz, sci.Heavy.Profile[heavyMaxIndex].Mz - pair.Heavy[heavyMaxIndex].Mz);

            if (heavyPPM < heavyMinPPM || heavyPPM > heavyMaxPPM)
            {
                return(false);
            }

            return(true);
        }
예제 #2
0
        private SilacCompoundInfo GetSilacCompoundInfo(IPeptideInfo peptideInfo)
        {
            SilacCompoundInfo sci = _sciBuilder.Build(peptideInfo);

            sci.Light.Profile = profileBuilder.GetProfile(sci.Light.Composition, sci.Light.Charge, 0.0001);
            sci.Heavy.Profile = profileBuilder.GetProfile(sci.Heavy.Composition, sci.Heavy.Charge, 0.0001);
            return(sci);
        }
예제 #3
0
        private List <string> GetIdentifiedSpectrumKey(IIdentifiedSpectrum spectrum, SilacCompoundInfo sci)
        {
            int theoreticalMass = (int)(sci.Light.Mz * sci.Light.Charge + 0.5);
            int charge          = spectrum.Charge;

            List <string> keys = new List <string>();

            foreach (IIdentifiedPeptide peptide in spectrum.Peptides)
            {
                string sequenceCharge = PeptideUtils.GetPureSequence(peptide.Sequence) + "." + charge + "." + theoreticalMass;
                keys.Add(sequenceCharge);
            }
            return(keys);
        }
예제 #4
0
        private SilacPeakListPair GetLightHeavyPeakList(IRawFile rawFile, SilacCompoundInfo sci, int maxIndex, double mzTolerance, int scan, bool force = false)
        {
            PeakList <Peak> pkl = rawFile.GetPeakList(scan);

            if (pkl.Count == 0)
            {
                return(null);
            }

            var scantime = new ScanTime(scan, rawFile.ScanToRetentionTime(scan));

            PeakList <Peak> light = pkl.FindEnvelopeDirectly(sci.Light.Profile, option.ProfileLength, mzTolerance, () => new Peak());

            //如果电荷不对,则认为该scan无效。
            if (!CheckPeakListCharge(light, maxIndex, sci.Light.Charge) && !force)
            {
                return(null);
            }

            PeakList <Peak> heavy = pkl.FindEnvelopeDirectly(sci.Heavy.Profile, option.ProfileLength, mzTolerance, () => new Peak());

            //如果电荷不对,则认为该scan无效。
            if (!CheckPeakListCharge(heavy, maxIndex, sci.Heavy.Charge) && !force)
            {
                return(null);
            }

            //如果轻或者重的总强度为0,则认为该scan无效。
            if ((0 == light.Sum(m => m.Intensity) || 0 == heavy.Sum(m => m.Intensity)) && !force)
            {
                return(null);
            }

            light.ScanTimes.Add(scantime);
            heavy.ScanTimes.Add(scantime);

            return(new SilacPeakListPair(light, heavy));
        }
예제 #5
0
        public void Quantify(string rawFileName, List <IIdentifiedSpectrum> spectra, string detailDir)
        {
            if (!Directory.Exists(detailDir))
            {
                Directory.CreateDirectory(detailDir);
            }

            var experimental = RawFileFactory.GetExperimental(rawFileName);

            Dictionary <string, DifferentRetentionTimeEnvelopes> spectrumKeyMap = new Dictionary <string, DifferentRetentionTimeEnvelopes>();

            Dictionary <SilacEnvelopes, List <IIdentifiedSpectrum> > envelopeSpectrumGroup = new Dictionary <SilacEnvelopes, List <IIdentifiedSpectrum> >();

            double precursorPPM = GetPrecursorPPM(spectra);

            try
            {
                _rawReader.Open(rawFileName);

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

                Progress.SetRange(1, spectra.Count);
                int pepCount = 0;

                for (int s = 0; s < spectra.Count; s++)
                {
                    Console.WriteLine(s);
                    IIdentifiedSpectrum spectrum = spectra[s];

                    SilacQuantificationSummaryItem.ClearAnnotation(spectrum);

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

                    int startScan = spectrum.Query.FileScan.FirstScan;
                    if (startScan > lastScanNumber)
                    {
                        spectrum.GetOrCreateQuantificationItem().RatioStr = "OUT_OF_RANGE";
                        continue;
                    }

                    Progress.SetPosition(pepCount++);

                    IIdentifiedPeptide sp = spectrum.Peptide;

                    string seq = GetMatchSequence(spectrum);

                    IPeptideInfo peptideInfo = new IdentifiedPeptideInfo(seq, spectrum.TheoreticalMH, spectrum.Query.Charge);

                    SilacCompoundInfo sci = GetSilacCompoundInfo(peptideInfo);

                    //如果轻重离子理论质荷比一样,忽略
                    if (!sci.IsSilacData())
                    {
                        spectrum.GetOrCreateQuantificationItem().RatioStr = "NOT_SILAC";
                        continue;
                    }

                    //如果轻重离子理论质荷比与观测值不一致,忽略
                    if (!sci.IsMzEquals(spectrum.ObservedMz, MAX_DELTA_MZ))
                    {
                        ValidateModifications(seq);

                        spectrum.GetOrCreateQuantificationItem().RatioStr = "WRONG_IDENTIFICATION";
                        continue;
                    }

                    //如果没有找到相应的FullScan,忽略
                    int identifiedFullScan = _rawReader.FindPreviousFullScan(startScan, firstScanNumber);
                    if (-1 == identifiedFullScan)
                    {
                        spectrum.GetOrCreateQuantificationItem().RatioStr = "NO_PROFILE";
                        continue;
                    }

                    DifferentRetentionTimeEnvelopes pkls = FindEnvelopes(spectrumKeyMap, spectrum, sci);

                    SilacEnvelopes envelope = pkls.FindSilacEnvelope(identifiedFullScan);

                    //如果该scan被包含在已经被定量的结果中,忽略
                    if (envelope != null)
                    {
                        envelope.SetScanIdentified(identifiedFullScan, spectrum.IsExtendedIdentification());
                        envelopeSpectrumGroup[envelope].Add(spectrum);
                        continue;
                    }

                    //从原始文件中找出该spectrum的定量信息
                    int maxIndex = Math.Min(option.ProfileLength - 1, pkls.LightProfile.FindMaxIndex());

                    double mzTolerance = PrecursorUtils.ppm2mz(sci.Light.Mz, option.PPMTolerance);

                    //如果FullScan没有相应的离子,忽略。(鉴定错误或者扩展定量时候,会出现找不到pair的现象)
                    SilacPeakListPair splp = GetLightHeavyPeakList(_rawReader, sci, maxIndex, mzTolerance, identifiedFullScan);
                    if (null == splp)
                    {
                        spectrum.GetOrCreateQuantificationItem().RatioStr = "NO_PROFILE";
                        continue;
                    }

                    splp.IsIdentified             = true;
                    splp.IsExtendedIdentification = spectrum.IsExtendedIdentification();

                    SilacEnvelopes envelopes = new SilacEnvelopes();
                    envelopes.Add(splp);

                    //向前查找定量信息
                    int fullScan   = identifiedFullScan;
                    int scanNumber = 0;
                    while ((fullScan = _rawReader.FindPreviousFullScan(fullScan - 1, firstScanNumber)) != -1)
                    {
                        if (_rawReader.IsBadDataScan(fullScan))
                        {
                            continue;
                        }
                        scanNumber++;
                        var item = GetLightHeavyPeakList(_rawReader, sci, maxIndex, mzTolerance, fullScan, scanNumber <= MinScanNumber);
                        if (null == item)
                        {
                            break;
                        }

                        envelopes.Add(item);
                    }
                    envelopes.Reverse();

                    //向后查找定量信息
                    fullScan   = identifiedFullScan;
                    scanNumber = 0;
                    while ((fullScan = _rawReader.FindNextFullScan(fullScan + 1, lastScanNumber)) != -1)
                    {
                        if (_rawReader.IsBadDataScan(fullScan))
                        {
                            continue;
                        }
                        scanNumber++;
                        var item = GetLightHeavyPeakList(_rawReader, sci, maxIndex, mzTolerance, fullScan, scanNumber <= MinScanNumber);
                        if (null == item)
                        {
                            break;
                        }

                        envelopes.Add(item);
                    }

                    //对每个scan计算轻重的离子丰度
                    envelopes.ForEach(m => m.CalculateIntensity(pkls.LightProfile, pkls.HeavyProfile));

                    pkls.Add(envelopes);

                    envelopeSpectrumGroup.Add(envelopes, new List <IIdentifiedSpectrum>());
                    envelopeSpectrumGroup[envelopes].Add(spectrum);
                }
            }
            finally
            {
                _rawReader.Close();
            }

            foreach (string key in spectrumKeyMap.Keys)
            {
                DifferentRetentionTimeEnvelopes pkls = spectrumKeyMap[key];

                foreach (SilacEnvelopes envelopes in pkls)
                {
                    if (0 == envelopes.Count)
                    {
                        continue;
                    }

                    List <IIdentifiedSpectrum> mps = envelopeSpectrumGroup[envelopes];

                    double mzTolerance = PrecursorUtils.ppm2mz(mps[0].Query.ObservedMz, option.PPMTolerance);

                    string scanStr = GetScanRange(envelopes);

                    string resultFilename = detailDir + "\\" + mps[0].Query.FileScan.Experimental + "." + PeptideUtils.GetPureSequence(mps[0].Sequence) + "." + mps[0].Query.Charge + scanStr + ".silac";

                    IPeptideInfo      peptideInfo = new IdentifiedPeptideInfo(mps[0].GetMatchSequence(), mps[0].TheoreticalMH, mps[0].Query.Charge);
                    SilacCompoundInfo sci         = GetSilacCompoundInfo(peptideInfo);

                    SilacQuantificationSummaryItem item = new SilacQuantificationSummaryItem(sci.Light.IsSample);
                    item.RawFilename          = rawFileName;
                    item.SoftwareVersion      = this.SoftwareVersion;
                    item.PeptideSequence      = mps[0].Sequence;
                    item.Charge               = mps[0].Charge;
                    item.LightAtomComposition = sci.Light.Composition.ToString();
                    item.HeavyAtomComposition = sci.Heavy.Composition.ToString();
                    item.LightProfile         = pkls.LightProfile;
                    item.HeavyProfile         = pkls.HeavyProfile;
                    item.ObservedEnvelopes    = envelopes;

                    item.ValidateScans(sci, precursorPPM);

                    item.Smoothing();
                    item.CalculateRatio();

                    new SilacQuantificationSummaryItemXmlFormat().WriteToFile(resultFilename, item);

                    int maxScoreItemIndex = FindMaxScoreItemIndex(mps);

                    for (int i = 0; i < mps.Count; i++)
                    {
                        if (maxScoreItemIndex == i)
                        {
                            item.AssignToAnnotation(mps[i], resultFilename);
                        }
                        else
                        {
                            item.AssignDuplicationToAnnotation(mps[i], resultFilename);
                        }
                    }
                }
            }

            foreach (IIdentifiedSpectrum mph in spectra)
            {
                mph.InitializeRatioEnabled();
            }
        }
예제 #6
0
        private DifferentRetentionTimeEnvelopes FindEnvelopes(Dictionary <string, DifferentRetentionTimeEnvelopes> peptideChargeMap, IIdentifiedSpectrum spectrum, SilacCompoundInfo sci)
        {
            var keys = GetIdentifiedSpectrumKey(spectrum, sci);

            DifferentRetentionTimeEnvelopes result = null;

            foreach (string key in keys)
            {
                if (peptideChargeMap.ContainsKey(key))
                {
                    result = peptideChargeMap[key];
                    break;
                }
            }

            if (result == null)
            {
                result = new DifferentRetentionTimeEnvelopes();
                result.LightProfile = sci.Light.Profile;
                result.HeavyProfile = sci.Heavy.Profile;
            }

            foreach (string key in keys)
            {
                if (!peptideChargeMap.ContainsKey(key))
                {
                    peptideChargeMap.Add(key, result);
                }
            }

            return(result);
        }
예제 #7
0
        public void ValidateScans(SilacCompoundInfo sci, double ppmTolerance)
        {
            int lightMaxIndex = LightProfile.FindMaxIndex();
            int heavyMaxIndex = HeavyProfile.FindMaxIndex();

            var identified = ObservedEnvelopes.FindAll(m => m.IsIdentified);

            int minIdentifiedScan = identified.Min(m => m.Scan);
            int maxIdentifiedScan = identified.Max(m => m.Scan);

            ObservedEnvelopes.ForEach(m => m.Enabled = m.Scan >= minIdentifiedScan && m.Scan <= maxIdentifiedScan);

            int enabledCount = ObservedEnvelopes.FindAll(m => m.Enabled).Count;

            if (enabledCount < 5)
            {
                int preEnabled = (5 - enabledCount) / 2;
                if (preEnabled == 0)
                {
                    preEnabled = 1;
                }
                int postEnabled = 5 - enabledCount - preEnabled;

                int first = ObservedEnvelopes.FindIndex(m => m.Enabled);
                for (int i = first - 1; i >= 0 && i >= first - preEnabled; i--)
                {
                    ObservedEnvelopes[i].Enabled = true;
                }

                int last = ObservedEnvelopes.FindLastIndex(m => m.Enabled);
                for (int i = last + 1; i < ObservedEnvelopes.Count && i <= last + postEnabled; i++)
                {
                    ObservedEnvelopes[i].Enabled = true;
                }
            }

            var enabled = ObservedEnvelopes.FindAll(m => m.Enabled);

            var lightAccumulator = new MeanStandardDeviation(from ob in enabled
                                                             let ppm = PrecursorUtils.mz2ppm(sci.Light.Profile[lightMaxIndex].Mz, sci.Light.Profile[lightMaxIndex].Mz - ob.Light[lightMaxIndex].Mz)
                                                                       select ppm);

            var heavyAccumulator = new MeanStandardDeviation(from ob in enabled
                                                             let ppm = PrecursorUtils.mz2ppm(sci.Heavy.Profile[heavyMaxIndex].Mz, sci.Heavy.Profile[heavyMaxIndex].Mz - ob.Heavy[heavyMaxIndex].Mz)
                                                                       select ppm);

            double lightPPM = Math.Max(ppmTolerance, lightAccumulator.StdDev * 3);
            double heavyPPM = Math.Max(ppmTolerance, heavyAccumulator.StdDev * 3);

            var lightMinPPM = lightAccumulator.Mean - lightPPM;
            var lightMaxPPM = lightAccumulator.Mean + lightPPM;
            var heavyMinPPM = heavyAccumulator.Mean - heavyPPM;
            var heavyMaxPPM = heavyAccumulator.Mean + heavyPPM;

            int fixedIndex = ObservedEnvelopes.FindIndex(m => m.IsIdentified);

            for (int i = fixedIndex; i >= 0; i--)
            {
                var pair = ObservedEnvelopes[i];
                if (pair.Enabled)
                {
                    continue;
                }

                if (!AcceptScan(pair, sci, lightMaxIndex, lightMinPPM, lightMaxPPM, heavyMaxIndex, heavyMinPPM, heavyMaxPPM))
                {
                    break;
                }

                pair.Enabled = true;
            }

            for (int i = fixedIndex; i < ObservedEnvelopes.Count; i++)
            {
                var pair = ObservedEnvelopes[i];
                if (pair.Enabled)
                {
                    continue;
                }

                if (!AcceptScan(pair, sci, lightMaxIndex, lightMinPPM, lightMaxPPM, heavyMaxIndex, heavyMinPPM, heavyMaxPPM))
                {
                    break;
                }

                pair.Enabled = true;
            }
        }