/** * 循环搜索,直到出现第一个重复的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"); }
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); } }
//计算窗口间的重叠区域的大小 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); }
//提取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"); }
//处理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); } }
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; } }
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); } }