Beispiel #1
0
        /**
         * 循环搜索,直到出现第一个重复的MS窗口停止
         * 即便这样,如果在第一轮扫描中没有出现的窗口是无法被初始化的,需要在后续不断的作补充
         *
         */
        private void buildWindowsRanges()
        {
            jobInfo.log("Start getting windows", "Getting Windows");
            int      i        = 0;
            Spectrum spectrum = spectrumList.spectrum(0);

            while (spectrum.cvParamChild(CVID.MS_ms_level).value.ToString().Equals(MsLevel.MS2))
            {
                double mz          = getPrecursorIsolationWindowParams(spectrum, CVID.MS_isolation_window_target_m_z);
                double lowerOffset = getPrecursorIsolationWindowParams(spectrum, CVID.MS_isolation_window_lower_offset);
                double upperOffset = getPrecursorIsolationWindowParams(spectrum, CVID.MS_isolation_window_upper_offset);

                if (rangeMap.Contains(mz))
                {
                    break;
                }

                WindowRange range      = new WindowRange(mz - lowerOffset, mz + upperOffset, mz);
                BlockIndex  swathIndex = new BlockIndex();
                swathIndex.setWindowRange(range);
                rangeMap.Add(mz, swathIndex);
                ms2Map.Add(mz, ArrayList.Synchronized(new ArrayList()));

                i++;
                spectrum = spectrumList.spectrum(i);
            }
            jobInfo.log("Finished Getting Windows");
        }
Beispiel #2
0
        private void parseAndStoreMS2Block()
        {
            jobInfo.log("Start Processing MS2 List");
            IZDPD izdpd;

            if (jobInfo.jobParams.useStackZDPD())
            {
                izdpd = new StackZDPD(this);
            }
            else
            {
                izdpd = new ZDPD(this);
            }

            foreach (double key in ms2Table.Keys)
            {
                List <TempIndex> tempIndexList = ms2Table[key] as List <TempIndex>;
                WindowRange      range         = rangeTable[key] as WindowRange;
                //为每一个key组创建一个SwathBlock
                BlockIndex index = new BlockIndex();
                index.level    = 2;
                index.startPtr = startPosition;
                index.setWindowRange(range);

                jobInfo.log(null, "MS2:" + progress + "/" + ms2Table.Keys.Count);
                progress++;
                izdpd.compressMS2(tempIndexList, index);
                index.endPtr = startPosition;
                indexList.Add(index);
                jobInfo.log("MS2 Group Finished:" + progress + "/" + ms2Table.Keys.Count);
            }
        }
Beispiel #3
0
        //计算窗口间的重叠区域的大小
        private void computeOverlap()
        {
            WindowRange range1      = ranges[0];
            double      range1Right = range1.end;
            WindowRange range2      = ranges[1];
            double      range2Left  = range2.start;

            overlap = range1Right - range2Left;
            featuresMap.Add(Features.overlap, overlap);
        }
Beispiel #4
0
        //提取SWATH 窗口信息
        private void buildWindowsRanges()
        {
            jobInfo.log("Start getting windows", "Getting Windows");
            int           i      = 0;
            List <Double> mzList = new List <Double>();

            //找到第一张MS1图,如果找不到,则继续往下搜索,如果搜索了500张以上的谱图或者搜索了超过一半的谱图都没有MS1图,则认为数据格式有问题
            Spectrum spectrum = spectrumList.spectrum(0);

            while (!spectrum.cvParamChild(CVID.MS_ms_level).value.ToString().Equals(MsLevel.MS1))
            {
                i++;
                spectrum = spectrumList.spectrum(i);
                if (i > spectrumList.size() / 2 || i > 500)
                {
                    //如果找了一半的spectrum或者找了超过500个spectrum仍然没有找到ms1,那么数据格式有问题,返回空;
                    jobInfo.logError("Search for more than 500 spectrums and no ms1 was found. File Format Error");
                    throw new Exception("Search for more than 500 spectrums and no ms1 was found. File Format Error");
                }
            }

            while (true)
            {
                if (spectrum.cvParamChild(CVID.MS_ms_level).value.ToString().Equals(MsLevel.MS1))
                {
                    ms1Size++;
                    i++;
                    spectrum = spectrumList.spectrum(i);
                    continue;
                }

                double mz, lowerOffset, upperOffset;
                mz = getPrecursorIsolationWindowParams(spectrum, CVID.MS_isolation_window_target_m_z);
                if (mzList.Contains(mz))
                {
                    break;
                }

                mzList.Add(mz);
                lowerOffset = getPrecursorIsolationWindowParams(spectrum, CVID.MS_isolation_window_lower_offset);
                upperOffset = getPrecursorIsolationWindowParams(spectrum, CVID.MS_isolation_window_upper_offset);
                WindowRange range    = new WindowRange(mz - lowerOffset, mz + upperOffset, mz);
                Hashtable   features = new Hashtable();
                features.Add(Features.original_width, lowerOffset + upperOffset);
                features.Add(Features.original_precursor_mz_start, mz - lowerOffset);
                features.Add(Features.original_precursor_mz_end, mz + upperOffset);
                range.features = FeaturesUtil.toString(features);
                ranges.Add(range);
                i++;
                spectrum = spectrumList.spectrum(i);
            }

            jobInfo.log("Finished Getting Windows");
        }
