//Perdicted monoisotopic with 3 MS1 private MassSpectrum CalCorrectPrecursor(MassSpectrum currentMS2, MassSpectrum currentMS1Spec) { if (currentMS1Spec == null || currentMS2 == null) { return(currentMS2); } List <MassSpectrum> currentMS1 = new List <MassSpectrum>(); //Add current MS1 currentMS1.Add(currentMS1Spec); CurrentIndexInMS1 = MS1ScanNum.IndexOf(currentMS1Spec.ScanNumber); //Add current MS1 - 1 if (CurrentIndexInMS1 - 1 > 0) { MassSpectrum MS1spec = GetSpectrumByScanNum(MS1ScanNum[CurrentIndexInMS1 - 1]); currentMS1.Add(MS1spec); } //Add current MS1 + 1 if (CurrentIndexInMS1 + 1 < MS1ScanNum.Count) { MassSpectrum MS1spec = GetSpectrumByScanNum(MS1ScanNum[CurrentIndexInMS1 + 1]); currentMS1.Add(MS1spec); } ////Add current MS1 - 2 //if (CurrentIndexInMS1 - 2 > 0) //{ // MassSpectrum MS1spec = GetSpectrumByScanNum(MS1ScanNum[CurrentIndexInMS1 - 2]); // currentMS1.Add(MS1spec); //} ////Add current MS1 + 2 //if (CurrentIndexInMS1 + 2 < MS1ScanNum.Count) //{ // MassSpectrum MS1spec = GetSpectrumByScanNum(MS1ScanNum[CurrentIndexInMS1 + 2]); // currentMS1.Add(MS1spec); //} PrecursorCorrector pc = new PrecursorCorrector(); // set the precursor scan number for current spectrum; currentMS2.PrecursorScanNumber = currentMS1Spec.ScanNumber; // get the precursor m/z from the scan filter; double precMz = currentMS2.Precursors.Count == 0 ? 0 : currentMS2.Precursors[0].Item1; int precZ = currentMS2.Precursors.Count == 0 ? 0 : currentMS2.Precursors[0].Item2; pc.CorrectPrecursor(ref currentMS2, precMz, precZ, currentMS1Spec.ScanNumber, currentMS1); return(currentMS2); }
private void btPredict_Click(object sender, EventArgs e) { lbOutput.Items.Clear(); string[] lines = tbExportedSpectrum.Lines; // define the pattern for matching m/z lines; string mzLinePattern = @"\d+.\d+\t[ ]+\d+.\d+"; string valuePattern = @"\d+.\d+"; List <Ion> peakList = new List <Ion>(); for (int idx = 0; idx < lines.Length; idx++) { MatchCollection matches = Regex.Matches(lines[idx], mzLinePattern); if (matches.Count > 0) { matches = Regex.Matches(matches[0].Groups[0].Value, valuePattern); double mz = double.Parse(matches[0].Groups[0].Value); double h = double.Parse(matches[1].Groups[0].Value); peakList.Add(new Ion(mz, h)); } } // get the instrument designated precursor m/z and charge state; double precMz = double.Parse(lines[lines.Length - 2].Trim()); int precZ = int.Parse(lines[lines.Length - 1].Trim()); // predict the precursors; PrecursorCorrector pc = new PrecursorCorrector(); List <Envelope> envList = pc.FindEnvelopes(peakList, precMz, precZ); int counter = 0; foreach (Envelope env in envList) { lbOutput.Items.Add("Envelope " + (++counter) + ":"); lbOutput.Items.Add("\tm/z = " + env.MonoisotPeak.MZ + ", z = " + env.Charge); lbOutput.Items.Add("\tscore = " + env.Score); lbOutput.Items.Add(""); } }
public void Convert(TaskProgress progress) { MassSpectrum spec = null; bool isFirstScan = true; int currentMs1ScanNum = 0; bool isScanMS2 = false; List <MassSpectrum> tmpMS1 = new List <MassSpectrum>(); List <MassSpectrum> NeedToCorrectMS2 = new List <MassSpectrum>(); using (XmlReader reader = XmlReader.Create(_mzmlFile)) { reader.ReadToFollowing("mzML"); XmlSerializer serializer = new XmlSerializer(typeof(mzMLType)); //Reading mzML file to mzMLType class mzML = (mzMLType)serializer.Deserialize(reader); _scanCount = mzML.run.spectrumList.spectrum.Count(); for (int i = 0; i < _scanCount; i++) { int scanNum = System.Convert.ToInt32(mzML.run.spectrumList.spectrum[i].index.Replace("\"", "")); InstrumentType instType = InstrumentType.ELSE; string filter = ""; string refParGup = ""; double retentionTime = 0; int msLevel = 0; double lowMz = 0; double highMz = 0; double basePeakMz = 0; double basePeakIntensity = 0; double totIonCurrent = 0; double precursorMz = 0; int precursorCharge = 0; byte[] uncompressedMz = null; byte[] uncompressedIntensity = null; int shiftByte = 8; if (mzML.run.spectrumList.spectrum[i].referenceableParamGroupRef != null) { // get referenceableParamGroup refParGup = mzML.run.spectrumList.spectrum[i].referenceableParamGroupRef[0].@ref; // reference to referenceableParamGroup includes ms level, low MZ, High MZ, basePeak MZ and basePeak Intensity foreach (var refPargup in mzML.referenceableParamGroupList.referenceableParamGroup) { if (refPargup.id == refParGup) { foreach (var cvParm in refPargup.cvParam) { switch (cvParm.name) { case "ms level": msLevel = System.Convert.ToInt32(cvParm.value.Replace("\"", "")); break; case "lowest observed m/z": lowMz = System.Convert.ToDouble(cvParm.value.Replace("\"", "")); break; case "highest observed m/z": highMz = System.Convert.ToDouble(cvParm.value.Replace("\"", "")); break; case "base peak m/z": basePeakMz = System.Convert.ToDouble(cvParm.value.Replace("\"", "")); break; case "base peak intensity": basePeakIntensity = System.Convert.ToDouble(cvParm.value.Replace("\"", "")); break; case "total ion current": totIonCurrent = System.Convert.ToDouble(cvParm.value.Replace("\"", "")); break; } } } } } else { // if there is no referenceableParamGroupRef get parameters from spectrum's cvParam foreach (var cvParm in mzML.run.spectrumList.spectrum[i].cvParam) { switch (cvParm.name) { case "ms level": msLevel = System.Convert.ToInt32(cvParm.value.Replace("\"", "")); break; case "lowest observed m/z": lowMz = System.Convert.ToDouble(cvParm.value.Replace("\"", "")); break; case "highest observed m/z": highMz = System.Convert.ToDouble(cvParm.value.Replace("\"", "")); break; case "base peak m/z": basePeakMz = System.Convert.ToDouble(cvParm.value.Replace("\"", "")); break; case "base peak intensity": basePeakIntensity = System.Convert.ToDouble(cvParm.value.Replace("\"", "")); break; case "total ion current": totIonCurrent = System.Convert.ToDouble(cvParm.value.Replace("\"", "")); break; } } } foreach (var cvParm in mzML.run.spectrumList.spectrum[i].scanList.scan[0].cvParam) { switch (cvParm.name) { case "scan start time": //get retention Time retentionTime = System.Convert.ToDouble(cvParm.value.Replace("\"", "")); break; case "filter string": //get filter filter = cvParm.value.Replace("\"", ""); break; } } //set current MS1 if (msLevel == 1) { currentMs1ScanNum = scanNum; } //create a spectrum; spec = new MassSpectrum(scanNum, mzML.run.spectrumList.spectrum[i].index.Replace("\"", ""), retentionTime, new List <Ion>(), 0, instType, filter, 0, false); spec.MsLevel = msLevel; spec.LowMz = lowMz; spec.HighMz = highMz; spec.BasePeakMz = basePeakMz; spec.BasePeakIntensity = basePeakIntensity; spec.TotIonCurrent = totIonCurrent; spec.PrecursorScanNumber = currentMs1ScanNum; spec.Precursors = new List <Tuple <double, int> >(); //set MS2's precursor if (msLevel == 2) { spec.PrecursorScanNumber = currentMs1ScanNum; //get precursor foreach (var precursorData in mzML.run.spectrumList.spectrum[i].precursorList.precursor[0].selectedIonList.selectedIon[0].cvParam) { if (precursorData.name == "selected ion m/z") { precursorMz = System.Convert.ToDouble(precursorData.value.Replace("\"", "")); } if (precursorData.name == "charge state") { precursorCharge = System.Convert.ToInt32(precursorData.value.Replace("\"", "")); } } spec.Precursors.Add(new Tuple <double, int>(precursorMz, precursorCharge)); } // get peaks foreach (var data in mzML.run.spectrumList.spectrum[i].binaryDataArrayList.binaryDataArray) { bool mzArray = false; bool intensityArray = false; bool zlibCompression = false; foreach (var cvParm in data.cvParam) { switch (cvParm.name) { case "m/z array": mzArray = true; break; case "intensity array": intensityArray = true; break; case "zlib compression": zlibCompression = true; break; case "32-bit float": shiftByte = 4; break; } } if (mzArray) { if (zlibCompression) { //uncompression m/z uncompressedMz = Ionic.Zlib.ZlibStream.UncompressBuffer(data.binary); } else { uncompressedMz = data.binary; } } else if (intensityArray) { if (zlibCompression) { //uncompression intensity uncompressedIntensity = Ionic.Zlib.ZlibStream.UncompressBuffer(data.binary); } else { uncompressedIntensity = data.binary; } } } for (int byteIdx = 0; byteIdx < uncompressedMz.Length; byteIdx += shiftByte) { byte[] mzBytes = new byte[8]; Buffer.BlockCopy(uncompressedMz, byteIdx, mzBytes, 0, shiftByte); // retrieve the mz and intensity; double mz = BitConverter.ToDouble(mzBytes, 0); byte[] intBytes = new byte[8]; Buffer.BlockCopy(uncompressedIntensity, byteIdx, intBytes, 0, shiftByte); double intensity = BitConverter.ToDouble(intBytes, 0); spec.Peaks.Add(new Ion(mz, intensity)); } // Precursor Correct if (_correctPrecMz) { if (spec.MsLevel == 1) { if (isScanMS2) { List <MassSpectrum> currentMS1 = new List <MassSpectrum>(); currentMS1.AddRange(tmpMS1); currentMS1.Add(spec); for (int j = 0; j < NeedToCorrectMS2.Count; j++) { PrecursorCorrector pc = new PrecursorCorrector(); // get the precursor m/z from the scan filter; double precMz = NeedToCorrectMS2[j].Precursors.Count == 0 ? 0 : NeedToCorrectMS2[j].Precursors[0].Item1; int precZ = NeedToCorrectMS2[j].Precursors.Count == 0 ? 0 : NeedToCorrectMS2[j].Precursors[0].Item2; MassSpectrum currentMS2 = NeedToCorrectMS2[j]; pc.CorrectPrecursor(ref currentMS2, precMz, precZ, currentMS2.PrecursorScanNumber, currentMS1); WriteToOutFiles(currentMS2, isFirstScan); //clear variable in program if (j == (NeedToCorrectMS2.Count - 1)) { WriteToOutFiles(spec, isFirstScan); isScanMS2 = false; currentMS1.Clear(); NeedToCorrectMS2.Clear(); if (tmpMS1.Count() >= 2) { tmpMS1.RemoveAt(1); } tmpMS1.Insert(0, spec); } } } else { if (tmpMS1.Count() >= 2) { tmpMS1.RemoveAt(1); } tmpMS1.Insert(0, spec); } } else if (spec.MsLevel == 2) { NeedToCorrectMS2.Add(spec); isScanMS2 = true; } } else { WriteToOutFiles(spec, isFirstScan); } isFirstScan = false; _spectrumProcessed++; if (progress.Aborted) { break; } progress.CurrentProgress = (int)((double)_spectrumProcessed / _scanCount * 100); //Console.WriteLine(_spectrumProcessed + "\t" + progress.CurrentProgress); if (progress.CurrentProgress > _lastProgress) { _lastProgress = progress.CurrentProgress; int currentLineCursor = Console.CursorTop; Console.SetCursorPosition(0, Console.CursorTop); Console.Write(" Reading mzML File: " + _lastProgress + "%"); Console.SetCursorPosition(0, currentLineCursor); } } } }