//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("");
            }
        }
Example #3
0
        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);
                    }
                }
            }
        }