Beispiel #5
0
        //处理MS2,由于每一个MS1只跟随少量的MS2光谱图,因此DDA采集模式下MS2的压缩模式仍然使用Aird ZDPD的压缩算法
        private void doWithMS2Block()
        {
            jobInfo.log("Start Processing MS2 List");
            ArrayList keys = new ArrayList(ms2Table.Keys);

            keys.Sort();
            foreach (int key in keys)
            {
                List <TempIndex> tempIndexList = ms2Table[key] as List <TempIndex>;
                //为每一组key创建一个Block
                BlockIndex blockIndex = new BlockIndex();
                blockIndex.level    = 2;
                blockIndex.startPtr = startPosition;
                blockIndex.num      = key;
                //创建这一个block中每一个ms2的窗口序列
                List <WindowRange> ms2Ranges = new List <WindowRange>();
                jobInfo.log(null, "MS2:" + progress + "/" + ms2Table.Keys.Count);
                progress++;

                foreach (TempIndex index in tempIndexList)
                {
                    WindowRange range = new WindowRange(index.mzStart, index.mzEnd, index.mz);
                    if (index.charge != 0)
                    {
                        range.charge = index.charge;
                    }
                    ms2Ranges.Add(range);
                    TempScan ts = new TempScan(index.num, index.rt, index.tic);
                    if (jobInfo.jobParams.includeCV)
                    {
                        ts.cvs = index.cvList;
                    }
                    compress(spectrumList.spectrum(index.num, true), ts);
                    blockIndex.nums.Add(ts.num);
                    blockIndex.rts.Add(ts.rt);
                    blockIndex.tics.Add(ts.tic);
                    if (jobInfo.jobParams.includeCV)
                    {
                        blockIndex.cvList.Add(ts.cvs);
                    }
                    blockIndex.mzs.Add(ts.mzArrayBytes.Length);
                    blockIndex.ints.Add(ts.intArrayBytes.Length);
                    startPosition = startPosition + ts.mzArrayBytes.Length + ts.intArrayBytes.Length;
                    airdStream.Write(ts.mzArrayBytes, 0, ts.mzArrayBytes.Length);
                    airdStream.Write(ts.intArrayBytes, 0, ts.intArrayBytes.Length);
                }

                blockIndex.rangeList = ms2Ranges;
                blockIndex.endPtr    = startPosition;
                indexList.Add(blockIndex);
            }
        }
Beispiel #6
0
        private void scan(int i)
        {
            Spectrum spectrum = spectrumList.spectrum(i, true);

            //忽略所有MS1的谱图
            if (spectrum.cvParamChild(CVID.MS_ms_level).value.ToString().Equals(MsLevel.MS1))
            {
                return;
            }
            double    targetMz = getPrecursorIsolationWindowParams(spectrum, CVID.MS_isolation_window_target_m_z);
            ArrayList ms2List  = null;

            if (rangeMap.Contains(targetMz))
            {
                ms2List = (ArrayList)ms2Map[targetMz];
            }
            else
            {
                double mz          = getPrecursorIsolationWindowParams(spectrum, CVID.MS_isolation_window_target_m_z);
                double lowerOffset = getPrecursorIsolationWindowParams(spectrum, CVID.MS_isolation_window_lower_offset);
                double upperOffset = getPrecursorIsolationWindowParams(spectrum, CVID.MS_isolation_window_upper_offset);

                WindowRange range    = new WindowRange(mz - lowerOffset, mz + upperOffset, mz);
                BlockIndex  addIndex = new BlockIndex();
                addIndex.setWindowRange(range);
                rangeMap.Add(targetMz, addIndex);
                ms2Map.Add(targetMz, ArrayList.Synchronized(new ArrayList()));
                ms2List = (ArrayList)ms2Map[targetMz];
            }

            if (spectrum.scanList.scans.Count != 1)
            {
                return;
            }
            try
            {
                TempScan ts = new TempScan(i, parseRT(spectrum.scanList.scans[0]), parseTIC(spectrum));
                if (jobInfo.jobParams.includeCV)
                {
                    ts.cvs = CV.trans(spectrum);
                }
                compress(spectrum, ts);
                ms2List.Add(ts);
            }
            catch (Exception exception)
            {
                jobInfo.log(exception.Message);
                return;
            }
        }
Beispiel #7
0
        private void parseAndStoreMS2Block()
        {
            jobInfo.log("Start Processing MS2 List");
            foreach (double key in ms2Table.Keys)
            {
                List <TempIndex> tempIndexList = ms2Table[key] as List <TempIndex>;
                //为每一个key组创建一个SwathBlock
                BlockIndex swathIndex = new BlockIndex();
                swathIndex.level    = 2;
                swathIndex.startPtr = startPosition;

                //顺便创建一个WindowRanges,用以让Propro服务端快速获取全局的窗口数目和mz区间
                WindowRange range = new WindowRange(tempIndexList[0].mzStart, tempIndexList[0].mzEnd, key);
                swathIndex.setWindowRange(range);
                ranges.Add(range);

                jobInfo.log(null, "MS2:" + progress + "/" + ms2Table.Keys.Count);
                progress++;

                if (jobInfo.jobParams.threadAccelerate)
                {
                    Hashtable table = Hashtable.Synchronized(new Hashtable());
                    //使用多线程处理数据提取与压缩
                    Parallel.For(0, tempIndexList.Count, (i, ParallelLoopState) =>
                    {
                        TempIndex index = tempIndexList[i];
                        TempScan ts     = new TempScan(index.num, index.rt, index.tic);
                        compress(spectrumList.spectrum(index.num, true), ts);
                        table.Add(i, ts);
                    });

                    outputWithOrder(table, swathIndex);
                }
                else
                {
                    foreach (TempIndex index in tempIndexList)
                    {
                        TempScan ts = new TempScan(index.pNum, index.rt, index.tic);
                        compress(spectrumList.spectrum(index.num, true), ts);
                        addToIndex(swathIndex, ts);
                    }
                }

                swathIndex.endPtr = startPosition;
                indexList.Add(swathIndex);
                jobInfo.log("MS2 Group Finished:" + progress + "/" + ms2Table.Keys.Count);
            }
        }